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

field.c (1645463B)


      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  * File:        field.c
      8  * Purpose:     Field Processor module routines specific to BCM56960
      9  */
     10 
     11 #include <shared/bsl.h>
     12 #include <soc/defs.h>
     13 #if defined(BCM_TOMAHAWK_SUPPORT) && defined(BCM_FIELD_SUPPORT)
     14 #include <soc/drv.h>
     15 #include <soc/scache.h>
     16 #include <soc/trident2.h>
     17 #include <soc/tomahawk.h>
     18 #include <soc/format.h>
     19 
     20 #include <bcm/error.h>
     21 #include <bcm/l3.h>
     22 #include <bcm/field.h>
     23 #include <bcm/tunnel.h>
     24 #include <bcm/stat.h>
     25 #include <shared/bsl.h>
     26 
     27 #include <bcm_int/common/multicast.h>
     28 #include <bcm_int/esw_dispatch.h>
     29 #include <bcm_int/esw/field.h>
     30 #include <bcm_int/esw/l3.h>
     31 #include <bcm_int/esw/nat.h>
     32 #include <bcm_int/esw/policer.h>
     33 #include <bcm_int/esw/trx.h>
     34 #include <bcm_int/esw/triumph.h>
     35 #include <bcm_int/esw/trident.h>
     36 #include <bcm_int/esw/trident2.h>
     37 #include <bcm_int/esw/tomahawk.h>
     38 #include <bcm_int/esw/tomahawk3.h>
     39 #include <bcm_int/esw/mirror.h>
     40 #include <bcm_int/esw/trunk.h>
     41 #include <bcm_int/esw/xgs4.h>
     42 #include <bcm_int/esw/range.h>
     43 #include <bcm_int/esw/virtual.h>
     44 #if defined(BCM_TRIDENT3_SUPPORT)
     45 #include <bcm_int/esw/trident3.h>
     46 #include <bcm_int/esw/udf.h>
     47 #endif
     48 #if defined(BCM_TOMAHAWK2_SUPPORT)
     49 #include <soc/tomahawk2.h>
     50 #endif
     51 #if defined(BCM_TOMAHAWK3_SUPPORT)
     52 #include <soc/tomahawk3.h>
     53 #endif
     54 #if defined(BCM_HELIX5_SUPPORT)
     55 #include <bcm_int/esw/helix5.h>
     56 #endif
     57 #include <soc/esw/cancun.h>
     58 
     59 #ifndef ALIGN32
     60 #define ALIGN32(x)      (((x) + 31) & ~31)
     61 #endif
     62 
     63 #ifndef BIT
     64 #define BIT(n)          (1U << (n))
     65 #endif
     66 
     67 static char *action_name[bcmFieldActionCount] = BCM_FIELD_ACTION_STRINGS;
     68 
     69 /* IFP_TCAM modes */
     70 #define _IFP_SLICE_MODE_NARROW  0    /* 80-bit Mode  */
     71 #define _IFP_SLICE_MODE_WIDE    1    /* 160-bit Mode */
     72 #define _FP_LT_ID_BASE 0
     73 #define _FP_LT_ID_MAX (0x1F)
     74 
     75 /* IFP meter types */
     76 #define _FIELD_METER_TYPE_EVEN 0x1
     77 #define _FIELD_METER_TYPE_ODD  0x2
     78 
     79 /* Valid PortBitmap */
     80 #define _BCM_FIELD_VALID_PIPE_PBMP_GET(_unit_, _inst_, _pbm_)                  \
     81         {                                                                      \
     82            int _ct_;                                                           \
     83            int _min_p_, _max_p_;                                               \
     84            if (_inst_ == _BCM_FIELD_GLOBAL_GROUP) {                            \
     85              _max_p_ = (_FP_MAX_NUM_PIPES * _FP_TCAM_IPBMP_SIZE(_unit_));      \
     86              _min_p_ = 0;                                                      \
     87            } else {                                                            \
     88              _max_p_ = ((_inst_ + 1) * _FP_TCAM_IPBMP_SIZE(_unit_));           \
     89              _min_p_ = (_inst_ * _FP_TCAM_IPBMP_SIZE(_unit_));                 \
     90            }                                                                   \
     91            for (_ct_ = _min_p_; _ct_ < _max_p_; _ct_++) {                      \
     92               BCM_PBMP_PORT_ADD(_pbm_, _ct_);                                  \
     93            }                                                                   \
     94         }
     95 
     96 #define _UDF_CHUNK_WIDTH_ 16
     97 
     98 #define _FIELD_UDF_START_CHUNK_OFFSET_GET(_chunk1_, _chunk2_)          do {                       \
     99              start_second_chunk = 0;                                                        \
    100              if ((NULL != qset) && (SHR_BITGET(qset->udf_map, _chunk1_))                   \
    101                                 && (SHR_BITGET(qset->udf_map, _chunk2_))) {                   \
    102                 if ((0 == (chunk_bmap & (1 << _chunk1_))) && ((chunk_bmap & (1 << _chunk2_)))) { \
    103                     start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_);             \
    104                     start_width = (_UDF_CHUNK_WIDTH_) - start_bit;                          \
    105                     start_second_chunk = 1;                                                 \
    106                 } else if ((chunk_bmap & (1 << _chunk1_)) && (0 == (chunk_bmap & (1 << _chunk2_)))) { \
    107                     start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_);             \
    108                     start_bit = _UDF_CHUNK_WIDTH_ + start_bit;                              \
    109                     start_second_chunk = 1;                                                 \
    110                 } else {                                                                    \
    111                     start_bit = hint_node->hint->start_bit%(2 * _UDF_CHUNK_WIDTH_);         \
    112                     start_width = (2 * _UDF_CHUNK_WIDTH_) - start_bit;                      \
    113                 }                                                                           \
    114              } else {                                                                       \
    115                 if ((0 == (chunk_bmap & (1 << _chunk1_))) && ((chunk_bmap & (1 << _chunk2_)))) { \
    116                     start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_);             \
    117                     start_width = (_UDF_CHUNK_WIDTH_) - start_bit;                          \
    118                 } else if ((chunk_bmap & (1 << _chunk1_)) && (0 == (chunk_bmap & (1 << _chunk2_)))) { \
    119                     start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_);             \
    120                     start_bit = _UDF_CHUNK_WIDTH_ + start_bit;                              \
    121                     start_width = (2 * _UDF_CHUNK_WIDTH_) - start_bit;                      \
    122                 } else {                                                                    \
    123                     start_bit = hint_node->hint->start_bit%(2 * _UDF_CHUNK_WIDTH_);         \
    124                     start_width = (2 * _UDF_CHUNK_WIDTH_) - start_bit;                      \
    125                 }                                                                           \
    126              }                                                                              \
    127           } while(0);
    128 
    129 #define _FIELD_UDF_END_CHUNK_OFFSET_GET(_chunk1_, _chunk2_)      do {                       \
    130              end_second_chunk = 0;                                                          \
    131              if ((NULL != qset) && (SHR_BITGET(qset->udf_map, _chunk1_))                   \
    132                                 && (SHR_BITGET(qset->udf_map, _chunk2_))) {                   \
    133                 if ((0 == (chunk_bmap & (1 << _chunk1_))) && ((chunk_bmap & (1 << _chunk2_)))) { \
    134                     end_bit = 0;                                                            \
    135                     end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_);               \
    136                     end_second_chunk = 1;                                                   \
    137                 } else if ((chunk_bmap & (1 << _chunk1_)) && (0 == (chunk_bmap & (1 << _chunk2_)))) { \
    138                     end_bit = _UDF_CHUNK_WIDTH_;                                            \
    139                     end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_);               \
    140                     end_width = end_width + _UDF_CHUNK_WIDTH_;                              \
    141                     end_second_chunk = 1;                                                   \
    142                 } else {                                                                    \
    143                     end_bit = 0;                                                            \
    144                     end_width = hint_node->hint->end_bit%(2 * _UDF_CHUNK_WIDTH_);           \
    145                 }                                                                           \
    146              } else {                   \
    147                 if ((0 == (chunk_bmap & (1 << _chunk1_))) && ((chunk_bmap & (1 << _chunk2_)))) { \
    148                     end_bit = 0;                                                            \
    149                     end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_);               \
    150                 } else if ((chunk_bmap & (1 << _chunk1_)) && (0 == (chunk_bmap & (1 << _chunk2_)))) { \
    151                     end_bit = _UDF_CHUNK_WIDTH_;                                            \
    152                     end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_);               \
    153                     end_width = end_width + _UDF_CHUNK_WIDTH_;                              \
    154                 } else {                                                                    \
    155                     end_bit = 0;                                                            \
    156                     end_width = hint_node->hint->end_bit%(2 * _UDF_CHUNK_WIDTH_);           \
    157                 }                                                                           \
    158              }                                                                              \
    159           } while(0);
    160 
    161 static soc_field_t _th_efp_slice_mode[4][2] =  {
    162           {SLICE_0_MODEf, SLICE_0_IPV6_KEY_MODEf},
    163           {SLICE_1_MODEf, SLICE_1_IPV6_KEY_MODEf},
    164           {SLICE_2_MODEf, SLICE_2_IPV6_KEY_MODEf},
    165           {SLICE_3_MODEf, SLICE_3_IPV6_KEY_MODEf}
    166        };
    167 static soc_field_t classfldtbl[][7] = {
    168                        {SLICE_0_F1f, SLICE_0_F2f, SLICE_0_F3f, SLICE_0_F4f,
    169                                      SLICE_0_F6f, SLICE_0_F7f, SLICE_0_F8f},
    170                        {SLICE_1_F1f, SLICE_1_F2f, SLICE_1_F3f, SLICE_1_F4f,
    171                                      SLICE_1_F6f, SLICE_1_F7f, SLICE_1_F8f},
    172                        {SLICE_2_F1f, SLICE_2_F2f, SLICE_2_F3f, SLICE_2_F4f,
    173                                      SLICE_2_F6f, SLICE_2_F7f, SLICE_2_F8f},
    174                        {SLICE_3_F1f, SLICE_3_F2f, SLICE_3_F3f, SLICE_3_F4f,
    175                                      SLICE_3_F6f, SLICE_3_F7f, SLICE_3_F8f}
    176 };
    177 #if defined (BCM_TRIDENT3_SUPPORT) || defined (BCM_TOMAHAWK3_SUPPORT)
    178 static soc_field_t classIdBfldtbl[4] =
    179                        { SLICE_0f, SLICE_1f, SLICE_2f, SLICE_3f };
    180 #endif
    181 static soc_field_t dvpfldtbl[4] =
    182                        { SLICE_0f, SLICE_1f, SLICE_2f, SLICE_3f };
    183 
    184 static soc_field_t mdlfldtbl[4] =
    185                        { SLICE_0f, SLICE_1f, SLICE_2f, SLICE_3f };
    186 
    187 
    188 static const uint32 vfp_efp_virtual_to_physical_map[] = {
    189         VIRTUAL_SLICE_0_PHYSICAL_SLICE_NUMBERf,
    190         VIRTUAL_SLICE_1_PHYSICAL_SLICE_NUMBERf,
    191         VIRTUAL_SLICE_2_PHYSICAL_SLICE_NUMBERf,
    192         VIRTUAL_SLICE_3_PHYSICAL_SLICE_NUMBERf};
    193 static const int32 vfp_efp_virtual_to_group_map[] = {
    194         VIRTUAL_SLICE_0_VIRTUAL_SLICE_GROUPf,
    195         VIRTUAL_SLICE_1_VIRTUAL_SLICE_GROUPf,
    196         VIRTUAL_SLICE_2_VIRTUAL_SLICE_GROUPf,
    197         VIRTUAL_SLICE_3_VIRTUAL_SLICE_GROUPf};
    198 static const soc_field_t vfp_slice_wide_mode_flds[] = {
    199         SLICE_0_DOUBLE_WIDE_MODEf,
    200         SLICE_1_DOUBLE_WIDE_MODEf,
    201         SLICE_2_DOUBLE_WIDE_MODEf,
    202         SLICE_3_DOUBLE_WIDE_MODEf
    203     };
    204 static const soc_field_t vfp_slice_pairing_flds[] = {
    205         SLICE1_0_PAIRINGf,
    206         SLICE3_2_PAIRINGf
    207     };
    208 
    209 _bcm_field_action_set_t bcm_field_hx5_ifp_action_set[_FieldActionSetCount] = {
    210   { 0, 0, 0}, /* for the actions which doesnt support aset */
    211   { 1, 0, PROTECTION_SWITCHING_DROP_OVERIDE_SETf},
    212   /* _FieldActionProtectionSwitchingDropOverrideSet */
    213   {10, 0, IFP_DLB_ALTERNATE_PATH_CONTROL_SETf},
    214   /* _FieldActionIfpDlbAlternatePathControlSet */
    215   { 2, 0, ECMP_DLB_ACTION_SETf},
    216   /* _FieldActionEcmpDlbActionSet */
    217   { 2, 0, HGT_LAG_DLB_ACTION_SETf},
    218   /* _FieldActionHgtLagDlbActionSet */
    219   { 2, 0, ECMP2_RH_ACTION_SETf},
    220   /* _FieldActionEcmp2RhActionSet */
    221   { 2, 0, ECMP1_RH_ACTION_SETf},
    222   /* _FieldActionEcmp1RhActionSet */
    223   { 2, 0, LAG_RH_ACTION_SETf},
    224   /* _FieldActionLagRhActionSet */
    225   { 2, 0, HGT_RH_ACTION_SETf},
    226   /* _FieldActionHgtRhActionSet */
    227   { 4, 0, LOOPBACK_PROFILE_ACTION_SETf},
    228   /* _FieldActionLoopbackProfileSet */
    229   {16, 0, EXTRACTION_CTRL_ID_ACTION_SETf}, /*  _FieldActionExtractionCtrlId */
    230   {16, 0, OPAQUE_4_ACTION_SETf}, /*  _FieldActionOpaque4Set */
    231   {16, 0, OPAQUE_3_ACTION_SETf}, /*  _FieldActionOpaque3Set */
    232   {16, 0, OPAQUE_2_ACTION_SETf}, /*  _FieldActionOpaque2Set */
    233   {16, 0, OPAQUE_1_ACTION_SETf}, /*  _FieldActionOpaque1Set */
    234   { 2, 0, TX_TIMESTAMP_INSERTION_SETf},
    235   /*_FieldActionTxTimestampInsertionSet */
    236   { 2, 0, RX_TIMESTAMP_INSERTION_SETf},
    237   /*_FieldActionRxTimestampInsertionSet */
    238   { 1, 0, IGNORE_FCOE_ZONE_CHECK_SETf},
    239   /*_FieldActionIgnoreFCOEZoneCheckSet */
    240   { 1, 1, GREEN_TO_PID_SETf},
    241   /*  _FieldActionGreenToPidSet */
    242   { 1, 0, MIRROR_OVERRIDE_SETf},
    243   /*  _FieldActionMirrorOverrideSet */
    244   { 1, 0, NAT_OVERRIDE_SETf},
    245   /*  _FieldActionNatOverrideSet*/
    246   { 1, 0, SFLOW_SETf},
    247   /*  _FieldActionSflowSet */
    248   { 1, 0, CUT_THRU_OVERRIDE_SETf},
    249   /*  _FieldActionCutThrOverrideSet */
    250   { 1, 0, URPF_OVERRIDE_SETf},
    251   /* _FieldActionUrpfOverrideSet */
    252   { 1, 0, TTL_OVERRIDE_SETf},
    253   /* _FieldActionTtlOverrideSet */
    254   { 3, 0, LB_CONTROLS_SETf},
    255   /* _FieldActionLbControlSet */
    256   { 6, 1, DROP_SETf},
    257   /* _FieldActionDropSet */
    258   { 8, 0, CHANGE_CPU_COS_SETf},
    259   /* _FieldActionChangeCpuCosSet */
    260   {12, 0, MIRROR_SETf},
    261   /* _FieldActionMirrorSet */
    262   {12, 0, NAT_SETf},
    263   /* _FieldActionNatSet ,*/
    264   {17, 1, COPY_TO_CPU_SETf},
    265   /* _FieldActionCopyToCpuSet */
    266   {23, 1, L3SW_CHANGE_L2_SETf},
    267   /* _FieldActionL3SwChangeL2Set */
    268   {38, 1, REDIRECT_SETf},
    269   /*  IFP  _FieldActionRedirectSet */
    270   {26, 1, COUNTER_SETf},
    271   /* _FieldActionCounterSet */
    272   { 9, 1, CHANGE_ECN_SETf},
    273   /* _FieldActionChangeEcnSet */
    274   {18, 1, CHANGE_PKT_PRI_SETf},
    275   /* _FieldActionChangePktPriSet */
    276   {25, 1, CHANGE_DSCP_TOS_SETf},
    277   /* _FieldActionChangeDscpTosSet */
    278   { 6, 1, CHANGE_DROP_PRECEDENCE_SETf},
    279   /*_FieldActionChangeDropPrecendenceSet */
    280   {42, 1, CHANGE_COS_OR_INT_PRI_SETf},
    281   /* _FieldActionChangeCosOrIntPriSet */
    282   { 9, 1, CHANGE_INT_CN_SETf},
    283   /* _FieldActionChangeIntCNSet */
    284   { 5, 0, CHANGE_INPUT_PRIORITY_SETf},
    285   /* _FieldActionChangeInputPrioritySet */
    286   { 1, 0, INSTRUMENTATION_SETf},
    287   /* _FieldActionInstrumentationSet */
    288   {16, 0, EDIT_CTRL_ID_ACTION_SETf},  /* _FieldActionEditCtrlIdSet */
    289   {16, 0, FCOE_VSAN_SETf},  /* _FieldActionFcoeVsanSet */
    290   {20, 1, METER_SETf}, /*_FieldActionMeterSet */
    291   { 0, 0, 0}  /* _FieldActionTimestampInsertionSet */
    292 };
    293 
    294 _bcm_field_action_set_t bcm_field_td3_ifp_action_set[_FieldActionSetCount] = {
    295   { 0, 0, 0}, /* for the actions which doesnt support aset */
    296   { 1, 0, PROTECTION_SWITCHING_DROP_OVERIDE_SETf},
    297   /* _FieldActionProtectionSwitchingDropOverrideSet */
    298   {10, 0, IFP_DLB_ALTERNATE_PATH_CONTROL_SETf},
    299   /* _FieldActionIfpDlbAlternatePathControlSet */
    300   { 2, 0, ECMP_DLB_ACTION_SETf},
    301   /* _FieldActionEcmpDlbActionSet */
    302   { 2, 0, HGT_LAG_DLB_ACTION_SETf},
    303   /* _FieldActionHgtLagDlbActionSet */
    304   { 2, 0, ECMP2_RH_ACTION_SETf},
    305   /* _FieldActionEcmp2RhActionSet */
    306   { 2, 0, ECMP1_RH_ACTION_SETf},
    307   /* _FieldActionEcmp1RhActionSet */
    308   { 2, 0, LAG_RH_ACTION_SETf},
    309   /* _FieldActionLagRhActionSet */
    310   { 2, 0, HGT_RH_ACTION_SETf},
    311   /* _FieldActionHgtRhActionSet */
    312   { 4, 0, LOOPBACK_PROFILE_ACTION_SETf},
    313   /* _FieldActionLoopbackProfileSet */
    314   {16, 0, EXTRACTION_CTRL_ID_ACTION_SETf}, /*  _FieldActionExtractionCtrlId */
    315   {16, 0, OPAQUE_4_ACTION_SETf}, /*  _FieldActionOpaque4Set */
    316   {16, 0, OPAQUE_3_ACTION_SETf}, /*  _FieldActionOpaque3Set */
    317   {16, 0, OPAQUE_2_ACTION_SETf}, /*  _FieldActionOpaque2Set */
    318   {16, 0, OPAQUE_1_ACTION_SETf}, /*  _FieldActionOpaque1Set */
    319   { 2, 0, TX_TIMESTAMP_INSERTION_SETf},
    320   /*_FieldActionTxTimestampInsertionSet */
    321   { 2, 0, RX_TIMESTAMP_INSERTION_SETf},
    322   /*_FieldActionRxTimestampInsertionSet */
    323   { 1, 0, IGNORE_FCOE_ZONE_CHECK_SETf},
    324   /*_FieldActionIgnoreFCOEZoneCheckSet */
    325   { 1, 1, GREEN_TO_PID_SETf},
    326   /*  _FieldActionGreenToPidSet */
    327   { 1, 0, MIRROR_OVERRIDE_SETf},
    328   /*  _FieldActionMirrorOverrideSet */
    329   { 1, 0, NAT_OVERRIDE_SETf},
    330   /*  _FieldActionNatOverrideSet*/
    331   { 1, 0, SFLOW_SETf},
    332   /*  _FieldActionSflowSet */
    333   { 1, 0, CUT_THRU_OVERRIDE_SETf},
    334   /*  _FieldActionCutThrOverrideSet */
    335   { 1, 0, URPF_OVERRIDE_SETf},
    336   /* _FieldActionUrpfOverrideSet */
    337   { 1, 0, TTL_OVERRIDE_SETf},
    338   /* _FieldActionTtlOverrideSet */
    339   { 3, 0, LB_CONTROLS_SETf},
    340   /* _FieldActionLbControlSet */
    341   { 6, 1, DROP_SETf},
    342   /* _FieldActionDropSet */
    343   { 8, 0, CHANGE_CPU_COS_SETf},
    344   /* _FieldActionChangeCpuCosSet */
    345   {12, 0, MIRROR_SETf},
    346   /* _FieldActionMirrorSet */
    347   {12, 0, NAT_SETf},
    348   /* _FieldActionNatSet ,*/
    349   {17, 1, COPY_TO_CPU_SETf},
    350   /* _FieldActionCopyToCpuSet */
    351   {23, 1, L3SW_CHANGE_L2_SETf},
    352   /* _FieldActionL3SwChangeL2Set */
    353   {38, 1, REDIRECT_SETf},
    354   /*  IFP  _FieldActionRedirectSet */
    355   {26, 1, COUNTER_SETf},
    356   /* _FieldActionCounterSet */
    357   { 9, 1, CHANGE_ECN_SETf},
    358   /* _FieldActionChangeEcnSet */
    359   {18, 1, CHANGE_PKT_PRI_SETf},
    360   /* _FieldActionChangePktPriSet */
    361   {25, 1, CHANGE_DSCP_TOS_SETf},
    362   /* _FieldActionChangeDscpTosSet */
    363   { 6, 1, CHANGE_DROP_PRECEDENCE_SETf},
    364   /*_FieldActionChangeDropPrecendenceSet */
    365   {36, 1, CHANGE_COS_OR_INT_PRI_SETf},
    366   /* _FieldActionChangeCosOrIntPriSet */
    367   { 9, 1, CHANGE_INT_CN_SETf},
    368   /* _FieldActionChangeIntCNSet */
    369   { 5, 0, CHANGE_INPUT_PRIORITY_SETf},
    370   /* _FieldActionChangeInputPrioritySet */
    371   { 1, 0, INSTRUMENTATION_SETf},
    372   /* _FieldActionInstrumentationSet */
    373   {16, 0, EDIT_CTRL_ID_ACTION_SETf},  /* _FieldActionEditCtrlIdSet */
    374   {16, 0, FCOE_VSAN_SETf},  /* _FieldActionFcoeVsanSet */
    375   {20, 1, METER_SETf}, /*_FieldActionMeterSet */
    376   { 0, 0, 0}, /* _FieldActionTimestampInsertionSet */
    377   { 0, 0, 0}, /* _FieldActionDelayedDropSet */
    378   { 0, 0, 0}, /* _FieldActionDelayedRedirectSet */
    379   { 0, 0, 0}, /* _FieldActionEcmpDlbMonitorSet */
    380   { 0, 0, 0}, /* _FieldActionElephantTrapSet */
    381   { 0, 0, 0} /* _FieldActionInbandTelemetrySet */
    382 };
    383 
    384 _bcm_field_action_set_t bcm_field_td3_em_action_set[_FieldActionSetCount] = {
    385   { 0, 0, 0}, /* for the actions which doesnt support aset */
    386   { 1, 0, PROTECTION_SWITCHING_DROP_OVERIDE_SETf},
    387   /* _FieldActionProtectionSwitchingDropOverrideSet */
    388   {10, 0, IFP_DLB_ALTERNATE_PATH_CONTROL_SETf},
    389   /* _FieldActionIfpDlbAlternatePathControlSet */
    390   { 2, 0, ECMP_DLB_ACTION_SETf},
    391   /* _FieldActionEcmpDlbActionSet */
    392   { 2, 0, HGT_LAG_DLB_ACTION_SETf},
    393   /* _FieldActionHgtLagDlbActionSet */
    394   { 2, 0, ECMP2_RH_ACTION_SETf},
    395   /* _FieldActionEcmp2RhActionSet */
    396   { 2, 0, ECMP1_RH_ACTION_SETf},
    397   /* _FieldActionEcmp1RhActionSet */
    398   { 2, 0, LAG_RH_ACTION_SETf},
    399   /* _FieldActionLagRhActionSet */
    400   { 2, 0, HGT_RH_ACTION_SETf},
    401   /* _FieldActionHgtRhActionSet */
    402   { 4, 0, LOOPBACK_PROFILE_ACTION_SETf},
    403   /* _FieldActionLoopbackProfileSet */
    404   {16, 0, EXTRACTION_CTRL_ID_ACTION_SETf}, /*  _FieldActionExtractionCtrlId */
    405   {16, 0, OPAQUE_4_ACTION_SETf}, /*  _FieldActionOpaque4Set */
    406   {16, 0, OPAQUE_3_ACTION_SETf}, /*  _FieldActionOpaque3Set */
    407   {16, 0, OPAQUE_2_ACTION_SETf}, /*  _FieldActionOpaque2Set */
    408   {16, 0, OPAQUE_1_ACTION_SETf}, /*  _FieldActionOpaque1Set */
    409   { 2, 0, TX_TIMESTAMP_INSERTION_SETf}, /*_FieldActionTxTimestampInsertionSet */
    410   { 2, 0, RX_TIMESTAMP_INSERTION_SETf}, /*_FieldActionRxTimestampInsertionSet */
    411   { 1, 0, IGNORE_FCOE_ZONE_CHECK_SETf}, /*_FieldActionIgnoreFCOEZoneCheckSet */
    412   { 1, 1, GREEN_TO_PID_SETf},
    413   /*  _FieldActionGreenToPidSet */
    414   { 1, 0, MIRROR_OVERRIDE_SETf},
    415   /*  _FieldActionMirrorOverrideSet */
    416   { 1, 0, NAT_OVERRIDE_SETf},
    417   /*  _FieldActionNatOverrideSet */
    418   { 1, 0, SFLOW_SETf},
    419   /*  _FieldActionSflowSet */
    420   { 1, 0, CUT_THRU_OVERRIDE_SETf},
    421   /*  _FieldActionCutThrOverrideSet */
    422   { 1, 0, URPF_OVERRIDE_SETf},
    423   /* _FieldActionUrpfOverrideSet */
    424   { 1, 0, TTL_OVERRIDE_SETf},
    425   /* _FieldActionTtlOverrideSet */
    426   { 3, 0, LB_CONTROLS_SETf},
    427   /* _FieldActionLbControlSet */
    428   { 6, 1, DROP_SETf},
    429   /* _FieldActionDropSet */
    430   { 8, 0, CHANGE_CPU_COS_SETf},
    431   /* _FieldActionChangeCpuCosSet */
    432   {12, 0, MIRROR_SETf},
    433   /* _FieldActionMirrorSet */
    434   {12, 0, NAT_SETf},
    435   /* _FieldActionNatSet */
    436   {17, 1, COPY_TO_CPU_SETf},
    437   /* _FieldActionCopyToCpuSet */
    438   {23, 1, L3SW_CHANGE_L2_SETf},
    439   /* _FieldActionL3SwChangeL2Set */
    440   {25, 1, EXACT_MATCH_REDIRECT_SETf},
    441   /*  EP  _FieldActionRedirectSet */
    442   {26, 1, COUNTER_SETf},
    443   /* _FieldActionCounterSet */
    444   { 0, 0, 0}, /* _FieldActionChangeEcnSet */
    445   { 0, 0, 0}, /* _FieldActionChangePktPriSet */
    446   { 0, 0, 0}, /* _FieldActionChangeDscpTosSet */
    447   { 0, 0, 0}, /* _FieldActionChangeDropPrecendenceSet */
    448   { 0, 0, 0}, /* _FieldActionChangeCosOrIntPriSet */
    449   { 0, 0, 0}, /* _FieldActionChangeIntCNSet */
    450   { 0, 0, 0}, /* _FieldActionChangeInputPrioritySet */
    451   { 1, 0, INSTRUMENTATION_SETf}, /* _FieldActionInstrumentationSet */
    452   {16, 0, EDIT_CTRL_ID_ACTION_SETf}, /* _FieldActionEditCtrlIdSet */
    453   { 1, 0, FCOE_VSAN_SETf}, /* _FieldActionFcoeVsanSet */
    454   {20, 1, METER_SETf}, /*_FieldActionMeterSet */
    455   { 0, 0, 0}, /* _FieldActionTimestampInsertionSet */
    456   { 0, 0, 0}, /* _FieldActionDelayedDropSet */
    457   { 0, 0, 0}, /* _FieldActionDelayedRedirectSet */
    458   { 0, 0, 0}, /* _FieldActionEcmpDlbMonitorSet */
    459   { 0, 0, 0}, /* _FieldActionElephantTrapSet */
    460   { 0, 0, 0} /* _FieldActionInbandTelemetrySet */
    461 };
    462 
    463 _bcm_field_action_set_t bcm_field_th_em_action_set[_FieldActionSetCount] = {
    464   { 0, 0, 0}, /* for the actions which doesnt support aset */
    465   { 0, 0, 0},
    466   /* _FieldActionProtectionSwitchingDropOverrideSet */
    467   { 0, 0, 0},
    468   /* _FieldActionIfpDlbAlternatePathControlSet */
    469   { 0, 0, 0},
    470   /* _FieldActionEcmpDlbActionSet */
    471   { 0, 0, 0},
    472   /* _FieldActionHgtLagDlbActionSet */
    473   { 0, 0, 0},
    474   /* _FieldActionEcmp2RhActionSet */
    475   { 0, 0, 0},
    476   /* _FieldActionEcmp1RhActionSet */
    477   { 0, 0, 0},
    478   /* _FieldActionLagRhActionSet */
    479   { 0, 0, 0},
    480   /* _FieldActionHgtRhActionSet */
    481   { 0, 0, 0}, /* _FieldActionLoopbackProfileSet = 1,*/
    482   { 0, 0, 0}, /*  _FieldActionExtractionCtrlId = 2,*/
    483   { 0, 0, 0}, /*  _FieldActionOpaque4Set = 3,*/
    484   { 0, 0, 0}, /*  _FieldActionOpaque3Set = 4,*/
    485   { 0, 0, 0}, /*  _FieldActionOpaque2Set = 5,*/
    486   { 0, 0, 0}, /*  _FieldActionOpaque1Set = 6,*/
    487   { 0, 0, 0}, /*  _FieldActionTxTimestampInsertionSet = 7,*/
    488   { 0, 0, 0}, /*  _FieldActionRxTimestampInsertionSet = 8,*/
    489   { 0, 0, 0}, /*  _FieldActionIgnoreFCOEZoneCheckSet = 9,*/
    490   { 1, 1, GREEN_TO_PID_SET_ENABLEf},
    491   /*  _FieldActionGreenToPidSet = 10, */
    492   { 1, 0, MIRROR_OVERRIDE_SET_ENABLEf},
    493   /*  _FieldActionMirrorOverrideSet = 11,*/
    494   { 1, 0, NAT_OVERRIDE_SET_ENABLEf},
    495   /*  _FieldActionNatOverrideSet = 12,*/
    496   { 1, 0, SFLOW_SET_ENABLEf},
    497   /*  _FieldActionSflowSet = 13,*/
    498   { 1, 0, CUT_THRU_OVERRIDE_SET_ENABLEf},
    499   /*  _FieldActionCutThrOverrideSet = 14,*/
    500   { 1, 0, URPF_OVERRIDE_SET_ENABLEf},
    501   /* _FieldActionUrpfOverrideSet = 15, */
    502   { 1, 0, TTL_OVERRIDE_SET_ENABLEf},
    503   /* _FieldActionTtlOverrideSet = 16,*/
    504   { 3, 0, LB_CONTROLS_SET_ENABLEf},
    505   /* _FieldActionLbControlSet = 17,*/
    506   { 6, 1, DROP_SET_ENABLEf},
    507   /* _FieldActionDropSet = 18, */
    508   { 8, 0, CHANGE_CPU_COS_SET_ENABLEf},
    509   /* _FieldActionChangeCpuCosSet = 19, */
    510   {12, 0, MIRROR_SET_ENABLEf},
    511   /* _FieldActionMirrorSet = 20, */
    512   {12, 0, NAT_SET_ENABLEf},
    513   /* _FieldActionNatSet = 21,*/
    514   {17, 1, COPY_TO_CPU_SET_ENABLEf},
    515   /* _FieldActionCopyToCpuSet = 22,*/
    516   {23, 1, L3SW_CHANGE_L2_SET_ENABLEf},
    517   /* _FieldActionL3SwChangeL2Set = 23,*/
    518   {25, 1, EXACT_MATCH_REDIRECT_SET_ENABLEf},
    519   /*  EM _FieldActionRedirectSet = 24,*/
    520   {25, 1, COUNTER_SET_ENABLEf},
    521   /* _FieldActionCounterSet */
    522   { 0, 0, 0}, /* _FieldActionChangeEcnSet */
    523   { 0, 0, 0}, /* _FieldActionChangePktPriSet */
    524   { 0, 0, 0}, /* _FieldActionChangeDscpTosSet */
    525   { 0, 0, 0}, /* _FieldActionChangeDropPrecendenceSet */
    526   { 0, 0, 0}, /* _FieldActionChangeCosOrIntPriSet */
    527   { 0, 0, 0}, /* _FieldActionChangeIntCNSet */
    528   { 0, 0, 0}, /* _FieldActionChangeInputPrioritySet */
    529   { 0, 0, 0}, /* _FieldActionInstrumentationSet */
    530   { 0, 0, 0}, /* _FieldActionEditCtrlIdSet */
    531   { 0, 0, 0}, /* _FieldActionFcoeVsanSet */
    532   {18, 1, METER_SET_ENABLEf}, /*_FieldActionMeterSet */
    533   { 0, 0, 0}, /* _FieldActionTimestampInsertionSet */
    534   { 0, 0, 0}, /* _FieldActionDelayedDropSet */
    535   { 0, 0, 0}, /* _FieldActionDelayedRedirectSet */
    536   { 0, 0, 0}, /* _FieldActionEcmpDlbMonitorSet */
    537   { 0, 0, 0}, /* _FieldActionElephantTrapSet */
    538   { 0, 0, 0} /* _FieldActionInbandTelemetrySet */
    539 };
    540 
    541 _bcm_field_action_set_t bcm_field_th2_em_action_set[_FieldActionSetCount] = {
    542   { 0, 0, 0}, /* for the actions which doesnt support aset */
    543   { 1, 0, PROTECTION_SWITCHING_SET_ENABLEf}, /* _FieldActionProtectionSwitchingDropOverrideSet */
    544   { 10, 0, DLB_ALTERNATE_PATH_CONTROL_SET_ENABLEf},
    545   /* _FieldActionIfpDlbAlternatePathControlSet */
    546   { 2, 0, DLB_ECMP_SET_ENABLEf},
    547   /* _FieldActionEcmpDlbActionSet */
    548   { 2, 0, DLB_HGT_LAG_SET_ENABLEf},
    549   /* _FieldActionHgtLagDlbActionSet */
    550   { 0, 0, 0},
    551   /* _FieldActionEcmp2RhActionSet */
    552   { 0, 0, 0},
    553   /* _FieldActionEcmp1RhActionSet */
    554   { 0, 0, 0},
    555   /* _FieldActionLagRhActionSet */
    556   { 0, 0, 0},
    557   /* _FieldActionHgtRhActionSet */
    558   { 0, 0, 0}, /* _FieldActionLoopbackProfileSet = 1,*/
    559   { 0, 0, 0}, /*  _FieldActionExtractionCtrlId = 2,*/
    560   { 0, 0, 0}, /*  _FieldActionOpaque4Set = 3,*/
    561   { 0, 0, 0}, /*  _FieldActionOpaque3Set = 4,*/
    562   { 0, 0, 0}, /*  _FieldActionOpaque2Set = 5,*/
    563   { 0, 0, 0}, /*  _FieldActionOpaque1Set = 6,*/
    564   { 0, 0, 0}, /*  _FieldActionTxTimestampInsertionSet = 7,*/
    565   { 0, 0, 0}, /*  _FieldActionRxTimestampInsertionSet = 8,*/
    566   { 0, 0, 0}, /*  _FieldActionIgnoreFCOEZoneCheckSet = 9,*/
    567   { 1, 1, GREEN_TO_PID_SET_ENABLEf},
    568   /*  _FieldActionGreenToPidSet = 10, */
    569   { 1, 0, MIRROR_OVERRIDE_SET_ENABLEf},
    570   /*  _FieldActionMirrorOverrideSet = 11,*/
    571   { 1, 0, NAT_OVERRIDE_SET_ENABLEf},
    572   /*  _FieldActionNatOverrideSet = 12,*/
    573   { 1, 0, SFLOW_SET_ENABLEf},
    574   /*  _FieldActionSflowSet = 13,*/
    575   { 1, 0, CUT_THRU_OVERRIDE_SET_ENABLEf},
    576   /*  _FieldActionCutThrOverrideSet = 14,*/
    577   { 1, 0, URPF_OVERRIDE_SET_ENABLEf},
    578   /* _FieldActionUrpfOverrideSet = 15, */
    579   { 1, 0, TTL_OVERRIDE_SET_ENABLEf},
    580   /* _FieldActionTtlOverrideSet = 16,*/
    581   { 3, 0, LB_CONTROLS_SET_ENABLEf},
    582   /* _FieldActionLbControlSet = 17,*/
    583   { 6, 1, DROP_SET_ENABLEf},
    584   /* _FieldActionDropSet = 18, */
    585   { 8, 0, CHANGE_CPU_COS_SET_ENABLEf},
    586   /* _FieldActionChangeCpuCosSet = 19, */
    587   {12, 0, MIRROR_SET_ENABLEf},
    588   /* _FieldActionMirrorSet = 20, */
    589   {12, 0, NAT_SET_ENABLEf},
    590   /* _FieldActionNatSet = 21,*/
    591   {17, 1, COPY_TO_CPU_SET_ENABLEf},
    592   /* _FieldActionCopyToCpuSet = 22,*/
    593   {23, 1, L3SW_CHANGE_L2_SET_ENABLEf},
    594   /* _FieldActionL3SwChangeL2Set = 23,*/
    595   {25, 1, EXACT_MATCH_REDIRECT_SET_ENABLEf},
    596   /*  EM _FieldActionRedirectSet = 24,*/
    597   {26, 1, COUNTER_SET_ENABLEf},
    598   /* _FieldActionCounterSet */
    599   { 0, 0, 0}, /* _FieldActionChangeEcnSet */
    600   { 0, 0, 0}, /* _FieldActionChangePktPriSet */
    601   { 0, 0, 0}, /* _FieldActionChangeDscpTosSet */
    602   { 0, 0, 0}, /* _FieldActionChangeDropPrecendenceSet */
    603   { 0, 0, 0}, /* _FieldActionChangeCosOrIntPriSet */
    604   { 0, 0, 0}, /* _FieldActionChangeIntCNSet */
    605   { 0, 0, 0}, /* _FieldActionChangeInputPrioritySet */
    606   { 1, 0, INSTRUMENTATION_SET_ENABLEf}, /* _FieldActionInstrumentationSet */
    607   { 0, 0, 0}, /* _FieldActionEditCtrlIdSet */
    608   { 0, 0, 0}, /* _FieldActionFcoeVsanSet */
    609   {18, 1, METER_SET_ENABLEf}, /*_FieldActionMeterSet */
    610   { 4, 0, TIMESTAMP_SET_ENABLEf}, /*_FieldActionTimestampInsertionSet*/
    611   { 0, 0, 0}, /* _FieldActionDelayedDropSet */
    612   { 0, 0, 0}, /* _FieldActionDelayedRedirectSet */
    613   { 0, 0, 0}, /* _FieldActionEcmpDlbMonitorSet */
    614   { 0, 0, 0}, /* _FieldActionElephantTrapSet */
    615   { 0, 0, 0} /* _FieldActionInbandTelemetrySet */
    616 };
    617 
    618 _bcm_field_action_set_t bcm_field_th3_em_action_set[_FieldActionSetCount] = {
    619     { 0, 0, 0}, /* for the actions which doesnt support aset */
    620     { 1, 0, PROTECTION_SWITCHING_SET_ENABLEf},
    621     /* _FieldActionProtectionSwitchingDropOverrideSet = 1 */
    622     { 10, 0, DLB_ALTERNATE_PATH_CONTROL_SET_ENABLEf},
    623     /* _FieldActionIfpDlbAlternatePathControlSet = 2 */
    624     { 2, 0, DLB_ECMP_SET_ENABLEf},
    625     /* _FieldActionEcmpDlbActionSet =3 */
    626     { 0, 0, 0},
    627     /* _FieldActionHgtLagDlbActionSet = 4 */
    628     { 0, 0, 0},
    629     /* _FieldActionEcmp2RhActionSet = 5 */
    630     { 0, 0, 0},
    631     /* _FieldActionEcmp1RhActionSet = 6 */
    632     { 0, 0, 0},
    633     /* _FieldActionLagRhActionSet = 7 */
    634     { 0, 0, 0},
    635     /* _FieldActionHgtRhActionSet = 8 */
    636     { 0, 0, 0}, /* _FieldActionLoopbackProfileSet = 9,*/
    637     { 0, 0, 0}, /*  _FieldActionExtractionCtrlId = 10,*/
    638     { 0, 0, 0}, /*  _FieldActionOpaque4Set = 11,*/
    639     { 0, 0, 0}, /*  _FieldActionOpaque3Set = 12,*/
    640     { 0, 0, 0}, /*  _FieldActionOpaque2Set = 13,*/
    641     { 0, 0, 0}, /*  _FieldActionOpaque1Set = 14,*/
    642     { 0, 0, 0}, /*  _FieldActionTxTimestampInsertionSet = 15,*/
    643     { 0, 0, 0}, /*  _FieldActionRxTimestampInsertionSet = 16,*/
    644     { 0, 0, 0}, /*  _FieldActionIgnoreFCOEZoneCheckSet = 17,*/
    645     { 1, 1, GREEN_TO_PID_SET_ENABLEf},
    646     /*  _FieldActionGreenToPidSet = 18, */
    647     { 1, 0, MIRROR_OVERRIDE_SET_ENABLEf},
    648     /*  _FieldActionMirrorOverrideSet = 19,*/
    649     { 0, 0, 0},
    650     /*  _FieldActionNatOverrideSet = 20,*/
    651     { 1, 0, SFLOW_SET_ENABLEf},
    652     /*  _FieldActionSflowSet = 21,*/
    653     { 1, 0, CUT_THRU_OVERRIDE_SET_ENABLEf},
    654     /*  _FieldActionCutThrOverrideSet = 22,*/
    655     { 0, 0, 0},
    656     /* _FieldActionUrpfOverrideSet = 23, */
    657     { 1, 0, TTL_OVERRIDE_SET_ENABLEf},
    658     /* _FieldActionTtlOverrideSet = 24,*/
    659     { 2, 0, LB_CONTROLS_SET_ENABLEf},
    660     /* _FieldActionLbControlSet = 25,*/
    661     { 6, 1, DROP_SET_ENABLEf},
    662     /* _FieldActionDropSet = 26, */
    663     { 8, 0, CHANGE_CPU_COS_SET_ENABLEf},
    664     /* _FieldActionChangeCpuCosSet = 27, */
    665     {15, 0, MIRROR_SET_ENABLEf},
    666     /* _FieldActionMirrorSet = 28, */
    667     { 0, 0, 0},
    668     /* _FieldActionNatSet = 29,*/
    669     {17, 1, COPY_TO_CPU_SET_ENABLEf},
    670     /* _FieldActionCopyToCpuSet = 30,*/
    671     {23, 1, L3SW_CHANGE_L2_SET_ENABLEf},
    672     /* _FieldActionL3SwChangeL2Set = 31,*/
    673     {25, 1, EXACT_MATCH_REDIRECT_SET_ENABLEf},
    674     /*  EM _FieldActionRedirectSet = 32,*/
    675     {25, 1, COUNTER_SET_ENABLEf},
    676     /* _FieldActionCounterSet = 33 */
    677     { 0, 0, 0}, /* _FieldActionChangeEcnSet = 34 */
    678     { 0, 0, 0}, /* _FieldActionChangePktPriSet = 35 */
    679     { 0, 0, 0}, /* _FieldActionChangeDscpTosSet = 36 */
    680     { 0, 0, 0}, /* _FieldActionChangeDropPrecendenceSet = 37 */
    681     { 0, 0, 0}, /* _FieldActionChangeCosOrIntPriSet = 38 */
    682     { 0, 0, 0}, /* _FieldActionChangeIntCNSet = 39 */
    683     { 0, 0, 0}, /* _FieldActionChangeInputPrioritySet = 40 */
    684     { 1, 0, INSTRUMENTATION_SET_ENABLEf},
    685     /* _FieldActionInstrumentationSet = 41 */
    686     { 0, 0, 0}, /* _FieldActionEditCtrlIdSet = 42 */
    687     { 0, 0, 0}, /* _FieldActionFcoeVsanSet = 43 */
    688     {16, 1, METER_SET_ENABLEf}, /*_FieldActionMeterSet = 44 */
    689     { 4, 0, TIMESTAMP_SET_ENABLEf}, /*_FieldActionTimestampInsertionSet = 45 */
    690     { 8, 0, DELAYED_DROP_SET_ENABLEf}, /* _FieldActionDelayedDropSet = 46 */
    691     {16, 0, DELAYED_REDIRECT_SET_ENABLEf}, /* _FieldActionDelayedRedirectSet = 47 */
    692     { 2, 0, DLB_ECMP_MONITOR_SET_ENABLEf}, /* _FieldActionEcmpDlbMonitorSet = 48 */
    693     { 6, 0, ELEPHANT_TRAP_SET_ENABLEf}, /* _FieldActionElephantTrapSet = 49 */
    694     { 2, 0, INBAND_TELEMETRY_SET_ENABLEf} /* _FieldActionInbandTelemetrySet = 50 */
    695 };
    696 
    697 
    698 /* Function declarations */
    699 STATIC int _field_th_stage_quals_ibus_map_init(int unit,
    700                                              _field_stage_t *stage_fc);
    701 
    702 STATIC int _field_th_stage_extractors_init(int unit, _field_stage_t *stage_fc);
    703 
    704 STATIC int _field_ser_oper_mode_init(int unit,
    705                                      int stage_id,
    706                                      bcm_field_group_oper_mode_t mode);
    707 STATIC int
    708 _field_th_ingress_tcam_policy_clear(int unit, _field_entry_t *f_ent,
    709                                     int tcam_idx);
    710 
    711 extern int
    712 _bcm_field_th_control_get(int unit, _field_control_t *fc,
    713                           bcm_field_control_t control, uint32 *state);
    714 /*
    715  * Function: _bcm_field_th_control_set
    716  *
    717  * Purpose:
    718  *     Set control status.
    719  *
    720  * Parameters:
    721  *     unit     - (IN) BCM device number.
    722  *     control  - (IN) Control element to set.
    723  *     state    - (IN) State (0/1).
    724  *
    725  * Returns:
    726  *     BCM_E_NONE    - Success
    727  *     BCM_E_INIT    - BCM unit not initialized
    728  *     BCM_E_PARAM   - Flag state not valid on device
    729  */
    730 int
    731 _bcm_field_th_control_set(int unit, _field_control_t *fc,
    732                           bcm_field_control_t control, uint32 state)
    733 {
    734     int rv = BCM_E_UNAVAIL;  /* Operation return status.   */
    735     uint32              reg_values[2];    /* Register value buffer.     */
    736     soc_field_t         reg_fields[2];    /* Register fields to modify. */
    737     int                 field_count = 2;  /* Number of updated fields.  */
    738     soc_reg_t           ifp_dst_action_reg;
    739 
    740     reg_values[0] = reg_values[1] = (state == TRUE) ? 1: 0;
    741 
    742     if (NULL == fc) {
    743         return BCM_E_PARAM;
    744     }
    745 
    746 #if defined (BCM_TOMAHAWK3_SUPPORT)
    747     if (SOC_IS_TOMAHAWK3(unit)) {
    748         ifp_dst_action_reg = SW_IFP_DST_ACTION_CONTROLr;
    749     } else
    750 #endif
    751     {
    752         ifp_dst_action_reg = SW2_IFP_DST_ACTION_CONTROLr;
    753     }
    754 
    755     switch (control) {
    756         case bcmFieldControlRedirectIngressVlanCheck:
    757             reg_fields[0] = VLAN_CHECK_ENf;
    758             field_count = 1;
    759             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    760                                          REG_PORT_ANY, field_count,
    761                                          reg_fields, reg_values);
    762             break;
    763         case bcmFieldControlRedirectNonUcastTrunkResolve:
    764             reg_fields[0] = LAG_RES_ENf;
    765             reg_fields[1] = HGTRUNK_RES_ENf;
    766             field_count = 2;
    767             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    768                                          REG_PORT_ANY, field_count,
    769                                          reg_fields, reg_values);
    770             break;
    771         case bcmFieldControlRedirectNonUcastEtherTrunkResolve:
    772             reg_fields[0] = LAG_RES_ENf;
    773             field_count = 1;
    774             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    775                                          REG_PORT_ANY, field_count,
    776                                          reg_fields, reg_values);
    777             break;
    778         case bcmFieldControlRedirectNonUcastFabricTrunkResolve:
    779             if (SOC_IS_TOMAHAWK3(unit)) {
    780                return BCM_E_UNAVAIL;
    781             }
    782             reg_fields[0] = HGTRUNK_RES_ENf;
    783             field_count = 1;
    784             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    785                                          REG_PORT_ANY, field_count,
    786                                          reg_fields, reg_values);
    787             break;
    788         case bcmFieldControlRedirectExcludeSrcPort:
    789             reg_fields[0] = HG_SRC_REMOVAL_ENf;
    790             reg_fields[1] = SRC_REMOVAL_ENf;
    791             field_count = 2;
    792             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    793                                          REG_PORT_ANY, field_count,
    794                                          reg_fields, reg_values);
    795             break;
    796         case bcmFieldControlRedirectExcludeEtherSrcPort:
    797             reg_fields[0] = SRC_REMOVAL_ENf;
    798             field_count = 1;
    799             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    800                                          REG_PORT_ANY, field_count,
    801                                          reg_fields, reg_values);
    802             break;
    803         case bcmFieldControlRedirectExcludeHiGigSrcPort:
    804             reg_fields[0] = HG_SRC_REMOVAL_ENf;
    805             field_count = 1;
    806             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    807                                          REG_PORT_ANY, field_count,
    808                                          reg_fields, reg_values);
    809             break;
    810         case bcmFieldControlRedirectPortFloodBlock:
    811             reg_fields[0] = PORT_BLOCK_ENf;
    812             field_count = 1;
    813             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    814                                          REG_PORT_ANY, field_count,
    815                                          reg_fields, reg_values);
    816             break;
    817         case bcmFieldControlRedirectVlanFloodBlock:
    818             reg_fields[0] = VLAN_BLOCK_ENf;
    819             field_count = 1;
    820             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    821                                          REG_PORT_ANY, field_count,
    822                                          reg_fields, reg_values);
    823             break;
    824         case bcmFieldControlRedirectNextHopExcludeSrcPort:
    825             reg_fields[0] = SRC_REMOVAL_EN_FOR_REDIRECT_TO_NHIf;
    826             field_count = 1;
    827             rv = soc_reg_fields32_modify(unit, ifp_dst_action_reg,
    828                                          REG_PORT_ANY, field_count,
    829                                          reg_fields, reg_values);
    830             break;
    831         case bcmFieldControlEcmpHashOffset:
    832             if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) {
    833                return BCM_E_UNAVAIL;
    834             }
    835             rv = soc_reg_field32_modify(unit, IFP_ECMP_HASH_CONTROLr,
    836                                           REG_PORT_ANY,
    837                                           ECMP_HASH_SALTf, state);
    838             break;
    839         case bcmFieldControlEcmpHashUseCrc:
    840             if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) {
    841                return BCM_E_UNAVAIL;
    842             }
    843             rv = soc_reg_field32_modify(unit, IFP_ECMP_HASH_CONTROLr,
    844                                           REG_PORT_ANY,
    845                                           USE_CRCf, state);
    846             break;
    847         case bcmFieldControlEcmpHashUseUpper5Bits:
    848             if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) {
    849                return BCM_E_UNAVAIL;
    850             }
    851             rv = soc_reg_field32_modify(unit, IFP_ECMP_HASH_CONTROLr,
    852                                           REG_PORT_ANY,
    853                                           USE_UPPERf, state);
    854             break;
    855         case bcmFieldControlEcmpHashEnable:
    856             if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) {
    857                return BCM_E_UNAVAIL;
    858             }
    859             rv = soc_reg_field32_modify(unit, IFP_ECMP_HASH_CONTROLr,
    860                                           REG_PORT_ANY,
    861                                           ENABLEf, state);
    862             break;
    863 
    864         case bcmFieldControlDlbMonitorIngressRandomSeed:
    865             if(SOC_REG_IS_VALID(unit, DLB_ECMP_MONITOR_IFP_CONTROLr)) {
    866                 uint32 seed;
    867                 seed = (1 << soc_reg_field_length(unit,
    868                                 DLB_ECMP_MONITOR_IFP_CONTROLr, SEEDf)) - 1;
    869                 if (state >= seed) {
    870                     return BCM_E_PARAM;
    871                 }
    872                 if (0 == state) {
    873                     /* Restore to default */
    874                     BCM_IF_ERROR_RETURN(_bcm_field_th_control_get(unit, fc, control, &seed));
    875                     if (seed == 0) {
    876                         return BCM_E_PARAM;
    877                     }
    878                 }
    879                 rv = WRITE_DLB_ECMP_MONITOR_IFP_CONTROLr(unit, state);
    880             }
    881             break;
    882             case bcmFieldControlGbpSrcMacMcastBitSet:
    883 #if defined(BCM_TRIDENT3_SUPPORT)
    884             if (SOC_REG_IS_VALID(unit, EGR_GBP_CONTROLr)) {
    885                 if (state > BCM_FIELD_GBP_SRC_ID_EQ_DST_ID) {
    886                     return BCM_E_PARAM;
    887                 }
    888                 rv = soc_reg_field32_modify(unit, EGR_GBP_CONTROLr,
    889                                               REG_PORT_ANY,
    890                                               GBP_SID_DID_CHECK_POLICYf, state);
    891             }
    892 #endif /* (BCM_TRIDENT3_SUPPORT) */
    893             break;
    894         default:
    895             rv = _bcm_field_control_set(unit, fc, control, state);
    896     }
    897 
    898     return rv;
    899 }
    900 /*
    901  * Function: _bcm_field_th_control_get
    902  *
    903  * Purpose:
    904  *     Get control status info.
    905  *
    906  * Parameters:
    907  *     unit     - (IN)  BCM device number.
    908  *     control  - (IN)  Control element to get.
    909  *     status   - (OUT) Status of field element.
    910  *
    911  * Returns:
    912  *     BCM_E_UNAVAIL - field control is not available
    913  *     BCM_E_PARAM   - *state pointing to NULL
    914  *     BCM_E_NONE    - Success
    915  */
    916 int
    917 _bcm_field_th_control_get(int unit, _field_control_t *fc,
    918                           bcm_field_control_t control, uint32 *state)
    919 {
    920 
    921     uint32 reg_val;          /* Register value buffer. */
    922     int    rv = BCM_E_UNAVAIL;  /* Operation return status.   */
    923     soc_reg_t           ifp_dst_action_reg;
    924 
    925     if (NULL == state || NULL == fc) {
    926         return BCM_E_PARAM;
    927     }
    928 
    929 #if defined (BCM_TOMAHAWK3_SUPPORT)
    930     if (SOC_IS_TOMAHAWK3(unit)) {
    931         ifp_dst_action_reg = SW_IFP_DST_ACTION_CONTROLr;
    932     } else
    933 #endif
    934     {
    935         ifp_dst_action_reg = SW2_IFP_DST_ACTION_CONTROLr;
    936     }
    937 
    938     switch (control) {
    939         case bcmFieldControlRedirectIngressVlanCheck:
    940 #if defined (BCM_TOMAHAWK3_SUPPORT)
    941             if (SOC_IS_TOMAHAWK3(unit)) {
    942                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
    943             } else
    944 #endif
    945             {
    946                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
    947             }
    948             if (BCM_SUCCESS(rv)) {
    949                 *state = soc_reg_field_get(unit,
    950                                        ifp_dst_action_reg,
    951                                        reg_val,
    952                                        VLAN_CHECK_ENf);
    953             }
    954             break;
    955         case bcmFieldControlRedirectNonUcastTrunkResolve:
    956 #if defined (BCM_TOMAHAWK3_SUPPORT)
    957             if (SOC_IS_TOMAHAWK3(unit)) {
    958                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
    959             } else
    960 #endif
    961             {
    962                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
    963             }
    964             if (BCM_SUCCESS(rv)) {
    965                 *state = soc_reg_field_get(unit,
    966                                        ifp_dst_action_reg,
    967                                        reg_val,
    968                                        LAG_RES_ENf);
    969             }
    970             break;
    971         case bcmFieldControlRedirectNonUcastEtherTrunkResolve:
    972 #if defined (BCM_TOMAHAWK3_SUPPORT)
    973             if (SOC_IS_TOMAHAWK3(unit)) {
    974                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
    975             } else
    976 #endif
    977             {
    978                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
    979             }
    980             if (BCM_SUCCESS(rv)) {
    981                 *state = soc_reg_field_get(unit,
    982                                        ifp_dst_action_reg,
    983                                        reg_val,
    984                                        LAG_RES_ENf);
    985             }
    986             break;
    987         case bcmFieldControlRedirectNonUcastFabricTrunkResolve:
    988             if (SOC_IS_TOMAHAWK3(unit)) {
    989                return BCM_E_UNAVAIL;
    990             }
    991             rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
    992             if (BCM_SUCCESS(rv)) {
    993                 *state = soc_reg_field_get(unit,
    994                                        ifp_dst_action_reg,
    995                                        reg_val,
    996                                        HGTRUNK_RES_ENf);
    997             }
    998             break;
    999         case bcmFieldControlRedirectExcludeSrcPort:
   1000 #if defined (BCM_TOMAHAWK3_SUPPORT)
   1001             if (SOC_IS_TOMAHAWK3(unit)) {
   1002                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1003             } else
   1004 #endif
   1005             {
   1006                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1007             }
   1008             if (BCM_SUCCESS(rv)) {
   1009                 *state = soc_reg_field_get(unit,
   1010                                        ifp_dst_action_reg,
   1011                                        reg_val,
   1012                                        SRC_REMOVAL_ENf);
   1013             }
   1014             break;
   1015         case bcmFieldControlRedirectExcludeEtherSrcPort:
   1016 #if defined (BCM_TOMAHAWK3_SUPPORT)
   1017             if (SOC_IS_TOMAHAWK3(unit)) {
   1018                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1019             } else
   1020 #endif
   1021             {
   1022                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1023             }
   1024             if (BCM_SUCCESS(rv)) {
   1025                 *state = soc_reg_field_get(unit,
   1026                                        ifp_dst_action_reg,
   1027                                        reg_val,
   1028                                        SRC_REMOVAL_ENf);
   1029             }
   1030             break;
   1031         case bcmFieldControlRedirectExcludeHiGigSrcPort:
   1032 #if defined (BCM_TOMAHAWK3_SUPPORT)
   1033             if (SOC_IS_TOMAHAWK3(unit)) {
   1034                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1035             } else
   1036 #endif
   1037             {
   1038                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1039             }
   1040             if (BCM_SUCCESS(rv)) {
   1041                 *state = soc_reg_field_get(unit,
   1042                                        ifp_dst_action_reg,
   1043                                        reg_val,
   1044                                        HG_SRC_REMOVAL_ENf);
   1045             }
   1046             break;
   1047         case bcmFieldControlRedirectPortFloodBlock:
   1048 #if defined (BCM_TOMAHAWK3_SUPPORT)
   1049             if (SOC_IS_TOMAHAWK3(unit)) {
   1050                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1051             } else
   1052 #endif
   1053             {
   1054                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1055             }
   1056             if (BCM_SUCCESS(rv)) {
   1057                 *state = soc_reg_field_get(unit,
   1058                                        ifp_dst_action_reg,
   1059                                        reg_val,
   1060                                        PORT_BLOCK_ENf);
   1061             }
   1062             break;
   1063         case bcmFieldControlRedirectVlanFloodBlock:
   1064 #if defined (BCM_TOMAHAWK3_SUPPORT)
   1065             if (SOC_IS_TOMAHAWK3(unit)) {
   1066                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1067             } else
   1068 #endif
   1069             {
   1070                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1071             }
   1072             if (BCM_SUCCESS(rv)) {
   1073                 *state = soc_reg_field_get(unit,
   1074                                        ifp_dst_action_reg,
   1075                                        reg_val,
   1076                                        VLAN_BLOCK_ENf);
   1077             }
   1078             break;
   1079         case bcmFieldControlRedirectNextHopExcludeSrcPort:
   1080 #if defined (BCM_TOMAHAWK3_SUPPORT)
   1081             if (SOC_IS_TOMAHAWK3(unit)) {
   1082                 rv = READ_SW_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1083             } else
   1084 #endif
   1085             {
   1086                 rv = READ_SW2_IFP_DST_ACTION_CONTROLr(unit, &reg_val);
   1087             }
   1088             if (BCM_SUCCESS(rv)) {
   1089                 *state = soc_reg_field_get(unit,
   1090                                        ifp_dst_action_reg,
   1091                                        reg_val,
   1092                                        SRC_REMOVAL_EN_FOR_REDIRECT_TO_NHIf);
   1093             }
   1094             break;
   1095        case bcmFieldControlEcmpHashOffset:
   1096            if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) {
   1097                return BCM_E_UNAVAIL;
   1098            }
   1099            rv = READ_IFP_ECMP_HASH_CONTROLr(unit, &reg_val);
   1100            if (BCM_SUCCESS(rv)) {
   1101               *state = soc_reg_field_get(unit, IFP_ECMP_HASH_CONTROLr,
   1102                                              reg_val, ECMP_HASH_SALTf);
   1103            }
   1104            break;
   1105        case bcmFieldControlEcmpHashUseCrc:
   1106            if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) {
   1107                return BCM_E_UNAVAIL;
   1108            }
   1109            rv = READ_IFP_ECMP_HASH_CONTROLr(unit, &reg_val);
   1110            if (BCM_SUCCESS(rv)) {
   1111               *state = soc_reg_field_get(unit, IFP_ECMP_HASH_CONTROLr,
   1112                                              reg_val, USE_CRCf);
   1113            }
   1114            break;
   1115        case bcmFieldControlEcmpHashUseUpper5Bits:
   1116            if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) {
   1117                return BCM_E_UNAVAIL;
   1118            }
   1119            rv = READ_IFP_ECMP_HASH_CONTROLr(unit, &reg_val);
   1120            if (BCM_SUCCESS(rv)) {
   1121               *state = soc_reg_field_get(unit, IFP_ECMP_HASH_CONTROLr,
   1122                                              reg_val, USE_UPPERf);
   1123            }
   1124            break;
   1125        case bcmFieldControlEcmpHashEnable:
   1126            if ((SOC_IS_TOMAHAWKPLUS(unit)) || (SOC_IS_TOMAHAWK3(unit))) {
   1127                return BCM_E_UNAVAIL;
   1128            }
   1129            rv = READ_IFP_ECMP_HASH_CONTROLr(unit, &reg_val);
   1130            if (BCM_SUCCESS(rv)) {
   1131               *state = soc_reg_field_get(unit, IFP_ECMP_HASH_CONTROLr,
   1132                                              reg_val, ENABLEf);
   1133            }
   1134            break;
   1135 
   1136     case bcmFieldControlDlbMonitorIngressRandomSeed:
   1137            if(SOC_REG_IS_VALID(unit, DLB_ECMP_MONITOR_IFP_CONTROLr)) {
   1138                rv = READ_DLB_ECMP_MONITOR_IFP_CONTROLr(unit, &reg_val);
   1139                if (BCM_SUCCESS(rv)) {
   1140                    *state = soc_reg_field_get(unit, DLB_ECMP_MONITOR_IFP_CONTROLr,
   1141                                                    reg_val, SEEDf);
   1142                }
   1143            }
   1144            break;
   1145     case bcmFieldControlGbpSrcMacMcastBitSet:
   1146 #if defined(BCM_TRIDENT3_SUPPORT)
   1147            if(SOC_REG_IS_VALID(unit, EGR_GBP_CONTROLr)) {
   1148                rv = READ_EGR_GBP_CONTROLr(unit, &reg_val);
   1149                if (BCM_SUCCESS(rv)) {
   1150                    *state = soc_reg_field_get(unit, EGR_GBP_CONTROLr,
   1151                                                    reg_val, GBP_SID_DID_CHECK_POLICYf);
   1152                }
   1153            }
   1154 #endif /* (BCM_TRIDENT3_SUPPORT) */
   1155            break;
   1156        default:
   1157             rv = _bcm_field_control_get(unit, fc, control, state);
   1158     }
   1159 
   1160     return rv;
   1161 
   1162 }
   1163 /*
   1164  * Function:
   1165  *    _field_th_instance_counters_deinit
   1166  *
   1167  * Purpose:
   1168  *    Free instance counter usage bitmap resource.
   1169  *
   1170  * Parameters:
   1171  *    unit     - (IN) BCM device number.
   1172  *    stage_fc - (IN/OUT) Stage field control structure.
   1173  *    inst     - (IN) Device stage instance information.
   1174  *
   1175  * Returns:
   1176  *    BCM_E_PARAM  - Invalid instance number.
   1177  *    BCM_E_NONE   - Success.
   1178  */
   1179 STATIC int
   1180 _field_th_instance_counters_deinit(int unit, _field_stage_t *stage_fc, int inst)
   1181 {
   1182     int slice; /* Slice iterator. */
   1183 
   1184     /* Input parameter check. */
   1185     if (NULL == stage_fc) {
   1186         return (BCM_E_NONE);
   1187     }
   1188 
   1189     /* Validate instance value. */
   1190     if (inst < 0 || inst >= stage_fc->num_instances) {
   1191         return (BCM_E_PARAM);
   1192     }
   1193 
   1194     /* Make sure slices array is initialized.*/
   1195     if (NULL == stage_fc->slices[inst]) {
   1196         return (BCM_E_NONE);
   1197     }
   1198 
   1199     /* Destroy 64 bit counters. */
   1200     _bcm_field_counter_collect_deinit(unit, stage_fc);
   1201 
   1202     if (_BCM_FIELD_STAGE_EGRESS == stage_fc->stage_id) {
   1203         if (NULL != stage_fc->slices[inst][0].counter_bmp.w) {
   1204             sal_free(stage_fc->slices[inst][0].counter_bmp.w);
   1205         }
   1206 
   1207         for (slice = 0; slice < stage_fc->tcam_slices; slice++) {
   1208             stage_fc->slices[inst][slice].counter_bmp.w = NULL;
   1209         }
   1210     }
   1211 
   1212     return (BCM_E_NONE);
   1213 }
   1214 
   1215 _field_counter_hw_mode_t th_ingress_cntr_hw_mode_tbl[] = {
   1216     /* (R_COUNTER_OFS = 0, Y_COUNTER_OFS = 0, G_COUNTER_OFS = 1) */
   1217     { BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes),
   1218       1, _bcmFieldStatColorGreen
   1219     },
   1220     /* (R_COUNTER_OFS = 0, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 0) */
   1221     { BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes),
   1222       1, _bcmFieldStatColorYellow
   1223     },
   1224     /* (R_COUNTER_OFS = 0, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 1) */
   1225     { BIT(bcmFieldStatNotRedPackets) | BIT(bcmFieldStatNotRedBytes),
   1226       1, _bcmFieldStatColorNotRed
   1227     },
   1228     /* (R_COUNTER_OFS = 0, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 1) */
   1229     { BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes)
   1230       | BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes)
   1231       | BIT(bcmFieldStatNotRedPackets) | BIT(bcmFieldStatNotRedBytes),
   1232       2, _bcmFieldStatColorGreenYellow
   1233     },
   1234     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 0, G_COUNTER_OFS = 0) */
   1235     { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes),
   1236       1, _bcmFieldStatColorRed
   1237     },
   1238     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 0, G_COUNTER_OFS = 1) */
   1239     { BIT(bcmFieldStatNotYellowPackets) | BIT(bcmFieldStatNotYellowBytes),
   1240       1, _bcmFieldStatColorNotYellow
   1241     },
   1242     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 0, G_COUNTER_OFS = 2) */
   1243     { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes)
   1244       | BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes)
   1245       | BIT(bcmFieldStatNotYellowPackets) | BIT(bcmFieldStatNotYellowBytes),
   1246       2, _bcmFieldStatColorGreenRed
   1247     },
   1248     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 0) */
   1249     { BIT(bcmFieldStatNotGreenPackets) | BIT(bcmFieldStatNotGreenBytes),
   1250       1, _bcmFieldStatColorNotGreen
   1251     },
   1252     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 1) */
   1253     { BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes),
   1254       1, _bcmFieldStatColorNoColor
   1255     },
   1256     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 1, G_COUNTER_OFS = 2) */
   1257     { BIT(bcmFieldStatNotGreenPackets) | BIT(bcmFieldStatNotGreenBytes)
   1258       | BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes)
   1259       | BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes),
   1260       2, _bcmFieldStatColorGreenNotGreen
   1261     },
   1262     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 0) */
   1263     { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes)
   1264       | BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes)
   1265       | BIT(bcmFieldStatNotGreenPackets) | BIT(bcmFieldStatNotGreenBytes),
   1266       2, _bcmFieldStatColorYellowRed
   1267     },
   1268     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 1) */
   1269     { BIT(bcmFieldStatNotYellowPackets) | BIT(bcmFieldStatNotYellowBytes)
   1270       | BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes)
   1271       | BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes),
   1272       2, _bcmFieldStatColorYellowNotYellow
   1273     },
   1274     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 2) */
   1275     { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes)
   1276       | BIT(bcmFieldStatNotRedPackets) | BIT(bcmFieldStatNotRedBytes)
   1277       | BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes),
   1278       2, _bcmFieldStatColorRedNotRed
   1279     },
   1280     /* (R_COUNTER_OFS = 1, Y_COUNTER_OFS = 2, G_COUNTER_OFS = 3) */
   1281     { BIT(bcmFieldStatRedPackets) | BIT(bcmFieldStatRedBytes)
   1282       | BIT(bcmFieldStatYellowPackets) | BIT(bcmFieldStatYellowBytes)
   1283       | BIT(bcmFieldStatGreenPackets) | BIT(bcmFieldStatGreenBytes)
   1284       | BIT(bcmFieldStatNotRedPackets) | BIT(bcmFieldStatNotRedBytes)
   1285       | BIT(bcmFieldStatNotYellowPackets) | BIT(bcmFieldStatNotYellowBytes)
   1286       | BIT(bcmFieldStatNotGreenPackets) | BIT(bcmFieldStatNotGreenBytes)
   1287       | BIT(bcmFieldStatPackets) | BIT(bcmFieldStatBytes),
   1288       3, _bcmFieldStatColorGreenYellowRed
   1289     }
   1290 };
   1291 
   1292 int th_ingress_cntr_hw_mode_tbl_size = COUNTOF(th_ingress_cntr_hw_mode_tbl);
   1293 
   1294 #ifdef BCM_TOMAHAWK_SUPPORT
   1295 STATIC int
   1296 _field_stage_meter_pool_clean(int unit, _field_stage_id_t stage_id,
   1297                               int pipe, int pool) {
   1298 
   1299     _field_stage_t *stage_ptr = NULL;
   1300     int meter_pairs_per_pool = 0;
   1301     int size = 0;
   1302 
   1303     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   1304         meter_pairs_per_pool = BCM_FIELD_INGRESS_TD3_NUM_METER_PAIRS_PER_POOL;
   1305     } else {
   1306         meter_pairs_per_pool = BCM_FIELD_INGRESS_TH_NUM_METER_PAIRS_PER_POOL;
   1307     }
   1308 
   1309     /* Initialize number of meter per pool.*/
   1310     size = SHR_BITALLOCSIZE(meter_pairs_per_pool << 1);
   1311 
   1312     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit,
   1313                         stage_id , &stage_ptr));
   1314 
   1315     sal_memset(stage_ptr->meter_pool[pipe][pool]->meter_bmp.w,
   1316                0, size);
   1317     stage_ptr->meter_pool[pipe][pool]->level = 0;
   1318     stage_ptr->meter_pool[pipe][pool]->slice_id = 0;
   1319     stage_ptr->meter_pool[pipe][pool]->size = 0;
   1320     stage_ptr->meter_pool[pipe][pool]->pool_size = 0;
   1321     stage_ptr->meter_pool[pipe][pool]->free_meters = 0;
   1322     stage_ptr->meter_pool[pipe][pool]->num_meter_pairs = 0;
   1323 
   1324     return BCM_E_NONE;
   1325 
   1326 }
   1327 
   1328 STATIC int
   1329 _field_stage_meter_pool_copy(int unit,  _field_stage_id_t stage_id_from,
   1330                             _field_stage_t *stage_ptr_to, int pipe,
   1331                              int pool) {
   1332 
   1333     _field_stage_t *stage_ptr_from = NULL;
   1334     int meter_pairs_per_pool = 0;
   1335     int size = 0;
   1336 
   1337     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   1338         meter_pairs_per_pool = BCM_FIELD_INGRESS_TD3_NUM_METER_PAIRS_PER_POOL;
   1339     } else {
   1340         meter_pairs_per_pool = BCM_FIELD_INGRESS_TH_NUM_METER_PAIRS_PER_POOL;
   1341     }
   1342 
   1343     /* Initialize number of meter per pool.*/
   1344     size = SHR_BITALLOCSIZE(meter_pairs_per_pool << 1);
   1345 
   1346     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit,
   1347                         stage_id_from , &stage_ptr_from));
   1348 
   1349     sal_memcpy(stage_ptr_to->meter_pool[pipe][pool]->meter_bmp.w,
   1350                stage_ptr_from->meter_pool[pipe][pool]->meter_bmp.w,
   1351                size);
   1352     stage_ptr_to->meter_pool[pipe][pool]->level =
   1353      stage_ptr_from->meter_pool[pipe][pool]->level;
   1354     stage_ptr_to->meter_pool[pipe][pool]->slice_id =
   1355      stage_ptr_from->meter_pool[pipe][pool]->slice_id;
   1356     stage_ptr_to->meter_pool[pipe][pool]->size =
   1357      stage_ptr_from->meter_pool[pipe][pool]->size;
   1358     stage_ptr_to->meter_pool[pipe][pool]->pool_size =
   1359      stage_ptr_from->meter_pool[pipe][pool]->pool_size;
   1360     stage_ptr_to->meter_pool[pipe][pool]->free_meters =
   1361      stage_ptr_from->meter_pool[pipe][pool]->free_meters;
   1362     stage_ptr_to->meter_pool[pipe][pool]->num_meter_pairs =
   1363      stage_ptr_from->meter_pool[pipe][pool]->num_meter_pairs;
   1364 
   1365     return BCM_E_NONE;
   1366 
   1367  }
   1368 #endif
   1369 
   1370 /*
   1371  * Function:
   1372  *    _field_th_instance_global_meters_deinit
   1373  *
   1374  * Purpose:
   1375  *    Free instance meters usage bitmap.
   1376  *
   1377  * Parameters:
   1378  *    unit     - (IN) BCM device number.
   1379  *    stage_fc - (IN/OUT) Stage field control structure.
   1380  *    inst     - (IN) Device stage instance information.
   1381  *
   1382  * Returns:
   1383  *    BCM_E_PARAM  - Invalid instance number.
   1384  *    BCM_E_NONE   - Success.
   1385  */
   1386 STATIC int
   1387 _field_th_instance_global_meters_deinit(int unit, _field_stage_t *stage_fc, int inst)
   1388 {
   1389     int pipe = -1;
   1390     int pool = -1;
   1391     int rv = 0;
   1392     _field_meter_pool_t *mp; /* Meter pool structure pointer. */
   1393     _field_control_t *fc; /* Field Control Structure */
   1394 
   1395     for (pipe = 0; pipe < _FP_MAX_NUM_PIPES; pipe++) {
   1396 
   1397        if ((stage_fc->oper_mode == bcmFieldGroupOperModePipeLocal)
   1398             && (pipe != inst)) {
   1399             continue;
   1400        }
   1401        for (pool = 0; pool < stage_fc->num_meter_pools; pool++) {
   1402             /* Get the pipeance meter pool structure pointer. */
   1403             mp = stage_fc->meter_pool[pipe][pool];
   1404             if (NULL != mp) {
   1405                 if (NULL != mp->meter_bmp.w) {
   1406                     sal_free(mp->meter_bmp.w);
   1407                 }
   1408                 sal_free(mp);
   1409                 stage_fc->meter_pool[pipe][pool] = NULL;
   1410             }
   1411         }
   1412 
   1413         /* Get field control structure. */
   1414         BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
   1415 
   1416         for (pool = 0; pool < _FIELD_MAX_METER_POOLS; pool++) {
   1417 
   1418             if ((stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) &&
   1419                 (fc->ifp_em_meter_in_use[pipe][pool] == 
   1420                  BCM_FIELD_METER_POOL_USED_BY_IFP)) {
   1421                  /* Clean up meter pools used by IFP */
   1422                  rv = (_field_stage_meter_pool_clean
   1423                                      (unit, _BCM_FIELD_STAGE_EXACTMATCH,
   1424                                      pipe, pool));
   1425                  if (BCM_SUCCESS(rv) && (!(SOC_WARM_BOOT(unit)))) {
   1426                      fc->ifp_em_meter_in_use[pipe][pool] =
   1427                      BCM_FIELD_METER_POOL_USED_BY_NONE;
   1428                  } else {
   1429                      return rv;
   1430                  }
   1431             } else if ((stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) &&
   1432                  (fc->ifp_em_meter_in_use[pipe][pool] == 
   1433                  BCM_FIELD_METER_POOL_USED_BY_EM)) {
   1434                  /* Clean up meter pools used by EM */
   1435                  rv = (_field_stage_meter_pool_clean
   1436                                     (unit, _BCM_FIELD_STAGE_INGRESS,
   1437                                      pipe, pool));
   1438                  if (BCM_SUCCESS(rv) && (!(SOC_WARM_BOOT(unit)))) {
   1439                      fc->ifp_em_meter_in_use[pipe][pool] =
   1440                      BCM_FIELD_METER_POOL_USED_BY_NONE;
   1441                  } else {
   1442                      return rv;
   1443                  }
   1444             }
   1445         }
   1446      }
   1447      return (BCM_E_NONE);
   1448     
   1449 }
   1450 
   1451 
   1452 /*
   1453  * Function:
   1454  *    _field_th_instance_meters_deinit
   1455  *
   1456  * Purpose:
   1457  *    Free instance meters usage bitmap.
   1458  *
   1459  * Parameters:
   1460  *    unit     - (IN) BCM device number.
   1461  *    stage_fc - (IN/OUT) Stage field control structure.
   1462  *    inst     - (IN) Device stage instance information.
   1463  *
   1464  * Returns:
   1465  *    BCM_E_PARAM  - Invalid instance number.
   1466  *    BCM_E_NONE   - Success.
   1467  */
   1468 STATIC int
   1469 _field_th_instance_meters_deinit(int unit, _field_stage_t *stage_fc, int inst)
   1470 {
   1471     int slice; /* Slice iterator. */
   1472     _field_slice_t *fs; /* Slice configuration structure. */
   1473 
   1474     /* Input parameter check. */
   1475     if (NULL == stage_fc) {
   1476         return (BCM_E_NONE);
   1477     }
   1478 
   1479     /* Validate instance value. */
   1480     if (inst < 0 || inst >= stage_fc->num_instances) {
   1481         return (BCM_E_PARAM);
   1482     }
   1483 
   1484     /* Make sure slices array is initialized.*/
   1485     if (NULL == stage_fc->slices[inst]) {
   1486         return (BCM_E_NONE);
   1487     }
   1488 
   1489     /* Free IFP meter pools belonging to instance. */
   1490     if (stage_fc->flags & _FP_STAGE_GLOBAL_METER_POOLS) {
   1491         return (_field_th_instance_global_meters_deinit(unit,
   1492                                                         stage_fc,
   1493                                                         inst));
   1494     }
   1495 
   1496     /* Free EFP meter usage bitmap resources belonging to an instance. */
   1497     for (slice = 0; slice < stage_fc->tcam_slices; slice++) {
   1498         fs = stage_fc->slices[inst] + slice;
   1499         if (NULL != fs->meter_bmp.w) {
   1500             sal_free(fs->meter_bmp.w);
   1501         }
   1502         fs->meter_bmp.w = NULL;
   1503     }
   1504     return (BCM_E_NONE);
   1505 }
   1506 
   1507 /*
   1508  * Function:
   1509  *    _field_th_instance_entries_free
   1510  *
   1511  * Purpose:
   1512  *    Free entries array for all slices in an instance.
   1513  *
   1514  * Parameters:
   1515  *    unit     - (IN) BCM device number.
   1516  *    stage_fc - (IN) Stage field control structure.
   1517  *    inst - (IN) Device stage instance number information.
   1518  *
   1519  * Returns:
   1520  *    BCM_E_PARAM - Device stage control information is NULL.
   1521  *    BCM_E_NONE  - Success.
   1522  */
   1523 STATIC int
   1524 _field_th_instance_entries_free(int unit,
   1525                                 _field_stage_t *stage_fc,
   1526                                 int inst)
   1527 {
   1528     _field_slice_t *fs; /* Field Slice Pointer. */
   1529     int slice; /* Slice iterator. */
   1530 
   1531     /* Input parameters check. */
   1532     if (NULL == stage_fc) {
   1533         return (BCM_E_PARAM);
   1534     }
   1535 
   1536     /* Validate instance value. */
   1537     if (inst < 0 || inst >= stage_fc->num_instances) {
   1538         return (BCM_E_PARAM);
   1539     }
   1540 
   1541     /* Deallocate instance entry pointers. */
   1542     for (slice = 0; slice < stage_fc->tcam_slices; slice++) {
   1543         fs = stage_fc->slices[inst] + slice;
   1544         if (NULL != fs->entries) {
   1545             sal_free(fs->entries);
   1546             fs->entries = NULL;
   1547         }
   1548     }
   1549     return (BCM_E_NONE);
   1550 }
   1551 
   1552 /*
   1553  * Function:
   1554  *    _field_th_instance_prio_mgmt_deinit
   1555  *
   1556  * Purpose:
   1557  *    Free memory used by priority management in an instance.
   1558  *
   1559  * Parameters:
   1560  *    unit     - (IN) BCM device number.
   1561  *    stage_fc - (IN) Stage field control structure.
   1562  *    inst     - (IN) Device stage instance number information.
   1563  *
   1564  * Returns:
   1565  *     BCM_E_PARAM - Stage control null or invalid instance.
   1566  *     BCM_E_NONE - Success.
   1567  */
   1568 STATIC int
   1569 _field_th_instance_prio_mgmt_deinit(int unit,
   1570                                     _field_stage_t *stage_fc,
   1571                                     int inst)
   1572 {
   1573     int slice; /* Slice iterator. */
   1574     _field_prio_mgmt_t *prio1, *prio2;
   1575 
   1576     /* Input parameters check. */
   1577     if (NULL == stage_fc) {
   1578         return (BCM_E_PARAM);
   1579     }
   1580 
   1581     /* Validate instance value. */
   1582     if (inst < 0 || inst >= stage_fc->num_instances) {
   1583         return (BCM_E_PARAM);
   1584     }
   1585 
   1586     if (_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) {
   1587         /* To be handled as part of IFP Group implementation. */
   1588         return (BCM_E_NONE);
   1589     }
   1590 
   1591     for (slice = 0; slice < stage_fc->tcam_slices; slice++) {
   1592         prio1 = stage_fc->slices[inst][slice].prio_mgmt;
   1593         while (prio1 != NULL) {
   1594             prio2 = prio1->next;
   1595             sal_free(prio1);
   1596             prio1 = prio2;
   1597         }
   1598         stage_fc->slices[inst][slice].prio_mgmt = NULL;
   1599     }
   1600 
   1601     return (BCM_E_NONE);
   1602 }
   1603 /*
   1604  * Function:
   1605  *     _bcm_field_th_eh_mask_profile_hw_alloc
   1606  *
   1607  * Purpose:
   1608  *     Allocate hw resources for HiGiG2 extended header mask.
   1609  *
   1610  * Parameters:
   1611  *     unit       - (IN) BCM device number.
   1612  *     f_ent      - (IN) Field entry control structure.
   1613  * Returns:
   1614  *     BCM_E_XXX
   1615  */
   1616 int
   1617 _bcm_field_th_eh_mask_profile_hw_alloc(int unit, _field_entry_t *f_ent)
   1618 {
   1619     int rv = BCM_E_NONE; /* Operational Status. */
   1620     int ref_count; /* eh mask profile reference count. */
   1621     _field_action_t *fa; /* Field actions pointer */
   1622     void *entry_ptr; /* pointer to EH_MASK_PROFILE table entry. */
   1623     _field_control_t *fc = NULL; /* Field Control Structure */
   1624 
   1625     /* parameters check. */
   1626     if (NULL == f_ent) {
   1627         return BCM_E_PARAM;
   1628     }
   1629 
   1630     /* HiGiG2 extended header mask profile table isonly valid for IFP. */
   1631     if (_BCM_FIELD_STAGE_INGRESS != f_ent->group->stage_id) {
   1632         return BCM_E_NONE;
   1633     }
   1634 
   1635     /* Go through all the actions in field entry. */
   1636     for (fa = f_ent->actions;
   1637          NULL != fa && _FP_ACTION_VALID & fa->flags;
   1638          fa = fa->next) {
   1639 
   1640         if (bcmFieldActionFabricEHAddOrUpdate == fa->action) {
   1641 
   1642             /*
   1643              * Store previous hardware index value in old_index.
   1644              */
   1645             fa->old_index = fa->hw_index;
   1646 
   1647             /* Get field control structure. */
   1648             rv = _field_control_get(unit, &fc);
   1649             BCM_IF_ERROR_RETURN(rv);
   1650 
   1651             /* EH mask will come as action parameter 1 for which
   1652              * profile entry needs to be created. */
   1653             entry_ptr = fa->param + 1;
   1654 
   1655             rv = soc_profile_mem_add(unit,
   1656                                     &fc->eh_mask_profile,
   1657                                     &entry_ptr, 1,
   1658                                     (uint32 *)&fa->hw_index);
   1659             if ((BCM_E_RESOURCE == rv) &&
   1660                 (_FP_INVALID_INDEX != fa->old_index)) {
   1661                 /* Destroy old profile ONLY
   1662                  * if it is not used by other entries.
   1663                  */
   1664 
   1665                 rv = soc_profile_mem_ref_count_get(unit,
   1666                                                    &fc->eh_mask_profile,
   1667                                                    fa->old_index, &ref_count);
   1668 
   1669                 BCM_IF_ERROR_RETURN(rv);
   1670 
   1671                 if (ref_count > 1) {
   1672                     return (BCM_E_RESOURCE);
   1673                 }
   1674 
   1675                 rv = soc_profile_mem_delete(unit,
   1676                                             &fc->eh_mask_profile,
   1677                                             fa->old_index);
   1678                 BCM_IF_ERROR_RETURN(rv);
   1679 
   1680                 /* Destroy old profile is no longer required. */
   1681                 fa->old_index = _FP_INVALID_INDEX;
   1682 
   1683                 /* Reallocate profile for new action. */
   1684                 rv = soc_profile_mem_add(unit,
   1685                                          &fc->eh_mask_profile,
   1686                                          &entry_ptr, 1,
   1687                                          (uint32*)&fa->hw_index);
   1688                 BCM_IF_ERROR_RETURN(rv);
   1689             }
   1690             break;
   1691         }
   1692     }
   1693 
   1694     return rv;
   1695 }
   1696 /*
   1697  * Function:
   1698  *     _bcm_field_th_eh_mask_profile_hw_free
   1699  *
   1700  * Purpose:
   1701  *     Free hw resources created for HiGiG2 extended header mask used in
   1702  *     bcmFieldActionFabricEHAddOrUpdate action.
   1703  *
   1704  * Parameters:
   1705  *     unit       - (IN) BCM device number.
   1706  *     f_ent      - (IN) field entry control.
   1707  *     fflags     - (IN) field entry action flags to free the h/w resources.
   1708  * Returns:
   1709  *     BCM_E_XXX
   1710  */
   1711 int
   1712 _bcm_field_th_eh_mask_profile_hw_free(int unit,
   1713                                       _field_entry_t *f_ent, uint32 flags)
   1714 {
   1715     int rv = BCM_E_NONE; /*  Operational Status */
   1716     _field_action_t *fa;   /* Field actions pointer */
   1717     _field_control_t *fc = NULL; /* Field Control Structure */
   1718 
   1719     /* Parameters check. */
   1720     if (NULL == f_ent) {
   1721         return BCM_E_PARAM;
   1722     }
   1723 
   1724     /* HiGiG2 extended header mask profile table isonly valid for IFP. */
   1725     if (_BCM_FIELD_STAGE_INGRESS != f_ent->group->stage_id) {
   1726         return BCM_E_NONE;
   1727     }
   1728 
   1729     /* Go through all actions in the entry. */
   1730     for (fa = f_ent->actions; NULL != fa; fa = fa->next) {
   1731         /* Clear h/w resource only if the action is
   1732          * bcmFieldActionFabricEHAddOrUpdate */
   1733         if (bcmFieldActionFabricEHAddOrUpdate == fa->action) {
   1734 
   1735             /* Get field control structure. */
   1736             rv = _field_control_get(unit, &fc);
   1737             BCM_IF_ERROR_RETURN(rv);
   1738 
   1739             /* Free current resources. */
   1740             if ((flags & _FP_ACTION_RESOURCE_FREE) &&
   1741                 (_FP_INVALID_INDEX != fa->hw_index)) {
   1742                 rv = soc_profile_mem_delete(unit,
   1743                                             &fc->eh_mask_profile,
   1744                                             fa->hw_index);
   1745                 BCM_IF_ERROR_RETURN(rv);
   1746                 fa->hw_index = _FP_INVALID_INDEX;
   1747             }
   1748 
   1749             /* Free Old resources. */
   1750             if ((flags & _FP_ACTION_OLD_RESOURCE_FREE) &&
   1751                 (_FP_INVALID_INDEX != fa->old_index)) {
   1752                 rv = soc_profile_mem_delete(unit,
   1753                                             &fc->eh_mask_profile,
   1754                                             fa->old_index);
   1755                 BCM_IF_ERROR_RETURN(rv);
   1756                 fa->old_index = _FP_INVALID_INDEX;
   1757             }
   1758             break;
   1759         }
   1760     }
   1761 
   1762     return rv;
   1763 }
   1764 /*
   1765  * Function:
   1766  *     _bcm_field_th_data_qualifier_hw_alloc
   1767  *
   1768  * Purpose:
   1769  *     Allocate hw resources for data qualifier installation
   1770  *
   1771  * Parameters:
   1772  *     unit       - (IN) BCM device number.
   1773  *     stage_fc   - (IN) Stage field control.
   1774  *     f_dq       - (IN) Field data qualifier descriptor.
   1775  * Returns:
   1776  *     BCM_E_XXX
   1777  */
   1778 
   1779 int
   1780 _bcm_field_th_data_qualifier_hw_alloc(int unit,
   1781                                       _field_stage_t *stage_fc,
   1782                                       _field_data_qualifier_t *f_dq)
   1783 {
   1784     int         idx;                            /* Data qualifier word iterator.            */
   1785     int         elem_count;                     /* Number of elements allocated.            */
   1786     int         temp_elem_count = 0;            /* Number of elements allocated.            */
   1787     uint32      *usage_bmap;                    /* Offset usage bitmap.                     */
   1788     SHR_BITDCL  bit16_chunks_free;              /* Bitmap of free 16 bit chunks             */
   1789     SHR_BITDCL  bit32_chunks_free;              /* Bitmap of free 32 bit chunks             */
   1790     SHR_BITDCL  bit32_chunks_free_partially;    /* Bitmap of 32 bit chunks free partially   */
   1791 
   1792     /* Input parameters check. */
   1793     if ((NULL == f_dq) || (NULL == stage_fc)) {
   1794         return (BCM_E_PARAM);
   1795     }
   1796 
   1797      memset(&bit16_chunks_free, 0x0, sizeof(bit16_chunks_free));
   1798      memset(&bit32_chunks_free, 0x0, sizeof(bit32_chunks_free));
   1799      memset(&bit32_chunks_free_partially, 0x0, sizeof(bit32_chunks_free_partially));
   1800 
   1801     elem_count = 0;
   1802     /* coverity[assign]: FALSE*/
   1803     usage_bmap = &stage_fc->data_ctrl->usage_bmap;
   1804 
   1805     /* Loop through the usage_bmap and calculate the number of elements
   1806      * which are free to be allocated*/
   1807     for (idx = 0; idx <= 15; idx++) {
   1808         if (0 == ((*usage_bmap) & (1 << idx))) {
   1809             elem_count++;
   1810         }
   1811     }
   1812 
   1813     /* Loop through the usage_bmap and identify which of the 16_bit(Chunks 0,1,8,9)
   1814      * chunks are free to be allocated and set the corresponding idx in
   1815      * bit16_chunks_free*/
   1816 
   1817     for (idx =0; idx <= 15; idx++) {
   1818         if (idx == 0x0 || idx == 0x1 || idx == 0x8 || idx == 0x9) {
   1819             if (SHR_BITGET(usage_bmap, idx) == 0) {
   1820                 /* coverity[ptr_arith] we check only from 0 to 15 idx and
   1821                  * there are only 16 elements in UDF currently*/
   1822                  SHR_BITSET(&bit16_chunks_free, idx);
   1823             }
   1824         }
   1825     }
   1826 
   1827     /* Loop through the usage_bmap and identify which of the 32_bit chunks (Chunks
   1828      * other than 0,1,8,9) are free to be allocated. For a 32 bit chunk to be free fully
   1829      * both elems in idx and idx+1 should be free. If either one of them is free, then
   1830      * it is taken as a partially free 32 bit chunk*/
   1831 
   1832     for (idx =0; idx < 15; idx += 2) {
   1833         if (idx != 0x0 && idx != 0x1 && idx != 0x8 && idx != 0x9) {
   1834             if ((SHR_BITGET(usage_bmap, idx) == 0) &&
   1835                 (SHR_BITGET(usage_bmap, idx + 1) == 0)) {
   1836                 /* coverity[ptr_arith] we check only from 0 to 15 idx and
   1837                  * there are only 16 elements in UDF currently*/
   1838                  SHR_BITSET(&bit32_chunks_free, idx);
   1839                 /* coverity[ptr_arith] we check only from 0 to 15 idx and
   1840                  * there are only 16 elements in UDF currently*/
   1841                  SHR_BITSET(&bit32_chunks_free, (idx+1));
   1842             } else if (SHR_BITGET(usage_bmap, idx) == 0) {
   1843                 /* coverity[ptr_arith] we check only from 0 to 15 idx and
   1844                  * there are only 16 elements in UDF currently*/
   1845                 SHR_BITSET(&bit32_chunks_free_partially, idx);
   1846             } else if (SHR_BITGET(usage_bmap, idx + 1) == 0) {
   1847                 /* coverity[ptr_arith] we check only from 0 to 15 idx and
   1848                  * there are only 16 elements in UDF currently*/
   1849                 SHR_BITSET(&bit32_chunks_free_partially, (idx+1));
   1850             }
   1851         }
   1852     }
   1853 
   1854     /* Check whether the requested elem count is available. Only if the count
   1855      * requested can be allocated, proceed. */
   1856     if (elem_count >= f_dq->elem_count) {
   1857 
   1858         if (1 == f_dq->elem_count) {
   1859 
   1860             /*Only UDF2.4 through UDF2.7 chunks are specific to Flex Hash Rtag7.
   1861              *Hence only the data qualifiers - Data8 and Data9 can be allocated for
   1862              *Flex Hash. If only one element is requested, the order
   1863              *of allocation is as follows:
   1864              * 1. If any 32 bit chunk is partially free, allocate it.
   1865              * 2. If any 32 bit chunk is free as a whole, allocate it. */
   1866 
   1867             if (f_dq->flags == BCM_FIELD_DATA_QUALIFIER_OFFSET_FLEX_HASH) {
   1868                 for (idx = 12; idx <= 15; idx++) {
   1869                     if (0 != ((bit32_chunks_free_partially) & (1 << idx))) {
   1870                         f_dq->hw_bmap |= (1 << idx);
   1871                         (*usage_bmap) |= (1 << idx);
   1872                          return BCM_E_NONE;
   1873                     }
   1874                 }
   1875 
   1876                 for (idx = 12; idx <= 15; idx++) {
   1877                     if (0 != ((bit32_chunks_free) & (1 << idx))) {
   1878                         f_dq->hw_bmap |= (1 << idx);
   1879                         (*usage_bmap) |= (1 << idx);
   1880                         return BCM_E_NONE;
   1881                     }
   1882                 }
   1883                 return BCM_E_RESOURCE;
   1884             }
   1885 
   1886             /*If only one element is requested, then the order of allocation is as follows:
   1887              * 1. If any 16_bit chunk is free, allocate it.
   1888              * 2. Else If any 32 bit chunk is partially free, allocate it.
   1889              * 3. Else If any 32 bit chunk is free as a whole, allocate it.
   1890              * (UDF2.4 thro UDF2.7 chunks are specific to RTAG7). Hence, in  all the above
   1891              * cases, give first preference to chunks other than those used for RTAGS.
   1892              */
   1893 
   1894             for (idx = 0; idx <= 15; idx++) {
   1895                  if (0 != ((bit16_chunks_free) & (1 << idx))) {
   1896                      f_dq->hw_bmap |= (1 << idx);
   1897                      (*usage_bmap) |= (1 << idx);
   1898                      return BCM_E_NONE;
   1899                  }
   1900 
   1901             }
   1902 
   1903             for (idx = 0; idx <= 11; idx++) {
   1904                  if (0 != ((bit32_chunks_free_partially) & (1 << idx))) {
   1905                      f_dq->hw_bmap |= (1 << idx);
   1906                      (*usage_bmap) |= (1 << idx);
   1907                      return BCM_E_NONE;
   1908                  }
   1909             }
   1910 
   1911             for (idx = 0; idx <= 11; idx++) {
   1912                  if (0 != ((bit32_chunks_free) & (1 << idx))) {
   1913                      f_dq->hw_bmap |= (1 << idx);
   1914                      (*usage_bmap) |= (1 << idx);
   1915                      return BCM_E_NONE;
   1916                  }
   1917             }
   1918 
   1919             for (idx = 12; idx <= 15; idx++) {
   1920                  if (0 != ((bit32_chunks_free_partially) & (1 << idx))) {
   1921                      f_dq->hw_bmap |= (1 << idx);
   1922                      (*usage_bmap) |= (1 << idx);
   1923                      return BCM_E_NONE;
   1924                  }
   1925             }
   1926 
   1927             for (idx = 12; idx <= 15; idx++) {
   1928                  if (0 != ((bit32_chunks_free) & (1 << idx))) {
   1929                      f_dq->hw_bmap |= (1 << idx);
   1930                      (*usage_bmap) |= (1 << idx);
   1931                      return BCM_E_NONE;
   1932                  }
   1933             }
   1934 
   1935         } else {
   1936 
   1937             temp_elem_count = f_dq->elem_count;
   1938 
   1939             /*Only UDF2.4 through UDF2.7 chunks are specific to Flex Hash Rtag7.
   1940              *Hence only the data qualifiers - Data8 and Data9 can be allocated for
   1941              *Flex Hash. */
   1942 
   1943             if (f_dq->flags == BCM_FIELD_DATA_QUALIFIER_OFFSET_FLEX_HASH) {
   1944             /*If more than one element is requested, then the order of allocation is as follows:
   1945              * Save elem_count requested in temp_elem_count and keep decreasing it as we allocate
   1946              *1. Until temp_elem_count is not 1, allocate 32_bit chunks as much as possible
   1947              *2. If more chunks are needed, allocate from 32_bit chunks partially free
   1948              *3. If more chunks are needed, allocate partially from 32_bit chunks fully free
   1949              */
   1950                 for (idx = 12; idx < 15; idx += 2) {
   1951                     if (1 != temp_elem_count) {
   1952                         if ((0 != ((bit32_chunks_free) & (1 << idx))) &&
   1953                             (0 != ((bit32_chunks_free) & (1 << (idx + 1))))) {
   1954                             f_dq->hw_bmap |= (1 << idx);
   1955                             (*usage_bmap) |= (1 << idx);
   1956                             f_dq->hw_bmap |= (1 << (idx + 1));
   1957                             (*usage_bmap) |= (1 << (idx + 1));
   1958                             SHR_BITCLR(&bit32_chunks_free, idx);
   1959                             SHR_BITCLR(&bit32_chunks_free, idx+1);
   1960                             temp_elem_count = temp_elem_count - 2;
   1961                         }
   1962                     }
   1963 
   1964                     if (0 == temp_elem_count) {
   1965                         return BCM_E_NONE;
   1966                     }
   1967                 }
   1968 
   1969                 for (idx = 12; idx <= 15; idx++) {
   1970                     if (0 != ((bit32_chunks_free_partially) & (1 << idx))) {
   1971                         f_dq->hw_bmap |= (1 << idx);
   1972                         (*usage_bmap) |= (1 << idx);
   1973                         temp_elem_count = temp_elem_count - 1;
   1974                     }
   1975 
   1976                     if (0 == temp_elem_count) {
   1977                         return BCM_E_NONE;
   1978                     }
   1979                 }
   1980 
   1981                 for (idx = 12; idx <= 15; idx++) {
   1982                     if (0 != ((bit32_chunks_free) & (1 << idx))) {
   1983                         f_dq->hw_bmap |= (1 << idx);
   1984                         (*usage_bmap) |= (1 << idx);
   1985                         temp_elem_count = temp_elem_count - 1;
   1986                     }
   1987 
   1988                     if (0 == temp_elem_count) {
   1989                         return BCM_E_NONE;
   1990                     }
   1991                 }
   1992                 return BCM_E_RESOURCE;
   1993             }
   1994 
   1995             /*If more than one element is requested, then the order of allocation is as follows:
   1996              * Save elem_count requested in temp_elem_count and keep decreasing it as we allocate
   1997              *1. Until temp_elem_count is not 1, allocate 32_bit chunks as much as possible
   1998              *2. If more chunks are needed, allocate from 16_bit chunks
   1999              *3. If more chunks are needed, allocate from 32_bit chunks partially free
   2000              *4. If more chunks are needed, allocate partially from 32_bit chunks fully free
   2001              */
   2002 
   2003             for (idx = 0; idx < 11; idx += 2) {
   2004                 if (1 != temp_elem_count) {
   2005                     if ((0 != ((bit32_chunks_free) & (1 << idx))) &&
   2006                         (0 != ((bit32_chunks_free) & (1 << (idx + 1))))) {
   2007                         f_dq->hw_bmap |= (1 << idx);
   2008                         (*usage_bmap) |= (1 << idx);
   2009                         f_dq->hw_bmap |= (1 << (idx + 1));
   2010                         (*usage_bmap) |= (1 << (idx + 1));
   2011                         SHR_BITCLR(&bit32_chunks_free, idx);
   2012                         SHR_BITCLR(&bit32_chunks_free, idx+1);
   2013                         temp_elem_count = temp_elem_count - 2;
   2014                     }
   2015 
   2016                     if (0 == temp_elem_count) {
   2017                         return BCM_E_NONE;
   2018                     }
   2019                 }
   2020             }
   2021 
   2022             for (idx = 0; idx <= 15; idx++) {
   2023                 if (0 != ((bit16_chunks_free) & (1 << idx))) {
   2024                     f_dq->hw_bmap |= (1 << idx);
   2025                     (*usage_bmap) |= (1 << idx);
   2026                     temp_elem_count = temp_elem_count - 1;
   2027                 }
   2028 
   2029                 if (0 == temp_elem_count) {
   2030                     return BCM_E_NONE;
   2031                 }
   2032             }
   2033 
   2034             for (idx = 0; idx <= 11; idx++) {
   2035                 if (0 != ((bit32_chunks_free_partially) & (1 << idx))) {
   2036                     f_dq->hw_bmap |= (1 << idx);
   2037                     (*usage_bmap) |= (1 << idx);
   2038                     temp_elem_count = temp_elem_count - 1;
   2039                 }
   2040 
   2041                 if (0 == temp_elem_count) {
   2042                     return BCM_E_NONE;
   2043                 }
   2044             }
   2045 
   2046             for (idx = 0; idx <= 11; idx++) {
   2047                 if (0 != ((bit32_chunks_free) & (1 << idx))) {
   2048                     f_dq->hw_bmap |= (1 << idx);
   2049                     (*usage_bmap) |= (1 << idx);
   2050                     temp_elem_count = temp_elem_count - 1;
   2051                 }
   2052 
   2053                 if (0 == temp_elem_count) {
   2054                     return BCM_E_NONE;
   2055                 }
   2056             }
   2057 
   2058             /*Give last preference to data qualifiers Data8 and Data9 (marking UDF2.4
   2059              *through UDF2.7) chunks as they are specific to RTAG7*/
   2060             for (idx = 12; idx < 15; idx += 2) {
   2061                 if (1 != temp_elem_count) {
   2062                     if ((0 != ((bit32_chunks_free) & (1 << idx))) &&
   2063                         (0 != ((bit32_chunks_free) & (1 << (idx + 1))))) {
   2064                         f_dq->hw_bmap |= (1 << idx);
   2065                         (*usage_bmap) |= (1 << idx);
   2066                         f_dq->hw_bmap |= (1 << (idx + 1));
   2067                         (*usage_bmap) |= (1 << (idx + 1));
   2068                         SHR_BITCLR(&bit32_chunks_free, idx);
   2069                         SHR_BITCLR(&bit32_chunks_free, idx+1);
   2070                         temp_elem_count = temp_elem_count - 2;
   2071                     }
   2072 
   2073                     if (0 == temp_elem_count) {
   2074                         return BCM_E_NONE;
   2075                     }
   2076                 }
   2077             }
   2078 
   2079             for (idx = 12; idx <= 15; idx++) {
   2080                 if (0 != ((bit32_chunks_free_partially) & (1 << idx))) {
   2081                     f_dq->hw_bmap |= (1 << idx);
   2082                     (*usage_bmap) |= (1 << idx);
   2083                     temp_elem_count = temp_elem_count - 1;
   2084                 }
   2085 
   2086                 if (0 == temp_elem_count) {
   2087                     return BCM_E_NONE;
   2088                 }
   2089             }
   2090 
   2091             for (idx = 12; idx <= 15; idx++) {
   2092                 if (0 != ((bit32_chunks_free) & (1 << idx))) {
   2093                     f_dq->hw_bmap |= (1 << idx);
   2094                     (*usage_bmap) |= (1 << idx);
   2095                     temp_elem_count = temp_elem_count - 1;
   2096                 }
   2097 
   2098                 if (0 == temp_elem_count) {
   2099                     return BCM_E_NONE;
   2100                 }
   2101             }
   2102         }
   2103     }
   2104 
   2105     return (BCM_E_RESOURCE);
   2106 
   2107 }
   2108 
   2109 /*
   2110  * Function:
   2111  *     _bcm_field_th_field_qset_data_qualifier_add
   2112  *
   2113  * Purpose:
   2114  *     Add field data qualifier to group qset.
   2115  *
   2116  * Parameters:
   2117  *      unit          - (IN) bcm device.
   2118  *      qset          - (IN/OUT) Group qualifier set.
   2119  *      qualifier_id  - (IN) Data qualifier id.
   2120  *
   2121  * Returns:
   2122  *      BCM_E_XXX
   2123  */
   2124 int _bcm_field_th_field_qset_data_qualifier_add(int unit,
   2125                                                 bcm_field_qset_t *qset,
   2126                                                 int qual_id)
   2127 {
   2128     _field_stage_t          *stage_fc;      /* Stage field control.       */
   2129     _field_data_qualifier_t *f_dq;          /* Data qualifier descriptor. */
   2130     int                     idx;            /* HW bitmap iteration index. */
   2131     int                     rv;             /* Operation return status.   */
   2132     int                     offset_2_3 = 0;  /* HW offset 0 and 1 usage status. */
   2133     int                     offset_4_5 = 0;  /* HW offset 2 and 3 usage status. */
   2134     int                     offset_6_7 = 0;  /* HW offset 4 and 5 usage status. */
   2135     int                     offset_a_b = 0;  /* HW offset 8 and 9 usage status. */
   2136     int                     offset_c_d = 0;  /* HW offset a and b usage status. */
   2137     int                     offset_e_f = 0;  /* HW offset c and d usage status. */
   2138     int                     byte_index;
   2139     int                     byte_count;
   2140 
   2141     FP_LOCK(unit);
   2142 
   2143     /* Get stage field control structure. */
   2144     rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc);
   2145     if (BCM_FAILURE(rv)) {
   2146         FP_UNLOCK(unit);
   2147         return (rv);
   2148     }
   2149 
   2150     /*Get data qualifier info. */
   2151     rv = _bcm_field_data_qualifier_get(unit, stage_fc, qual_id,  &f_dq);
   2152     if (BCM_FAILURE(rv)) {
   2153         FP_UNLOCK(unit);
   2154         return (rv);
   2155     }
   2156 
   2157 
   2158     /*--------------------------------------------------------------------------------------*
   2159      * Each chunk or chunk pair corresponds to the data qualifier as marked below:
   2160      *
   2161      * 15 -- 14   13 -- 12    11 -- 10    9    8     7 -- 6    5 -- 4   3 -- 2   1     0
   2162      *{________}  {_______}   {_______} {___}{___}  {______}  {______}  {_____} {___}{___}
   2163      *   Data9      Data8       Data7   Data6 Data5   Data4    Data3     Data2  Data1 Data0
   2164      *  (32bit)    (32bit)    (32bit)  (16bit)(16bit) (32bit) (32bit)   (32bit)(16bit)(16bit)
   2165      * {_________________________________________}   {___________________________________}
   2166      *                     ||                                          ||
   2167      *                    UDF_2                                       UDF_1
   2168      *--------------------------------------------------------------------------------------*/
   2169 
   2170     /* Loop through the hw_map and set the correspoding bit in qset's udf_map*/
   2171 
   2172     for (idx = 0; idx <= 15; idx++) {
   2173         if (f_dq->hw_bmap & (1 << idx)) {
   2174             SHR_BITSET(qset->udf_map, idx);
   2175         }
   2176     }
   2177 
   2178     /* Add the qualifiers corresponding to the bit in qset->udf_map. Like,
   2179      * 16_bit qualifiers are _bcmFieldQualifyData0, _bcmFieldQualifyData1,
   2180      *_bcmFieldQualifyData5,_bcmFieldQualifyData6 and map 0,1,8,9 respectively*/
   2181 
   2182     if (SHR_BITGET(qset->udf_map, 0x0)) {
   2183         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData0);
   2184     }
   2185     if (SHR_BITGET(qset->udf_map, 0x1)) {
   2186         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData1);
   2187     }
   2188     if (SHR_BITGET(qset->udf_map, 0x8)) {
   2189         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData5);
   2190     }
   2191     if (SHR_BITGET(qset->udf_map, 0x9)) {
   2192         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData6);
   2193     }
   2194 
   2195     /* 32_bit qualifiers are over a range of udf_map and hence
   2196      * get HW offsets usage status. */
   2197 
   2198     SHR_BITTEST_RANGE(qset->udf_map, 0x2, 2, offset_2_3);
   2199     SHR_BITTEST_RANGE(qset->udf_map, 0x4, 2, offset_4_5);
   2200     SHR_BITTEST_RANGE(qset->udf_map, 0x6, 2, offset_6_7);
   2201     SHR_BITTEST_RANGE(qset->udf_map, 0xa, 2, offset_a_b);
   2202     SHR_BITTEST_RANGE(qset->udf_map, 0xc, 2, offset_c_d);
   2203     SHR_BITTEST_RANGE(qset->udf_map, 0xe, 2, offset_e_f);
   2204 
   2205     if (offset_2_3) {
   2206         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData2);
   2207     }
   2208     if (offset_4_5) {
   2209         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData3);
   2210     }
   2211     if (offset_6_7) {
   2212         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData4);
   2213     }
   2214     if (offset_a_b) {
   2215         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData7);
   2216     }
   2217     if (offset_c_d) {
   2218         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData8);
   2219     }
   2220     if (offset_e_f) {
   2221         BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData9);
   2222     }
   2223 
   2224     /* SDK builds key gen mask for exact match group during group create.
   2225      * group control structure has information only about data qualifiers
   2226      * (_bcmFieldQualifyData0 - _bcmFieldQualifyData9) and chunks allocated
   2227      * in groups qset.But no information is available about which bytes of
   2228      * the chunk is actually allocated.
   2229      * But we need which bytes of chunk is allocated for the data qualifier to
   2230      * properly build the EM key gen mask, in case of partially allocated chunks.
   2231      * So updating the unused bits of udf_map in bcm_field_qset_t to hold the
   2232      * bytes allocated in chunks allocated for the data qualifier.*/
   2233 
   2234     byte_count = f_dq->length;
   2235     for (idx = 0; idx <= stage_fc->data_ctrl->num_elems * 2; idx++) {
   2236         if (f_dq->hw_bmap & (1 << idx)) {
   2237             byte_index = (stage_fc->data_ctrl->num_elems * 2) + (idx * 2);
   2238             if (byte_count) {
   2239                 if (byte_count > 1) {
   2240                     SHR_BITSET_RANGE(qset->udf_map, byte_index, 2);
   2241                     byte_count = byte_count - 2;
   2242                 } else {
   2243                     SHR_BITSET_RANGE(qset->udf_map, byte_index, 1);
   2244                     byte_count = byte_count - 1;
   2245                 }
   2246             }
   2247         }
   2248     }
   2249 
   2250     FP_UNLOCK(unit);
   2251     return (BCM_E_NONE);
   2252 }
   2253 
   2254 /*
   2255  * Function:
   2256  *      _bcm_field_th_field_qset_data_qualifier_delete
   2257  * Purpose:
   2258  *      Delete field data qualifier from group qset.
   2259  * Parameters:
   2260  *      unit          - (IN) bcm device.
   2261  *      qset          - (IN/OUT) Group qualifier set.
   2262  *      qualifier_id  - (IN) Data qualifier id.
   2263  * Returns:
   2264  *      BCM_E_XXX
   2265  */
   2266 int _bcm_field_th_field_qset_data_qualifier_delete (int unit, bcm_field_qset_t *qset,
   2267                                                 int qual_id)
   2268 {
   2269     _field_stage_t          *stage_fc;  /* Stage field control.       */
   2270     _field_data_qualifier_t *f_dq;      /* Data qualifier descriptor. */
   2271     int                     idx;        /* HW bitmap iteration index. */
   2272     int                     rv;         /* Operation return status.   */
   2273     int                     offset_2_3 = 0;  /* HW offset 0 and 1 usage status. */
   2274     int                     offset_4_5 = 0;  /* HW offset 2 and 3 usage status. */
   2275     int                     offset_6_7 = 0;  /* HW offset 4 and 5 usage status. */
   2276     int                     offset_a_b = 0;  /* HW offset 8 and 9 usage status. */
   2277     int                     offset_c_d = 0;  /* HW offset a and b usage status. */
   2278     int                     offset_e_f = 0;  /* HW offset c and d usage status. */
   2279 
   2280     FP_LOCK(unit);
   2281 
   2282     /* Get stage field control structure. */
   2283     rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc);
   2284     if (BCM_FAILURE(rv)) {
   2285         FP_UNLOCK(unit);
   2286         return (rv);
   2287     }
   2288 
   2289     /*Get data qualifier info. */
   2290     rv = _bcm_field_data_qualifier_get(unit, stage_fc, qual_id,  &f_dq);
   2291     if (BCM_FAILURE(rv)) {
   2292         FP_UNLOCK(unit);
   2293         return (rv);
   2294     }
   2295 
   2296     /* Loop through the hw_map and clear the correspoding bit in qset's udf_map*/
   2297     for (idx = 0; idx <= 15; idx++)
   2298     {
   2299         if (f_dq->hw_bmap & (1 << idx)) {
   2300             SHR_BITCLR(qset->udf_map, idx);
   2301         }
   2302     }
   2303 
   2304     if (!SHR_BITGET(qset->udf_map, 0x0)) {
   2305         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData0);
   2306     }
   2307 
   2308     if (!SHR_BITGET(qset->udf_map, 0x1)) {
   2309         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData1);
   2310     }
   2311 
   2312     if (!SHR_BITGET(qset->udf_map, 0x8)) {
   2313         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData5);
   2314     }
   2315 
   2316     if (!SHR_BITGET(qset->udf_map, 0x9)) {
   2317         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData6);
   2318     }
   2319 
   2320     /* Get HW offsets usage status. */
   2321     SHR_BITTEST_RANGE(qset->udf_map, 0x2, 2, offset_2_3);
   2322     SHR_BITTEST_RANGE(qset->udf_map, 0x4, 2, offset_4_5);
   2323     SHR_BITTEST_RANGE(qset->udf_map, 0x6, 2, offset_6_7);
   2324     SHR_BITTEST_RANGE(qset->udf_map, 0xa, 2, offset_a_b);
   2325     SHR_BITTEST_RANGE(qset->udf_map, 0xc, 2, offset_c_d);
   2326     SHR_BITTEST_RANGE(qset->udf_map, 0xe, 2, offset_e_f);
   2327 
   2328     if (!offset_2_3) {
   2329         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData2);
   2330     }
   2331     if (!offset_4_5) {
   2332         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData3);
   2333     }
   2334     if (!offset_6_7) {
   2335         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData4);
   2336     }
   2337     if (!offset_a_b) {
   2338         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData7);
   2339     }
   2340     if (!offset_c_d) {
   2341         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData8);
   2342     }
   2343     if (!offset_e_f) {
   2344         BCM_FIELD_QSET_REMOVE_INTERNAL(*qset, _bcmFieldQualifyData9);
   2345     }
   2346 
   2347     FP_UNLOCK(unit);
   2348     return (BCM_E_NONE);
   2349 }
   2350 
   2351 /*
   2352  * Function:
   2353  *      _bcm_field_th_field_qset_data_qualifier_get
   2354  * Purpose:
   2355  *      Fetch the data qualifier that maps the index
   2356  * Parameters:
   2357  *      idx           - (IN) Index of the element
   2358  *      qset          - (IN) Group qualifier set.
   2359  *      qualifier_id  - (OUT) Data qualifier id.
   2360  * Returns:
   2361  *      BCM_E_XXX
   2362  */
   2363 int _bcm_field_th_field_qset_data_qualifier_get(int idx,
   2364         bcm_field_qset_t qset,
   2365         bcm_field_qualify_t *qid)
   2366 {
   2367     if (idx < 0 || idx > 15) {
   2368         return (BCM_E_PARAM);
   2369     }
   2370 
   2371     if (NULL == qid) {
   2372         return (BCM_E_PARAM);
   2373     }
   2374 
   2375     /* Return the qualifier id, if the qualifier_id is set in the Qset
   2376      * and its corresponding index value is the same mapped with it*/
   2377     if ((idx == 0) &&
   2378             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2379                 _bcmFieldQualifyData0)) {
   2380         *qid = _bcmFieldQualifyData0;
   2381     } else if ((idx == 1) &&
   2382             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2383                 _bcmFieldQualifyData1)) {
   2384         *qid     = _bcmFieldQualifyData1;
   2385     } else if (((idx == 2) || (idx == 3)) &&
   2386             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2387                 _bcmFieldQualifyData2)) {
   2388         *qid = _bcmFieldQualifyData2;
   2389     } else if (((idx == 4) || (idx == 5)) &&
   2390             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2391                 _bcmFieldQualifyData3)) {
   2392         *qid = _bcmFieldQualifyData3;
   2393     } else if (((idx == 6) || (idx == 7)) &&
   2394             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2395                 _bcmFieldQualifyData4)) {
   2396         *qid = _bcmFieldQualifyData4;
   2397     } else if ((idx == 8) &&
   2398             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2399                 _bcmFieldQualifyData5)) {
   2400         *qid = _bcmFieldQualifyData5;
   2401     } else if ((idx == 9) &&
   2402             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2403                 _bcmFieldQualifyData6)) {
   2404         *qid = _bcmFieldQualifyData6;
   2405     } else if (((idx == 0xa) || (idx == 0xb)) &&
   2406             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2407                 _bcmFieldQualifyData7)) {
   2408         *qid = _bcmFieldQualifyData7;
   2409     } else if (((idx == 0xc) || (idx == 0xd)) &&
   2410             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2411                 _bcmFieldQualifyData8)) {
   2412         *qid = _bcmFieldQualifyData8;
   2413     } else if (((idx == 0xe) || (idx == 0xf)) &&
   2414             BCM_FIELD_QSET_TEST_INTERNAL(qset,
   2415                 _bcmFieldQualifyData9)) {
   2416         *qid = _bcmFieldQualifyData9;
   2417     } else {
   2418         return (BCM_E_INTERNAL);
   2419     }
   2420 
   2421     return BCM_E_NONE;
   2422 }
   2423 /*
   2424  * Function: _bcm_field_th_field_qualify_data_elem
   2425  *
   2426  * Purpose:
   2427  *
   2428  * Parameters:
   2429  *     unit          - (IN) BCM device number.
   2430  *     eid           - (IN) Entry ID.
   2431  *     f_dq          - (IN) Data qualifier descriptor.
   2432  *     qual_elem_idx - (IN) Data qualifier element index.
   2433  *     data          - (IN) Data bytes for the indicated data qualifier.
   2434  *                Network byte ordered.
   2435  *     mask     - Mask bytes for the indicated data qualifier.
   2436  *                Network byte ordered.
   2437  * Returns:
   2438  *     BCM_E_XXX
   2439  */
   2440 int
   2441 _bcm_field_th_field_qualify_data_elem(int unit, bcm_field_entry_t eid,
   2442                          _field_data_qualifier_t *f_dq,
   2443                          uint8 qual_elem_idx,
   2444                          uint32 data, uint32 mask)
   2445 {
   2446     _field_stage_t           *stage_fc;         /* Stage field control.       */
   2447     _field_entry_t           *f_ent = NULL;     /* Field entry structure.     */
   2448     int                      idx;               /* HW bitmap iteration index. */
   2449     int                      rv;                /* Operation return status.   */
   2450     int                      elem_idx = 0;      /* Qualifier Element Index.   */
   2451     bcm_field_qualify_t      qid = 0;           /* Qualifier id.              */
   2452     uint32                   q_data = 0;        /* Qualifier data             */
   2453     uint32                   q_mask = 0;        /* Qualifier mask             */
   2454     int                      bit32_chunk = 0;   /* Chunk is 32bit or 16bit    */
   2455 
   2456     /* Input parameters check. */
   2457     if (NULL == f_dq) {
   2458         return (BCM_E_PARAM);
   2459     }
   2460 
   2461     BCM_IF_ERROR_RETURN
   2462         (_field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc));
   2463 
   2464     /* Find a proper element to insert the data. */
   2465     for (idx = 0; idx <= 15; idx ++) {
   2466         if (f_dq->hw_bmap & (1 << idx)) {
   2467             if (elem_idx == qual_elem_idx) {
   2468                 break;
   2469             } else {
   2470                 elem_idx++;
   2471             }
   2472         }
   2473     }
   2474 
   2475     if (idx != 0x0 && idx != 0x1 && idx != 0x8 && idx != 0x9)
   2476     {
   2477         bit32_chunk = 1;
   2478     }
   2479 
   2480     /* Get entry info. */
   2481     BCM_IF_ERROR_RETURN
   2482         (_field_entry_get(unit, eid, _FP_ENTRY_PRIMARY, &f_ent));
   2483 
   2484     BCM_IF_ERROR_RETURN(_bcm_field_th_field_qset_data_qualifier_get(idx, f_ent->group->qset,&qid));
   2485 
   2486     if(bit32_chunk) {
   2487         /*Since a 32 bit chunk can be allocated even partially,
   2488           do not overwrite existing data in 32bit chunk.*/
   2489         rv = _bcm_field_entry_qualifier_uint32_get(unit, f_ent->eid, qid, &q_data, &q_mask);
   2490 
   2491         if ((rv != BCM_E_NOT_FOUND) && (BCM_FAILURE(rv))) {
   2492             return rv;
   2493         }
   2494 
   2495         if (rv == BCM_E_NONE) {
   2496             if((idx % 2) == 0) {
   2497                 /* Idx is even => Upper 16 bits need to be written.Hence,mask the lower
   2498                  *16 bits of the q_data fetched from tcam and add the data*/
   2499                 q_data &= ((1 << 16) - 1);
   2500                 q_mask &= ((1 << 16) - 1);
   2501 
   2502                 data = data << 16 | q_data;
   2503                 mask = mask << 16 | q_mask;
   2504             } else {
   2505                 /* Idx is odd => Lower 16 bits need to be written.Hence,mask the upper
   2506                  *16 bits of the q_data fetched from tcam and add the data*/
   2507                 q_data &= ~((1 << 16) - 1);
   2508                 q_mask &= ~((1 << 16) - 1);
   2509 
   2510                 data |= q_data;
   2511                 mask |= q_mask;
   2512             }
   2513         }
   2514     }
   2515 
   2516     /* If device supports per-pipe FP configuration, */
   2517     if (soc_feature(unit, soc_feature_field_multi_pipe_support) &&
   2518         ((f_ent->group->stage_id == _BCM_FIELD_STAGE_INGRESS) ||
   2519          (f_ent->group->stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) {
   2520         /* coverity[callee_ptr_arith : FALSE] */
   2521         return (_bcm_field_th_qualify_set(unit, eid, qid,
   2522                     &data, &mask, _FP_QUALIFIER_ADD));
   2523     } else if ((f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP)) {
   2524         _bcm_field_qual_offset_t *q_offset;
   2525         int rv_sec = BCM_E_NONE;
   2526         /* Get entry qualifier offset in tcam. */
   2527         rv = _field_qual_offset_get(unit, f_ent, qid, &q_offset);
   2528         if (BCM_E_NOT_FOUND == rv) {
   2529             /* If offset is not found in first */
   2530             rv_sec = (_field_entry_get(unit, eid, _FP_ENTRY_SECONDARY, &f_ent));
   2531             if (BCM_FAILURE(rv_sec)) {
   2532                 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
   2533                                 "Entry %d Second part get failed with error %d\n "),
   2534                                 eid, rv_sec));
   2535                 return rv;
   2536             }
   2537             rv_sec = _field_qual_offset_get(unit, f_ent, qid, &q_offset);
   2538             if (BCM_SUCCESS(rv_sec)) {
   2539                 rv = BCM_E_NONE;
   2540             } else {
   2541                 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
   2542                                 "Entry %d Qual %d Offset get failed with error %d\n "),
   2543                                 eid, qid, rv_sec));
   2544             }
   2545         }
   2546         BCM_IF_ERROR_RETURN(rv);
   2547         rv = _bcm_field_qual_value_set(unit, q_offset, f_ent, &data, &mask);
   2548         BCM_IF_ERROR_RETURN(rv);
   2549 
   2550         f_ent->flags |= _FP_ENTRY_DIRTY;
   2551     }
   2552     return BCM_E_NONE;
   2553 }
   2554 
   2555 /*
   2556  * Function:
   2557  *      _bcm_field_th_field_qualify_data_get
   2558  * Purpose:
   2559  *      Get data/mask in the search engine for entry field data qualifier.
   2560  * Parameters:
   2561  *      unit          - (IN) bcm device.
   2562  *      eid           - (IN) Entry id.
   2563  *      qual_id       - (IN) Data qualifier id.
   2564  *      length_max    - (IN) Length of data & mask arrays.
   2565  *      data          - (OUT) Match data.
   2566  *      mask          - (OUT) Match mask.
   2567  *      length        - (OUT) Length of data & mask arrays.
   2568  * Returns:
   2569  *      BCM_E_XXX
   2570  */
   2571 int
   2572 _bcm_field_th_field_qualify_data_get(int unit, bcm_field_entry_t eid, int qual_id,
   2573                                uint16 length_max,  uint8 *data, uint8 *mask,
   2574                                uint16 *length)
   2575 {
   2576     _field_stage_t          *stage_fc;                      /* Stage field control.       */
   2577     _field_data_qualifier_t *f_dq;                          /* Data qualifier descriptor. */
   2578     _field_entry_t          *f_ent = NULL;                  /* Field entry structure.     */
   2579     uint32                  data1;                          /* 32 bit qualifier data.     */
   2580     uint32                  mask1;                          /* 32 bit qualifier mask.     */
   2581     uint16                  data2;                          /* 16 bit qualifier data.     */
   2582     uint16                  mask2;                          /* 16 bit qualifier mask.     */
   2583     uint8                   *p_data1 = (uint8 *) &data1;    /* 32bit qualifier data pointer */
   2584     uint8                   *p_mask1 = (uint8 *) &mask1;    /* 32bit qualifier mask pointer */
   2585     uint8                   *p_data2 = (uint8 *) &data2;    /* 16bit qualifier data pointer */
   2586     uint8                   *p_mask2 = (uint8 *) &mask2;    /* 16bit qualifier mask pointer */
   2587     int                     bit32_chunk = 0;                /* Chunk is 32bit or 16bit    */
   2588     bcm_field_qualify_t     qid = 0;                        /* Qualifier id.              */
   2589     int                     idx;                            /* HW bitmap iteration index. */
   2590     int                     rv;                             /* Operation return status.   */
   2591     int                     shift = 0;
   2592     int                     copy_len;
   2593     int                     len = 0;
   2594     #ifdef LE_HOST
   2595     uint32 data_swap, mask_swap;
   2596     #endif /* LE_HOST */
   2597 
   2598     /* Input parameters check. */
   2599     if ((NULL == data) || (NULL == mask) ||
   2600         (NULL == length) || (length_max == 0)) {
   2601         return (BCM_E_PARAM);
   2602     }
   2603 
   2604     memset(&data1, 0, sizeof(data1));
   2605     memset(&mask1, 0, sizeof(mask1));
   2606 
   2607     FP_LOCK(unit);
   2608 
   2609     /* Get stage field control structure. */
   2610     rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc);
   2611     if (BCM_FAILURE(rv)) {
   2612         FP_UNLOCK(unit);
   2613         return (rv);
   2614     }
   2615 
   2616     /* Get data qualifier info. */
   2617     rv = _bcm_field_data_qualifier_get(unit, stage_fc, qual_id,  &f_dq);
   2618     if (BCM_FAILURE(rv)) {
   2619         FP_UNLOCK(unit);
   2620         return (rv);
   2621     }
   2622 
   2623     /*
   2624      * If provided entry data length is greater than data length used
   2625      * to create qualifier then return error
   2626      */
   2627 
   2628     if (length_max > f_dq->length) {
   2629         FP_UNLOCK(unit);
   2630         return (BCM_E_PARAM);
   2631     }
   2632 
   2633     rv = _bcm_field_entry_get_by_id(unit, eid, &f_ent);
   2634     if (BCM_FAILURE(rv)) {
   2635         FP_UNLOCK(unit);
   2636         return (rv);
   2637     }
   2638 
   2639     for (idx = 0; idx <= 15; idx++) {
   2640         if (!(f_dq->hw_bmap & (1 << idx))) {
   2641             continue;
   2642         }
   2643 
   2644         if (idx != 0x0 && idx != 0x1 && idx != 0x8 && idx != 0x9) {
   2645             bit32_chunk = 1;
   2646         } else {
   2647             bit32_chunk = 0;
   2648         }
   2649 
   2650         /*Get the qualifier id matching the idx from the Group's qset*/
   2651         rv = _bcm_field_th_field_qset_data_qualifier_get(idx, f_ent->group->qset,&qid);
   2652         if (BCM_FAILURE(rv)) {
   2653             FP_UNLOCK(unit);
   2654             return (rv);
   2655         }
   2656 
   2657         /*Fetch the data from the Tcam.*/
   2658         if(bit32_chunk) {
   2659             rv = _bcm_field_entry_qualifier_uint32_get(unit, eid, qid,
   2660                     &data1, &mask1);
   2661         } else {
   2662             rv = _bcm_field_entry_qualifier_uint16_get(unit, eid, qid,
   2663                     &data2, &mask2);
   2664         }
   2665         if (BCM_FAILURE(rv)) {
   2666             FP_UNLOCK(unit);
   2667             return (rv);
   2668         }
   2669 #ifdef LE_HOST
   2670         data_swap = _shr_swap32(data1);
   2671         data1 = data_swap;
   2672         mask_swap = _shr_swap32(mask1);
   2673         mask1 = mask_swap;
   2674         data_swap = _shr_swap16(data2);
   2675         data2 = data_swap;
   2676         mask_swap = _shr_swap16(mask2);
   2677         mask2 = mask_swap;
   2678 #endif /* LE_HOST */
   2679 
   2680         if (len < f_dq->length) {
   2681             if(bit32_chunk) {
   2682                 /* Idx is even => Lower 16 bits need to be copied. Hence,
   2683                  * start from offset 0. Idx is odd => Upper 16 bits need to be
   2684                  * copied, hence start from offset 2 of the 32bit chunk's data.*/
   2685                 shift = (idx % 2 == 0) ? 0 : 2 ;
   2686                 copy_len = ((f_dq->length - len) == 1)? 1 : 2;
   2687                 sal_memcpy((data + len), p_data1 + shift, copy_len);
   2688                 sal_memcpy((mask + len), p_mask1 + shift, copy_len);
   2689                 len+= copy_len;
   2690             } else {
   2691                 copy_len = ((f_dq->length - len) == 1)? 1 : 2;
   2692                 sal_memcpy((data + len), p_data2, copy_len);
   2693                 sal_memcpy((mask + len), p_mask2, copy_len);
   2694                 len+= copy_len;
   2695             }
   2696         }
   2697     }
   2698 
   2699     *length = f_dq->length;
   2700 
   2701     FP_UNLOCK(unit);
   2702     return BCM_E_NONE;
   2703 }
   2704 /*
   2705  * Function:
   2706  *    _field_th_data_qualifier_destroy_all
   2707  *
   2708  * Purpose:
   2709  *    Destroy all data/offset  based qualifiers.
   2710  *
   2711  * Parameters:
   2712  *    unit - (IN) BCM device number
   2713  *
   2714  * Returns:
   2715  *    BCM_E_INIT    - Stage is not initialized.
   2716  *    BCM_E_UNAVAIL - function not supported for this stage.
   2717  *    BCM_E_NONE    - Success.
   2718  */
   2719 STATIC int
   2720 _field_th_data_qualifier_destroy_all(int unit)
   2721 {
   2722     _field_data_qualifier_t *f_dq; /* Internal data qualifier descriptor. */
   2723     _field_stage_t *stage_fc; /* Stage field control. */
   2724 
   2725     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit,
   2726         _BCM_FIELD_STAGE_INGRESS, &stage_fc));
   2727 
   2728     while (NULL != stage_fc->data_ctrl->data_qual) {
   2729         f_dq = stage_fc->data_ctrl->data_qual;
   2730         BCM_IF_ERROR_RETURN(_bcm_field_data_qualifier_destroy(unit, f_dq->qid));
   2731     }
   2732     return (BCM_E_NONE);
   2733 }
   2734 
   2735 /*
   2736  * Function:
   2737  *    _field_th_stage_data_ctrl_deinit
   2738  *
   2739  * Purpose:
   2740  *    De-allocate data qualifiers control structure.
   2741  *
   2742  * Parameters:
   2743  *    unit      - (IN) BCM device number
   2744  *    stage_fc  - (IN/OUT) Stage for which data qualifier need to be freed.
   2745  *
   2746  * Returns:
   2747  *     BCM_E_PARAM  - NULL Stage control data structure pointer.
   2748  *     BCM_E_NONE   - Success
   2749  */
   2750 STATIC int
   2751 _field_th_stage_data_ctrl_deinit(int unit, _field_stage_t *stage_fc)
   2752 {
   2753     _field_data_control_t *data_ctrl; /* Data qualifiers control structure
   2754                                          pointer. */
   2755 
   2756     /* Input parameters check. */
   2757     if (NULL == stage_fc) {
   2758         return (BCM_E_PARAM);
   2759     }
   2760 
   2761     /* Free the data qualifiers control structure only for IFP. */
   2762     if (_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) {
   2763         return (BCM_E_NONE);
   2764     }
   2765 
   2766     /* If data qualifiers control structure is already freed, return SUCCESS. */
   2767     data_ctrl = stage_fc->data_ctrl;
   2768     if (NULL == data_ctrl) {
   2769         return (BCM_E_NONE);
   2770     }
   2771 
   2772     /* Delete all data qualifiers. */
   2773     _field_th_data_qualifier_destroy_all(unit);
   2774 
   2775     /* Free control structures. */
   2776     if (NULL != data_ctrl->tcam_entry_arr) {
   2777         sal_free(data_ctrl->tcam_entry_arr);
   2778     }
   2779 
   2780     /* Free data qualifiers control structure memory. */
   2781     if (NULL != data_ctrl) {
   2782         sal_free(data_ctrl);
   2783     }
   2784 
   2785     /* Initialize stage data qualifier control structure pointer to NULL. */
   2786     stage_fc->data_ctrl = NULL;
   2787     return (BCM_E_NONE);
   2788 }
   2789 
   2790 /*
   2791  * Function:
   2792  *    _field_th_stage_keygen_extractors_deinit
   2793  *
   2794  * Purpose:
   2795  *    Deinitialize field stage keygen extractors information.
   2796  *
   2797  * Parameters:
   2798  *    unit     - (IN) BCM device number
   2799  *    stage_fc - (IN) stage control structure.
   2800  *
   2801  * Returns:
   2802  *    BCM_E_PARAM - Device Stage field control structure pointer is NULL.
   2803  *    BCM_E_NONE  - Success
   2804  */
   2805 STATIC int
   2806 _field_th_stage_keygen_extractors_deinit(int unit, _field_stage_t *stage_fc)
   2807 {
   2808     bcm_error_t rv = BCM_E_NONE;
   2809     bcmi_keygen_mode_t emode;             /* Extractor mode.              */
   2810     bcmi_keygen_ext_cfg_db_t *ext_cfg_db; /* Extractor configuration.     */
   2811 
   2812     /* Input parameters check. */
   2813     if (NULL == stage_fc) {
   2814         return (BCM_E_PARAM);
   2815     }
   2816 
   2817     /* Do nothing for Non-IFP stages. */
   2818     if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) &&
   2819         (_BCM_FIELD_STAGE_FLOWTRACKER != stage_fc->stage_id)) {
   2820         return (BCM_E_NONE);
   2821     }
   2822 
   2823     /* Do nothing if it's already freed. */
   2824     if (NULL == stage_fc->ext_cfg_db_arr) {
   2825         return (BCM_E_NONE);
   2826     }
   2827 
   2828     for (emode = 0; emode < BCMI_KEYGEN_MODE_COUNT; emode++) {
   2829 
   2830         /* Get extractor config array pointer. */
   2831         ext_cfg_db = stage_fc->ext_cfg_db_arr[emode];
   2832         if (NULL == ext_cfg_db) {
   2833             continue;
   2834         }
   2835 
   2836         rv = bcmi_keygen_ext_cfg_db_free(unit, ext_cfg_db);
   2837         if (BCM_FAILURE(rv)) {
   2838             return rv;
   2839         }
   2840         stage_fc->ext_cfg_db_arr[emode] = NULL;
   2841     }
   2842 
   2843     sal_free(stage_fc->ext_cfg_db_arr);
   2844     /* Mark extractor configuration array as unused. */
   2845     stage_fc->ext_cfg_db_arr = NULL;
   2846 
   2847     return (BCM_E_NONE);
   2848 }
   2849 
   2850 /*
   2851  * Function:
   2852  *    _field_th_stage_keygen_qual_db_deinit
   2853  *
   2854  * Purpose:
   2855  *    Deinitialize field stage keygen qualifiers config information database.
   2856  *
   2857  * Parameters:
   2858  *    unit     - (IN) BCM device number
   2859  *    stage_fc - (IN) stage control structure.
   2860  *
   2861  * Returns:
   2862  *    BCM_E_PARAM - Device Stage field control structure pointer is NULL.
   2863  *    BCM_E_NONE  - Success
   2864  */
   2865 STATIC int
   2866 _field_th_stage_keygen_qual_db_deinit(int unit, _field_stage_t *stage_fc)
   2867 {
   2868     bcm_error_t rv = BCM_E_NONE;
   2869 
   2870     /* Input parameters check. */
   2871     if (NULL == stage_fc) {
   2872         return (BCM_E_PARAM);
   2873     }
   2874 
   2875     /* Do nothing for Non-IFP stages. */
   2876     if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) &&
   2877         (_BCM_FIELD_STAGE_FLOWTRACKER != stage_fc->stage_id)) {
   2878         return (BCM_E_NONE);
   2879     }
   2880 
   2881     /* Do nothing if already freed. */
   2882     if (NULL == stage_fc->qual_cfg_info_db) {
   2883         return (BCM_E_NONE);
   2884     }
   2885 
   2886     rv = bcmi_keygen_qual_cfg_info_db_free(unit, stage_fc->qual_cfg_info_db);
   2887     if (BCM_FAILURE(rv)) {
   2888         return rv;
   2889     }
   2890 
   2891     /* Deallocate qualifiers sections pointers memory. */
   2892     sal_free(stage_fc->qual_cfg_info_db);
   2893 
   2894     /* Mark qualifier list as unused. */
   2895     stage_fc->qual_cfg_info_db = NULL;
   2896 
   2897     return (BCM_E_NONE);
   2898 }
   2899 
   2900 /*
   2901  * Function:
   2902  *    _field_th_stage_actions_deinit
   2903  *
   2904  * Purpose:
   2905  *    Deinitialize field stage actions configuration array.
   2906  *
   2907  * Parameters:
   2908  *    unit     - (IN) BCM device number
   2909  *    stage_fc - (IN) stage control structure.
   2910  *
   2911  * Returns:
   2912  *    BCM_E_PARAM - Device Stage field control structure pointer is NULL.
   2913  *    BCM_E_NONE  - Success
   2914  */
   2915 STATIC int
   2916 _field_th_stage_actions_deinit(int unit, _field_stage_t *stage_fc)
   2917 {
   2918     int idx;                 /* Index to loop through  all field actions */
   2919     _bcm_field_action_offset_t *offset;       /* Offset Information.     */
   2920 
   2921     /* Input parameters check. */
   2922     if (NULL == stage_fc) {
   2923         return (BCM_E_PARAM);
   2924     }
   2925 
   2926     /* Do nothing for Non-IFP stages. */
   2927     if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) &&
   2928         (_BCM_FIELD_STAGE_EXACTMATCH != stage_fc->stage_id)) {
   2929         return (BCM_E_NONE);
   2930     }
   2931 
   2932 
   2933     if (NULL != stage_fc->f_action_arr) {
   2934 
   2935         for (idx = 0; idx < _bcmFieldActionCount; idx++) {
   2936             if (NULL != stage_fc->f_action_arr[idx]) {
   2937 
   2938                 if (NULL != stage_fc->f_action_arr[idx]->offset) {
   2939                     do {
   2940                         offset = stage_fc->f_action_arr[idx]->offset;
   2941                         stage_fc->f_action_arr[idx]->offset =
   2942                                    stage_fc->f_action_arr[idx]->offset->next;
   2943                         /* Deallocate different offset information for same action. */
   2944                         sal_free(offset);
   2945                     } while(stage_fc->f_action_arr[idx]->offset);
   2946                 }
   2947                 /* Deallocate action configuration */
   2948                 sal_free(stage_fc->f_action_arr[idx]);
   2949             }
   2950         }
   2951 
   2952         /* Deallocate action configuration pointer array */
   2953         sal_free(stage_fc->f_action_arr);
   2954     }
   2955 
   2956     return BCM_E_NONE;
   2957 }
   2958 /*
   2959  * Function:
   2960  *    _field_th_stage_delete
   2961  *
   2962  * Purpose:
   2963  *    Deinitialize a field stage.
   2964  *
   2965  * Parameters:
   2966  *    unit     - (IN) BCM device number
   2967  *    fc       - (IN/OUT) Field control info of device.
   2968  *    stage_fc - (IN) stage control structure.
   2969  *
   2970  * Returns:
   2971  *    BCM_E_PARAM - Device field control information is NULL.
   2972  *    BCM_E_NONE  - Success
   2973  */
   2974 STATIC int
   2975 _field_th_stage_delete(int unit, _field_control_t *fc, _field_stage_t *stage_fc)
   2976 {
   2977     _field_stage_t *stage_iter; /* Device stages iterator. */
   2978     int inst; /* Stage instance iterator. */
   2979 
   2980     /* Input parameters check. */
   2981     if (NULL == fc) {
   2982         return (BCM_E_PARAM);
   2983     }
   2984 
   2985     /* Stage already destroyed. */
   2986     if (NULL == stage_fc) {
   2987         return (BCM_E_NONE);
   2988     }
   2989 
   2990 
   2991     /* First Exact Match Stage Specific delete */
   2992     if (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id) {
   2993         _field_th_emstage_deinit(unit, stage_fc);
   2994     }
   2995 #if defined(BCM_FLOWTRACKER_SUPPORT)
   2996     if ((soc_feature(unit, soc_feature_field_flowtracker_support)) &&
   2997             (_BCM_FIELD_STAGE_FLOWTRACKER == stage_fc->stage_id)) {
   2998         _field_hx5_ftstage_deinit(unit, stage_fc);
   2999     }
   3000 #endif
   3001 
   3002     /* Destroy data qualifiers control structure. */
   3003     if (!soc_feature(unit, soc_feature_td3_style_fp)) {
   3004         _field_th_stage_data_ctrl_deinit(unit, stage_fc);
   3005     }
   3006 
   3007     /* Free memory alloacted for stage qualifiers */
   3008     _bcm_field_stage_qualifiers_free(unit, stage_fc);
   3009 
   3010     /* Free memory allocated for extractors configuration table. */
   3011     _field_th_stage_keygen_extractors_deinit(unit, stage_fc);
   3012 
   3013     /* Free memory allocated for qualifiers input bus mapping table. */
   3014     _field_th_stage_keygen_qual_db_deinit(unit, stage_fc);
   3015 
   3016     /* Free memory allocated for actions configurations. */
   3017     _field_th_stage_actions_deinit(unit, stage_fc);
   3018 
   3019     if (_BCM_FIELD_STAGE_LOOKUP == stage_fc->stage_id) {
   3020         soc_profile_mem_destroy(unit, &stage_fc->hash_select[0]);
   3021         soc_profile_mem_destroy(unit, &stage_fc->hash_select[1]);
   3022     }
   3023 
   3024     /* Free stage per-instance information. */
   3025     for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3026         if (!(fc->pipe_map & (1 << inst))) {
   3027              continue;
   3028         }
   3029         /*
   3030          * Check if slices were initialized for current instance in the
   3031          * stage.
   3032          */
   3033         if (NULL != stage_fc->slices[inst]) {
   3034             /* Deallocate counters usage bitmap. */
   3035             _field_th_instance_counters_deinit(unit, stage_fc, inst);
   3036 
   3037             /* Deallocate instance meters usage bitmap. */
   3038             _field_th_instance_meters_deinit(unit, stage_fc, inst);
   3039 
   3040             /* Deallocate instance entry pointers. */
   3041             _field_th_instance_entries_free(unit, stage_fc, inst);
   3042 
   3043             /* Deallocate instance priority management structures. */
   3044             _field_th_instance_prio_mgmt_deinit(unit, stage_fc, inst);
   3045 
   3046             sal_free(stage_fc->slices[inst]);
   3047             stage_fc->slices[inst] = NULL;
   3048         }
   3049 
   3050         /* Destroy keygen program profiles for valid instances. */
   3051         if ((_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) ||
   3052             (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)) {
   3053             soc_profile_mem_destroy(unit,
   3054                 &stage_fc->keygen_profile[inst].profile);
   3055         }
   3056 
   3057         /* Destroy action profiles for TD3 Ingress */
   3058          if (soc_feature(unit, soc_feature_ifp_action_profiling) &&
   3059              (_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id)) {
   3060              soc_profile_mem_destroy(unit,
   3061                     &stage_fc->action_profile[inst]);
   3062         }
   3063         /* Destroy action profiles for valid instances. */
   3064         if (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id) {
   3065             soc_profile_mem_destroy(unit,
   3066                     &stage_fc->action_profile[inst]);
   3067             soc_profile_mem_destroy(unit,
   3068                     &stage_fc->qos_action_profile[inst]);
   3069         }
   3070     }
   3071 
   3072     /* Deallocate Preselector resources for IFP and EM Stage. */
   3073     _bcm_field_th_preselector_deinit(unit, fc, stage_fc);
   3074 
   3075     /* Destroy all valid range checkers. */
   3076     while (stage_fc->ranges != NULL) {
   3077         bcm_esw_field_range_destroy(unit, stage_fc->ranges->rid);
   3078     }
   3079 
   3080     /* Destroy class status info struct */
   3081     if (stage_fc->stage_id == _BCM_FIELD_STAGE_CLASS) {
   3082         _bcm_field_th_class_stage_status_deinit(unit, stage_fc);
   3083     }
   3084 
   3085     /* Remove stage from stages linked list. */
   3086     stage_iter = fc->stages;
   3087     while (NULL != stage_iter) {
   3088         if (stage_iter == stage_fc) {
   3089             fc->stages = stage_fc->next;
   3090             break;
   3091         } else if (stage_iter->next == stage_fc) {
   3092             stage_iter->next = stage_fc->next;
   3093             break;
   3094         }
   3095         stage_iter = stage_iter->next;
   3096     }
   3097 
   3098     /* Free stage info. */
   3099     sal_free(stage_fc);
   3100     stage_fc = NULL;
   3101 
   3102     return (BCM_E_NONE);
   3103 }
   3104 
   3105 /*
   3106  * Function:
   3107  *     _field_th_instance_slices_init
   3108  *
   3109  * Purpose:
   3110  *    Allocate memory for slices and initialize slice specific flags &
   3111  *    parameters for a specific instance.
   3112  *
   3113  * Parameters:
   3114  *    unit      - (IN) BCM device number.
   3115  *    stage_fc  - (IN/OUT) Stage field control structure.
   3116  *    inst      - (IN) Stage instance information.
   3117  *
   3118  * Returns:
   3119  *     BCM_E_PARAM  - NULL stage control pointer.
   3120  *     BCM_E_MEMORY - Allocation failure.
   3121  *     BCM_E_NONE   - Success.
   3122  */
   3123 STATIC int
   3124 _field_th_instance_slices_init(int unit, _field_stage_t *stage_fc, int inst)
   3125 {
   3126     struct _field_slice_s *fs; /* Slice info. */
   3127     int slice; /* Slice iterator. */
   3128     int mem_sz; /* Memory allocation buffer size. */
   3129 
   3130     /* Input parameters check. */
   3131     if (NULL == stage_fc) {
   3132         return (BCM_E_PARAM);
   3133     }
   3134 
   3135     /* Validate instance value. */
   3136     if (inst < 0 || inst >= stage_fc->num_instances) {
   3137         return (BCM_E_PARAM);
   3138     }
   3139 
   3140     /* Allocate slices info. */
   3141     mem_sz = stage_fc->tcam_slices * sizeof(_field_slice_t);
   3142     fs = sal_alloc(mem_sz, "stage slices info");
   3143     if (NULL == fs) {
   3144         return (BCM_E_MEMORY);
   3145     }
   3146 
   3147     /* Initialze stage slice data structure. */
   3148     sal_memset(fs, 0, mem_sz);
   3149 
   3150     /* Initialize stage instance slices pointer. */
   3151     stage_fc->slices[inst] = fs;
   3152 
   3153     /* Initialize stage slices info. */
   3154     for (slice = 0; slice < stage_fc->tcam_slices; slice++) {
   3155         fs[slice].slice_number = slice;
   3156         fs[slice].stage_id = stage_fc->stage_id;
   3157         fs[slice].next = NULL;
   3158         fs[slice].prev = NULL;
   3159 
   3160         /* Set legacy slice selector settings to don't care. */
   3161         fs[slice].doublewide_key_select = _FP_SELCODE_DONT_CARE;
   3162         fs[slice].src_class_sel = _FP_SELCODE_DONT_CARE;
   3163         fs[slice].dst_class_sel = _FP_SELCODE_DONT_CARE;
   3164         fs[slice].intf_class_sel = _FP_SELCODE_DONT_CARE;
   3165         fs[slice].loopback_type_sel = _FP_SELCODE_DONT_CARE;
   3166         fs[slice].ingress_entity_sel = _FP_SELCODE_DONT_CARE;
   3167         fs[slice].src_entity_sel = _FP_SELCODE_DONT_CARE;
   3168         fs[slice].dst_fwd_entity_sel = _FP_SELCODE_DONT_CARE;
   3169         fs[slice].fwd_field_sel = _FP_SELCODE_DONT_CARE;
   3170 
   3171         /* Both IFP and VFP support Intra Slice Double Wide mode. */
   3172         if ((_BCM_FIELD_STAGE_EGRESS != stage_fc->stage_id) &&
   3173             (_BCM_FIELD_STAGE_EXACTMATCH != stage_fc->stage_id) &&
   3174             (_BCM_FIELD_STAGE_FLOWTRACKER != stage_fc->stage_id)) {
   3175             fs[slice].slice_flags |= _BCM_FIELD_SLICE_INTRASLICE_CAPABLE;
   3176         }
   3177 #if defined(BCM_FLOWTRACKER_SUPPORT)
   3178         if (_BCM_FIELD_STAGE_FLOWTRACKER == stage_fc->stage_id) {
   3179             fs[slice].slice_flags |= _BCM_FIELD_SLICE_MULTIMODE_ENTRIES;
   3180         }
   3181 #endif
   3182     }
   3183 
   3184     return (BCM_E_NONE);
   3185 }
   3186 
   3187 /*
   3188  * Function:
   3189  *    _field_th_slices_init
   3190  *
   3191  * Purpose:
   3192  *    Allocate memory for slices per-instance in a stage.
   3193  *
   3194  * Parameters:
   3195  *    unit - (IN) BCM device number.
   3196  *    stage_fc - (IN/OUT) Stage field control structure.
   3197  *    fc - (IN/OUT) Field control structure.
   3198  *
   3199  * Returns:
   3200  *     BCM_E_PARAM  - NULL stage control pointer or field control.
   3201  *     BCM_E_MEMORY - Allocation failure.
   3202  *     BCM_E_NONE   - Success.
   3203  */
   3204 STATIC int
   3205 _field_th_slices_init(int unit, _field_stage_t *stage_fc, _field_control_t *fc)
   3206 {
   3207     int inst; /* Stage instance iterator. */
   3208     int rv; /* Operation return value. */
   3209 
   3210     /* Input parameters check. */
   3211     if (NULL == fc || NULL == stage_fc) {
   3212         return (BCM_E_PARAM);
   3213     }
   3214 
   3215     /* For all valid instances, initialize slices information. */
   3216     for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3217         if (!(fc->pipe_map & (1 << inst))) {
   3218              continue;
   3219         }
   3220         rv = _field_th_instance_slices_init(unit, stage_fc, inst);
   3221         if (BCM_FAILURE(rv)) {
   3222             LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   3223                 "FP(unit %d) Error: _field_th_instance_slices_init=%d\n"),
   3224                  unit, rv));
   3225             return (rv);
   3226         }
   3227     }
   3228 
   3229     return (BCM_E_NONE);
   3230 }
   3231 
   3232 /*
   3233  * Function:
   3234  *    _field_th_stage_entries_free
   3235  *
   3236  * Purpose:
   3237  *    Free entries array for all stage slices for all instances.
   3238  *
   3239  * Parameters:
   3240  *     unit     - (IN) BCM device number.
   3241  *     stage_fc - (IN/OUT) Stage field control.
   3242  *
   3243  * Returns:
   3244  *     BCM_E_PARAM  - NULL stage control pointer
   3245  *     BCM_E_NONE   - Success.
   3246  */
   3247 STATIC int
   3248 _field_th_stage_entries_free(int unit, _field_stage_t *stage_fc)
   3249 {
   3250     _field_slice_t *fs; /* Field slice pointer. */
   3251     int slice; /* Slice iterator. */
   3252     int inst; /* Instance iterator. */
   3253     _field_control_t    *fc;  /* Field control structure.       */
   3254 
   3255     /* Input prameters check. */
   3256     if (NULL == stage_fc) {
   3257         return (BCM_E_PARAM);
   3258     }
   3259 
   3260     /* Get field control structure. */
   3261     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
   3262 
   3263     /* Deallocate instance entry pointers. */
   3264     for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3265         if (!(fc->pipe_map & (1 << inst))) {
   3266              continue;
   3267         }
   3268         for (slice = 0; slice < stage_fc->tcam_slices; slice++) {
   3269             fs = stage_fc->slices[inst] + slice;
   3270             if (NULL != fs->entries) {
   3271                 sal_free(fs->entries);
   3272                 fs->entries = NULL;
   3273             }
   3274         }
   3275     }
   3276 
   3277     return (BCM_E_NONE);
   3278 }
   3279 
   3280 /*
   3281  * Function:
   3282  *     _field_th_instance_entries_init
   3283  * Purpose:
   3284  *     Initialize Logical Table slice entries for a StageIngress instance.
   3285  * Parameters:
   3286  *     unit     - (IN) BCM device number.
   3287  *     stage_fc - (IN) stage control structure pointer.
   3288  *     inst     - (IN) Field Pipe Instance for which Logical tables must be
   3289  *                     deinitialized.
   3290  * Returns:
   3291  *     BCM_E_PARAM - Device stage field control information is NULL
   3292  *                   or Invalid instance specified.
   3293  *     BCM_E_NONE  - Success
   3294  */
   3295 STATIC int
   3296 _field_th_instance_entries_init(int unit, _field_stage_t *stage_fc, int inst)
   3297 {
   3298     int slice; /* Slice iterator. */
   3299     int tcam_idx; /* Slice first entry tcam index tracker. */
   3300     int mem_sz; /* Allocation size. */
   3301     _field_slice_t *fs; /* Slice config structure. */
   3302     int entry_ratio = 1;  /* Valid entries ratio.*/
   3303 
   3304     /* Input parameters check. */
   3305     if (NULL == stage_fc) {
   3306         return (BCM_E_PARAM);
   3307     }
   3308 
   3309     /* Check if instance is in valid range. */
   3310     if (inst < 0 || inst >= stage_fc->num_instances) {
   3311         return (BCM_E_PARAM);
   3312     }
   3313 
   3314     /* Make sure slices array is initialized. */
   3315     if (NULL == stage_fc->slices[inst]) {
   3316         return (BCM_E_INTERNAL);
   3317     }
   3318     if (soc_feature(unit, soc_feature_field_stage_half_slice)) {
   3319         entry_ratio = 2;
   3320     } else if (soc_feature(unit, soc_feature_field_stage_quarter_slice)) {
   3321         entry_ratio = 4;
   3322     }
   3323 
   3324     /* Iterate over all stage's slices and allocate entries for each slice. */
   3325     for (slice = 0, tcam_idx = 0; slice < stage_fc->tcam_slices; slice++) {
   3326         /* Get Pipe slice control structure pointer. */
   3327         fs = stage_fc->slices[inst] + slice;
   3328 
   3329 #if defined(BCM_TOMAHAWK3_SUPPORT)
   3330         /*  Initialize entries per-slice count. */
   3331         if ((SOC_IS_TOMAHAWK3(unit)) &&
   3332             (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS)) {
   3333             if (slice < _BCM_FIELD_TH3_INGRESS_MAX_SMALL_SLICES) {
   3334                 fs->entry_count = _BCM_FIELD_TH3_INGRESS_SMALL_SLICE_SZ;
   3335                 if (soc_feature(unit, soc_feature_field_ingress_two_slice_types)) {
   3336                     fs->slice_flags |= _BCM_FIELD_SLICE_SIZE_SMALL;
   3337                 }
   3338             } else {
   3339                 fs->entry_count = _BCM_FIELD_TH3_INGRESS_LARGE_SLICE_SZ;
   3340                 if (soc_feature(unit, soc_feature_field_ingress_two_slice_types)) {
   3341                     fs->slice_flags |= _BCM_FIELD_SLICE_SIZE_LARGE;
   3342                 }
   3343             }
   3344         } else
   3345 #endif /* BCM_TOMAHAWK3_SUPPORT */
   3346         {
   3347             fs->entry_count = stage_fc->tcam_sz / stage_fc->tcam_slices;
   3348         }
   3349         /* Calculate size for total entry pointers. */
   3350         mem_sz = fs->entry_count * sizeof(void *);
   3351 
   3352         /* Allocate slice entries pointers array. */
   3353         _FP_XGS3_ALLOC(fs->entries, mem_sz, "array of entry pointers.");
   3354         if (NULL == fs->entries) {
   3355             /* Allocation failed free all previously allocated entries. */
   3356             _field_th_stage_entries_free(unit, stage_fc);
   3357             return (BCM_E_MEMORY);
   3358         }
   3359 
   3360         fs->start_tcam_idx = tcam_idx;
   3361         tcam_idx += fs->entry_count * entry_ratio;
   3362         fs->free_count = fs->entry_count;
   3363     }
   3364 
   3365     return (BCM_E_NONE);
   3366 }
   3367 
   3368 /*
   3369  * Function:
   3370  *    _field_th_entries_init
   3371  *
   3372  * Purpose:
   3373  *    Allocate the memory for entries in all the slices in all instances for a
   3374  *    stage.
   3375  *
   3376  * Parameters:
   3377  *    unit - (IN) BCM device number.
   3378  *    stage_fc - (IN/OUT) Stage field control.
   3379  *
   3380  * Returns:
   3381  *    BCM_E_PARAM   - NULL stage control pointer
   3382  *    BCM_E_MEMORY  - Allocation failure
   3383  *    BCM_E_NONE    - Success
   3384  */
   3385 STATIC int
   3386 _field_th_entries_init(int unit, _field_stage_t *stage_fc,
   3387                        _field_control_t *fc)
   3388 {
   3389     int inst; /* Instance iterator. */
   3390 
   3391     /* Input parameters check. */
   3392     if (NULL == stage_fc) {
   3393         return (BCM_E_PARAM);
   3394     }
   3395 
   3396     /* Iterate over all instances. */
   3397     for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3398         if (!(fc->pipe_map & (1 << inst))) {
   3399              continue;
   3400         }
   3401         BCM_IF_ERROR_RETURN(_field_th_instance_entries_init(unit, stage_fc,
   3402             inst));
   3403     }
   3404 
   3405     return (BCM_E_NONE);
   3406 }
   3407 
   3408 /*
   3409  * Function:
   3410  *    _field_th_meters_deinit
   3411  *
   3412  * Purpose:
   3413  *    Deinitialize merter usage bitmap for all instances in a stage.
   3414  *
   3415  * Parameters:
   3416  *    unit - (IN) BCM device number.
   3417  *    stage_fc - (IN/OUT) Stage field control.
   3418  *
   3419  * Returns:
   3420  *    BCM_E_PARAM  - NULL stage control pointer.
   3421  *    BCM_E_NONE   - Success.
   3422  */
   3423 STATIC int
   3424 _field_th_meters_deinit(int unit, _field_stage_t *stage_fc)
   3425 {
   3426     int inst; /* Instance iterator. */
   3427     _field_control_t    *fc;            /* Field control structure.       */
   3428 
   3429     /* Input parameters check. */
   3430     if (NULL == stage_fc) {
   3431         return (BCM_E_PARAM);
   3432     }
   3433 
   3434     /* Get field control structure. */
   3435     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
   3436 
   3437     /* Free instance meter resources. */
   3438     for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3439         if (!(fc->pipe_map & (1 << inst))) {
   3440              continue;
   3441         }
   3442         _field_th_instance_meters_deinit(unit, stage_fc, inst);
   3443     }
   3444 
   3445     return (BCM_E_NONE);
   3446 }
   3447 
   3448 /*
   3449  * Function:
   3450  *   _field_th_meter_pools_init
   3451  *
   3452  * Purpose:
   3453  *    Initialize field meter pools usage bitmap for all instances in a stage.
   3454  *
   3455  * Parameters:
   3456  *     unit - (IN) BCM device number
   3457  *     stage_fc - (IN/OUT) Stage field control structure.
   3458  *
   3459  * Returns:
   3460  *    BCM_E_PARAM   - NULL stage control pointer.
   3461  *    BCM_E_MEMORY  - Allocation failure.
   3462  *    BCM_E_NONE    - Success.
   3463  */
   3464 STATIC int
   3465 _field_th_meter_pools_init(int unit, _field_stage_t *stage_fc,
   3466                            _field_control_t *fc)
   3467 {
   3468     int inst; /* Instance iterator. */
   3469     int pool_idx; /* Meter pools iterator. */
   3470     int size; /* Number of meters in a pool. */
   3471     _field_meter_pool_t *mp; /* Meter pool pointer. */
   3472     int meter_pairs_per_pool =0;
   3473     int pipe = -1, pool = -1;
   3474     int rv = 0;
   3475 
   3476     /* Input parameters check. */
   3477     if (NULL == stage_fc) {
   3478         return (BCM_E_PARAM);
   3479     }
   3480 
   3481     /* Initialize number of meter pools. */
   3482     if (SOC_IS_TOMAHAWK3(unit)) {
   3483         stage_fc->num_meter_pools = BCM_FIELD_INGRESS_TH3_NUM_METER_POOLS;
   3484     } else {
   3485         stage_fc->num_meter_pools = BCM_FIELD_INGRESS_TH_NUM_METER_POOLS;
   3486     }
   3487 
   3488     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   3489         meter_pairs_per_pool = BCM_FIELD_INGRESS_TD3_NUM_METER_PAIRS_PER_POOL;
   3490     } else {
   3491         meter_pairs_per_pool = BCM_FIELD_INGRESS_TH_NUM_METER_PAIRS_PER_POOL;
   3492     }
   3493     /* Initialize number of meter per pool.*/
   3494     size = SHR_BITALLOCSIZE(meter_pairs_per_pool << 1);
   3495 
   3496     /* Initialize meter pools in all instances. */
   3497     for (inst = 0; inst < _FP_MAX_NUM_PIPES; inst++) {
   3498         if (!(fc->pipe_map & (1 << inst))) {
   3499              continue;
   3500         }
   3501         for (pool_idx = 0; pool_idx < stage_fc->num_meter_pools; pool_idx++) {
   3502             /* Allocate Pipe meter pool memory. */
   3503             stage_fc->meter_pool[inst][pool_idx] =
   3504                 sal_alloc(sizeof(_field_meter_pool_t), "fp_meter_pool");
   3505             if (NULL == stage_fc->meter_pool[inst][pool_idx]) {
   3506                 _field_th_meters_deinit(unit, stage_fc);
   3507                 return (BCM_E_MEMORY);
   3508             }
   3509 
   3510             /* Initialize stage instance meter pool info. */
   3511             mp = stage_fc->meter_pool[inst][pool_idx];
   3512             mp->slice_id = -1;
   3513             mp->level = -1;
   3514             mp->pool_size = (meter_pairs_per_pool * 2);
   3515             mp->size = (meter_pairs_per_pool * 2);
   3516             mp->free_meters = (meter_pairs_per_pool * 2);
   3517             mp->num_meter_pairs = (meter_pairs_per_pool);
   3518 
   3519             /* Allocate instance Per-Pool meter usage bitmap memory. */
   3520             mp->meter_bmp.w = sal_alloc(size, "fp_meters_map");
   3521             if (NULL == mp->meter_bmp.w) {
   3522                 _field_th_meters_deinit(unit, stage_fc);
   3523                 return (BCM_E_MEMORY);
   3524             }
   3525             /* Clear pool meter usage bitmap. */
   3526             sal_memset(mp->meter_bmp.w, 0, size);
   3527         }
   3528     }
   3529 
   3530     if (!(SOC_WARM_BOOT(unit))) {
   3531         for (pipe = 0; pipe < _FP_MAX_NUM_PIPES; pipe++) {
   3532              for (pool = 0; pool < _FIELD_MAX_METER_POOLS; pool++) {
   3533                  if ((stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) &&
   3534                      (fc->ifp_em_meter_in_use[pipe][pool] == 
   3535                      BCM_FIELD_METER_POOL_USED_BY_EM)) {
   3536                      /* Copy from EM to IFP */
   3537                      rv = (_field_stage_meter_pool_copy
   3538                                         (unit, _BCM_FIELD_STAGE_EXACTMATCH,
   3539                                          stage_fc, pipe, pool));
   3540                      BCM_IF_ERROR_RETURN(rv);
   3541                  } else if ((stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) &&
   3542                      (fc->ifp_em_meter_in_use[pipe][pool] == 
   3543                      BCM_FIELD_METER_POOL_USED_BY_IFP)) {
   3544                      /* Copy from IFP to EM */
   3545                      rv = (_field_stage_meter_pool_copy
   3546                                         (unit, _BCM_FIELD_STAGE_INGRESS,
   3547                                          stage_fc, pipe, pool));
   3548                      BCM_IF_ERROR_RETURN(rv);
   3549                  }
   3550              }
   3551         }
   3552     }
   3553     return (BCM_E_NONE);
   3554 }
   3555 
   3556 /*
   3557  * Function:
   3558  *    _field_th_slice_meters_init
   3559  *
   3560  * Purpose:
   3561  *    Initialize field slice meters usage bitmap for all instances in a stage.
   3562  *
   3563  * Parameters:
   3564  *    unit - (IN) BCM device number
   3565  *    stage_fc - (IN/OUT) Stage field control structure.
   3566  *
   3567  * Returns:
   3568  *    BCM_E_PARAM   - NULL stage control pointer.
   3569  *    BCM_E_MEMORY  - Allocation failure.
   3570  *    BCM_E_NONE    - Success.
   3571  */
   3572 STATIC int
   3573 _field_th_slice_meters_init(int unit, _field_stage_t *stage_fc,
   3574                             _field_control_t *fc)
   3575 {
   3576     _field_slice_t *fs; /* Slice config structure. */
   3577     int inst; /* Instance iterator. */
   3578     int size; /* Allocation size. */
   3579     int slice; /* Slice iterator. */
   3580 
   3581     /* Input parameters check. */
   3582     if (NULL == stage_fc) {
   3583         return (BCM_E_PARAM);
   3584     }
   3585 
   3586     /* Iterate over all instances and slices and initialize meter information.*/
   3587     for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3588         if (!(fc->pipe_map & (1 << inst))) {
   3589              continue;
   3590         }
   3591         for (slice = 0; slice <stage_fc->tcam_slices; slice++) {
   3592 
   3593             /* Get the slice pointer. */
   3594             fs = stage_fc->slices[inst] + slice;
   3595 
   3596             size = SHR_BITALLOCSIZE(_BCM_FIELD_SLICE_SIZE(stage_fc, inst, 0));
   3597             /* Allocate meter usage bitmap. */
   3598             fs->meter_bmp.w = sal_alloc(size, "fp_meters_map");
   3599             if (NULL == fs->meter_bmp.w) {
   3600                 _field_th_meters_deinit(unit, stage_fc);
   3601                 return (BCM_E_MEMORY);
   3602             }
   3603 
   3604             /* Set slice meter count and clear usage bitmap. */
   3605             fs->meters_count = _BCM_FIELD_SLICE_SIZE(stage_fc, inst, 0);
   3606             sal_memset(fs->meter_bmp.w, 0, size);
   3607         }
   3608     }
   3609     return (BCM_E_NONE);
   3610 }
   3611 
   3612 /*
   3613  * Function:
   3614  *   _field_th_meters_init
   3615  *
   3616  * Purpose:
   3617  *    Initialize field meter usage bitmap for the sage.
   3618  *
   3619  * Parameters:
   3620  *    unit - (IN) BCM device number
   3621  *    stage_fc - (IN/OUT) Stage field control structure.
   3622  *
   3623  * Returns:
   3624  *    BCM_E_PARAM   - NULL stage control pointer.
   3625  *    BCM_E_MEMORY  - Allocation failure.
   3626  *    BCM_E_NONE    - Success.
   3627  */
   3628 STATIC int
   3629 _field_th_meters_init(int unit, _field_stage_t *stage_fc,
   3630                        _field_control_t *fc)
   3631 {
   3632     /* Input parameters check. */
   3633     if (NULL == stage_fc) {
   3634         return (BCM_E_PARAM);
   3635     }
   3636 
   3637     /* Lookup stage has no dedicated meter support.
   3638      * Exact stage uses IFP meter table.
   3639      */
   3640     if ((_BCM_FIELD_STAGE_LOOKUP == stage_fc->stage_id) ||
   3641         (_BCM_FIELD_STAGE_FLOWTRACKER == stage_fc->stage_id)) {
   3642         return (BCM_E_NONE);
   3643     }
   3644 
   3645     /* Initialize Global meter pools information for IFP. */
   3646     if (stage_fc->flags & _FP_STAGE_GLOBAL_METER_POOLS) {
   3647         return (_field_th_meter_pools_init(unit, stage_fc, fc));
   3648     }
   3649 
   3650     /* Initialize slice meters for EFP. */
   3651     return (_field_th_slice_meters_init(unit, stage_fc, fc));
   3652 }
   3653 
   3654 /*
   3655  * Function:
   3656  *   _field_th_stage_data_ctrl_init
   3657  *
   3658  * Purpose:
   3659  *    Allocate and initialize data qualifiers control structure.
   3660  *
   3661  * Parameters:
   3662  *    unit - (IN) BCM device number.
   3663  *    stage_fc - (IN/OUT) Stage field control structure.
   3664  *
   3665  * Returns:
   3666  *    BCM_E_PARAM   - NULL stage control pointer.
   3667  *    BCM_E_MEMORY  - Allocation failure.
   3668  *    BCM_E_NONE    - Success.
   3669  */
   3670 STATIC int
   3671 _field_th_stage_data_ctrl_init(int unit, _field_stage_t *stage_fc)
   3672 {
   3673     int mem_sz; /* Memory size. */
   3674     _field_data_control_t *data_ctrl = NULL;
   3675 
   3676     /* Input prameters check. */
   3677     if (NULL == stage_fc) {
   3678         return (BCM_E_PARAM);
   3679     }
   3680 
   3681     /* Allocate data control structure. */
   3682     mem_sz = sizeof(_field_data_control_t);
   3683     _FP_XGS3_ALLOC(data_ctrl, mem_sz, "Data qualification control");
   3684     if (NULL == data_ctrl) {
   3685         return (BCM_E_MEMORY);
   3686     }
   3687 
   3688     /* Allocate data TCAM entry control structure. */
   3689     mem_sz = sizeof(_field_data_tcam_entry_t) *
   3690                 soc_mem_index_count(unit, FP_UDF_TCAMm);
   3691     _FP_XGS3_ALLOC(data_ctrl->tcam_entry_arr, mem_sz, "UDF tcam entry array");
   3692     if (NULL == data_ctrl->tcam_entry_arr) {
   3693         sal_free(data_ctrl);
   3694         return (BCM_E_MEMORY);
   3695     }
   3696 
   3697     /* Initialize UDF offset geometry. */
   3698     data_ctrl->elem_size = 2;
   3699     data_ctrl->num_elems = 8;
   3700 
   3701     /* Initialize stage data control structure. */
   3702     stage_fc->data_ctrl = data_ctrl;
   3703     return (BCM_E_NONE);
   3704 }
   3705 
   3706 /*
   3707  * Function:
   3708  *    _field_th_instance_slice_counters_alloc
   3709  *
   3710  * Purpose:
   3711  *    Allocate counters usage bitmap for a slice in an instance.
   3712  *
   3713  * Parameters:
   3714  *     unit - (IN) BCM device number.
   3715  *     fs - (IN/OUT) Slice control structure.
   3716  *
   3717  * Returns:
   3718  *    BCM_E_PARAM   - NULL slice structure pointer.
   3719  *    BCM_E_MEMORY  - Allocation failure.
   3720  *    BCM_E_NONE    - Success.
   3721  */
   3722 STATIC int
   3723 _field_th_instance_slice_counters_alloc(int unit, _field_slice_t *fs)
   3724 {
   3725     int size; /* Allocation size. */
   3726 
   3727     /* Input parameters check. */
   3728     if (NULL == fs) {
   3729         return (BCM_E_PARAM);
   3730     }
   3731 
   3732     /* Determine the counter bit array size. */
   3733     size = SHR_BITALLOCSIZE(fs->counters_count);
   3734 
   3735     /* Allocate counter usage map memory. */
   3736     fs->counter_bmp.w = sal_alloc(size, "fp_counter_map");
   3737     if (NULL == fs->counter_bmp.w) {
   3738         return (BCM_E_MEMORY);
   3739     }
   3740     sal_memset(fs->counter_bmp.w, 0, size);
   3741     return (BCM_E_NONE);
   3742 }
   3743 
   3744 /*
   3745  * Function:
   3746  *    _field_th_counters_deinit
   3747  *
   3748  * Purpose:
   3749  *    Deinitialize slice counter usage bitmap for all instances in a stage.
   3750  *
   3751  * Parameters:
   3752  *    unit - (IN) BCM device number
   3753  *    stage_fc - (IN/OUT) Stage field control structure.
   3754  *
   3755  * Returns:
   3756  *     BCM_E_NONE - Success
   3757  */
   3758 STATIC int
   3759 _field_th_counters_deinit(int unit, _field_stage_t *stage_fc)
   3760 {
   3761     int slice; /* Slice iterator. */
   3762     int inst; /* Instance iterator. */
   3763     _field_control_t    *fc;            /* Field control structure.       */
   3764 
   3765     /* Input parameters check. */
   3766     if (NULL == stage_fc) {
   3767         return (BCM_E_NONE);
   3768     }
   3769 
   3770     /* Get field control structure. */
   3771     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
   3772 
   3773     /*
   3774      * VFP and IFP use Flex counter pools, skip per-slice
   3775      * counter bitmap allocation.
   3776      */
   3777     if (_BCM_FIELD_STAGE_LOOKUP == stage_fc->stage_id
   3778         || _BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) {
   3779         return (BCM_E_NONE);
   3780     }
   3781 
   3782     /* Counters usage bitmap is maintained only for slice_0 in EFP. */
   3783     for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3784         if (!(fc->pipe_map & (1 << inst))) {
   3785              continue;
   3786         }
   3787         /* Free counter usage bitmap in slice_0 for each instance. */
   3788         if (NULL != stage_fc->slices[inst][0].counter_bmp.w) {
   3789             sal_free(stage_fc->slices[inst][0].counter_bmp.w);
   3790         }
   3791 
   3792         /* Initialize counter usage bitmap pointer value to NULL. */
   3793         for (slice = 0; slice < stage_fc->tcam_slices; slice++) {
   3794             stage_fc->slices[inst][slice].counter_bmp.w = NULL;
   3795         }
   3796     }
   3797 
   3798     return (BCM_E_NONE);
   3799 }
   3800 
   3801 /*
   3802  * Function:
   3803  *    _field_th_counters_init
   3804  *
   3805  * Purpose:
   3806  *    Initialize slice counter usage bitmap for all slices in a stage.
   3807  *
   3808  * Parameters:
   3809  *     unit - (IN) BCM device number.
   3810  *     fc - (IN) Field control structure.
   3811  *     stage_fc - (IN/OUT) Stage field control structure.
   3812  *
   3813  * Returns:
   3814  *    BCM_E_PARAM - Null field control structure or stage control parameter.
   3815  *    BCM_E_INTERNAL - Null stage slice control structure.
   3816  *    BCM_E_MEMORY - Allocation failure.
   3817  *    BCM_E_NONE - Success.
   3818  */
   3819 STATIC int
   3820 _field_th_counters_init(int unit,
   3821                         _field_control_t *fc,
   3822                         _field_stage_t *stage_fc)
   3823 {
   3824     _field_slice_t *fs; /* Slice config structure. */
   3825     int slice; /* Slice iterator. */
   3826     int inst; /* Instance iterator. */
   3827     int rv; /* Operation return value. */
   3828     int cntr_share = FALSE; /* Share counter with slice_0 */
   3829 
   3830 
   3831     /* Input parameters check. */
   3832     if (NULL == stage_fc || NULL == fc) {
   3833         return (BCM_E_PARAM);
   3834     }
   3835 
   3836     for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3837         if (!(fc->pipe_map & (1 << inst))) {
   3838              continue;
   3839         }
   3840         for (slice = 0; slice < stage_fc->tcam_slices; slice++) {
   3841 
   3842             /* Get the slice pointer. */
   3843             fs = stage_fc->slices[inst] + slice;
   3844 
   3845             /*
   3846              * VFP and IFP use flex counter resources hence slice
   3847              * counters count is zero.
   3848              */
   3849             if ((_BCM_FIELD_STAGE_LOOKUP == stage_fc->stage_id)
   3850                 || (_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id)
   3851                 || (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)
   3852                 || (_BCM_FIELD_STAGE_FLOWTRACKER == stage_fc->stage_id)) {
   3853                 fs->counters_count = 0;
   3854                 continue;
   3855             }
   3856 
   3857             /* Initialize counters for EFP stage. */
   3858             fs->counters_count = soc_mem_index_count(unit, EFP_COUNTER_TABLEm);
   3859 
   3860             /*
   3861              * All EFP slices share the same global counter pool.
   3862              * For slices > 0, counter sharing is TRUE.
   3863              */
   3864             if (slice) {
   3865                 cntr_share = TRUE;
   3866             }
   3867 
   3868             /* Share counters with slice zero (Global counter pool). */
   3869             if (cntr_share) {
   3870                 stage_fc->slices[inst][slice].counter_bmp.w =
   3871                     stage_fc->slices[inst][0].counter_bmp.w;
   3872             } else {
   3873                 /* Allocate new set of counters for the slice. */
   3874                 rv = _field_th_instance_slice_counters_alloc(unit, fs);
   3875                 if (BCM_FAILURE(rv)) {
   3876                     LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   3877                         "FP(unit %d) Error: "
   3878                         "_field_th_instance_slice_counters_alloc=%d\n"),
   3879                          unit, rv));
   3880                     _field_th_counters_deinit(unit, stage_fc);
   3881                     return (rv);
   3882                 }
   3883             }
   3884         }
   3885         cntr_share = FALSE;
   3886     }
   3887 
   3888     return (BCM_E_NONE);
   3889 }
   3890 
   3891 /*
   3892  * Function:
   3893  *    _field_th_keygen_profiles_init
   3894  * Purpose:
   3895  *   Initialize keygen program profiles based on group operational mode.
   3896  * Parameters:
   3897  *     unit - (IN) BCM device number.
   3898  *     stage_fc - (IN/OUT) Stage field control structure.
   3899  *
   3900  * Returns:
   3901  *    BCM_E_PARAM - Null field control structure or stage control parameter.
   3902  *    BCM_E_INTERNAL - Null stage slice control structure.
   3903  *    BCM_E_MEMORY - Allocation failure.
   3904  *    BCM_E_NONE - Success.
   3905  */
   3906 int
   3907 _field_th_keygen_profiles_init(int unit, _field_stage_t *stage_fc,
   3908                                _field_control_t *fc)
   3909 {
   3910     soc_mem_t mem[2];               /* SOC memory names.                  */
   3911     int entry_words[2];             /* Entry size in words.               */
   3912     int inst;                       /* Instance iterator.                 */
   3913     int rv;                         /* Operation return status.           */
   3914 
   3915     /* Input parameter check. */
   3916     if (NULL == stage_fc) {
   3917         return (BCM_E_PARAM);
   3918     }
   3919 
   3920     switch (stage_fc->oper_mode) {
   3921         /* Field Groups operational in Global mode. */
   3922         case bcmFieldGroupOperModeGlobal:
   3923 
   3924             if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) {
   3925                 /* Initialize profile1 memory name. */
   3926                 mem[0] = IFP_KEY_GEN_PROGRAM_PROFILEm;
   3927 
   3928                 /* Initialize profile2 memory name. */
   3929                 mem[1] = IFP_KEY_GEN_PROGRAM_PROFILE2m;
   3930 
   3931                 /* Determine keygen profile entry size in number of words. */
   3932                 entry_words[0] = soc_mem_entry_words(unit, mem[0]);
   3933 
   3934                 /* Determine post mux profile entry size in number of words. */
   3935                 entry_words[1] = soc_mem_entry_words(unit, mem[1]);
   3936 
   3937                 /* Create keygen program profile table. */
   3938                 rv = soc_profile_mem_create(unit, mem, entry_words, 2,
   3939                         &stage_fc->keygen_profile[_FP_DEF_INST].profile);
   3940                 if (BCM_FAILURE(rv)) {
   3941                     LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   3942                         "FP(unit %d) Error: Ingress "
   3943                         "Keygen profile creation failed."
   3944                         "=%d\n"), unit, rv));
   3945                     return (rv);
   3946                 }
   3947             } else if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
   3948 
   3949                 /* Initialize profile memory name. */
   3950                 mem[0] = EXACT_MATCH_KEY_GEN_PROGRAM_PROFILEm;
   3951 
   3952                 /* Initialize keygen mask profile memory name */
   3953                 mem[1] = EXACT_MATCH_KEY_GEN_MASKm;
   3954 
   3955                 /* Determine keygen profile entry size in number of words. */
   3956                 entry_words[0] = soc_mem_entry_words(unit, mem[0]);
   3957 
   3958                 /* Determine keygen mask profile entry size in words. */
   3959                 entry_words[1] = soc_mem_entry_words(unit, mem[1]);
   3960 
   3961                 /* Create keygen program profile table. */
   3962                 rv = soc_profile_mem_create(unit, mem, entry_words, 2,
   3963                         &stage_fc->keygen_profile[_FP_DEF_INST].profile);
   3964 
   3965                 if (BCM_FAILURE(rv)) {
   3966                     LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   3967                         "FP(unit %d) Error: Exact Match "
   3968                         "Keygen profile creation failed."
   3969                         "=%d\n"), unit, rv));
   3970                     return (rv);
   3971                 }
   3972             } else {
   3973                 /* Invalid stage id */
   3974                 return (BCM_E_INTERNAL);
   3975             }
   3976             break;
   3977 
   3978         /* Field Groups operational in Per-Pipe mode. */
   3979         case bcmFieldGroupOperModePipeLocal:
   3980 
   3981             if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) {
   3982                 /* Determine keygen profiles entry size in number of words. */
   3983                 entry_words[0] = soc_mem_entry_words(unit,
   3984                         IFP_KEY_GEN_PROGRAM_PROFILE_PIPE0m);
   3985                 entry_words[1] = soc_mem_entry_words(unit,
   3986                         IFP_KEY_GEN_PROGRAM_PROFILE2_PIPE0m);
   3987 
   3988                 for (inst = 0; inst < stage_fc->num_instances; inst++) {
   3989                     if (!(fc->pipe_map & (1 << inst))) {
   3990                          continue;
   3991                     }
   3992                     /* Initialize keygen program profile1 memory name. */
   3993                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
   3994                                                IFP_KEY_GEN_PROGRAM_PROFILEm,
   3995                                                inst,
   3996                                                &mem[0]));
   3997                     /* Initialize keygen program profile2 memory name. */
   3998                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
   3999                                                IFP_KEY_GEN_PROGRAM_PROFILE2m,
   4000                                                inst,
   4001                                                &mem[1]));
   4002 
   4003                     /* Create keygen program profile table. */
   4004                     rv = soc_profile_mem_create(unit, mem, entry_words, 2,
   4005                             &stage_fc->keygen_profile[inst].profile);
   4006                     if (BCM_FAILURE(rv)) {
   4007                         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4008                            "FP(unit %d) Error: Ingress "
   4009                            "KeyGen profile creation failed."
   4010                            "=%d\n"), unit, rv));
   4011                         return (rv);
   4012                     }
   4013                 }
   4014             } else if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
   4015 
   4016                 /* Determine keygen profiles entry size in number of words. */
   4017                 entry_words[0] = soc_mem_entry_words(unit,
   4018                         EXACT_MATCH_KEY_GEN_PROGRAM_PROFILE_PIPE0m);
   4019                 entry_words[1] = soc_mem_entry_words(unit,
   4020                         EXACT_MATCH_KEY_GEN_MASK_PIPE0m);
   4021 
   4022                 for (inst = 0; inst < stage_fc->num_instances; inst++) {
   4023                     if (!(fc->pipe_map & (1 << inst))) {
   4024                          continue;
   4025                     }
   4026                     /* Initialize keygen program profile memory name. */
   4027                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
   4028                                          EXACT_MATCH_KEY_GEN_PROGRAM_PROFILEm,
   4029                                          inst,
   4030                                          &mem[0]));
   4031                     /* Initialize keygen mask memory name. */
   4032                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
   4033                                                EXACT_MATCH_KEY_GEN_MASKm,
   4034                                                inst,
   4035                                                &mem[1]));
   4036                     /* Create keygen program profile table. */
   4037                     rv = soc_profile_mem_create(unit, mem, entry_words, 2,
   4038                             &stage_fc->keygen_profile[inst].profile);
   4039 
   4040                     if (BCM_FAILURE(rv)) {
   4041                         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4042                            "FP(unit %d) Error: Exact Match "
   4043                            "KeyGen profile creation failed."
   4044                            "=%d\n"), unit, rv));
   4045                         return (rv);
   4046                     }
   4047                 }
   4048             } else {
   4049                 /* Invalid stage id */
   4050                 return (BCM_E_INTERNAL);
   4051             }
   4052             break;
   4053 
   4054         default:
   4055             /*
   4056              * Invalid Group Operational mode, should never hit this condition.
   4057              */
   4058             return (BCM_E_INTERNAL);
   4059     }
   4060 
   4061     return (BCM_E_NONE);
   4062 }
   4063 
   4064 /*
   4065  *  Function:
   4066  *     _field_th_stage_core_init
   4067  * Purpose:
   4068  *    Initialize all data structures related to a Field Pipeline stage.
   4069  * Parameters:
   4070  *     unit         - (IN) BCM device number.
   4071  *     fc           - (IN/OUT) Field control structure.
   4072  *     stage_fc     - (IN/OUT) Stage field control structure.
   4073  *
   4074  * Returns:
   4075  *    BCM_E_PARAM - Null field control structure or stage control parameter.
   4076  *    BCM_E_INTERNAL - Invalid CAP stage detected.
   4077  *    BCM_E_MEMORY - Allocation failure.
   4078  *    BCM_E_NONE - Success.
   4079  */
   4080 STATIC int
   4081 _field_th_stage_core_init(int unit,
   4082                           _field_control_t *fc,
   4083                           _field_stage_t *stage_fc)
   4084 {
   4085     int rv = BCM_E_INTERNAL; /* Operation return value. */
   4086     int entry_words; /* Redirection profile entry size. */
   4087     soc_mem_t mem; /* SOC Memory name variable. */
   4088     int map_id; /* Virtual Group entry iterator. */
   4089     int idx; /* Virtual priority iterator. */
   4090     int inst; /* Pipe Instance. */
   4091 
   4092     /* Input prameters check. */
   4093     if ((NULL == fc) || (NULL == stage_fc)) {
   4094         return (BCM_E_PARAM);
   4095     }
   4096 
   4097     /* Initialize stage slices information. */
   4098     rv = _field_th_slices_init(unit, stage_fc, fc);
   4099     if (BCM_FAILURE(rv)) {
   4100         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4101             "FP(unit %d) Error: _field_th_slices_init=%d\n"), unit, rv));
   4102         _field_th_stage_delete(unit, fc, stage_fc);
   4103         return (rv);
   4104     }
   4105 
   4106     /* Initialize stage slices entries information. */
   4107     rv = _field_th_entries_init(unit, stage_fc, fc);
   4108     if (BCM_FAILURE(rv)) {
   4109         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4110             "FP(unit %d) Error: _field_th_entries_init=%d\n"), unit, rv));
   4111         _field_th_stage_delete(unit, fc, stage_fc);
   4112         return (rv);
   4113     }
   4114 
   4115     /* Initialize Meters. */
   4116     rv = _field_th_meters_init(unit, stage_fc, fc);
   4117     if (BCM_FAILURE(rv)) {
   4118         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4119             "FP(unit %d) Error: _field_th_meters_init=%d\n"), unit, rv));
   4120         _field_th_stage_delete(unit, fc, stage_fc);
   4121         return (rv);
   4122     }
   4123 
   4124     /* Initialize counters usage bitmap. */
   4125     rv = _field_th_counters_init(unit, fc, stage_fc);
   4126     if (BCM_FAILURE(rv)) {
   4127         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4128             "FP(unit %d) Error: _field_th_counters_init=%d\n"), unit, rv));
   4129         _field_th_stage_delete(unit, fc, stage_fc);
   4130         return (rv);
   4131     }
   4132 
   4133     /* Action profile; will be setup in chip-specific init */
   4134     soc_profile_mem_t_init(&stage_fc->ext_act_profile);
   4135 
   4136     /* Redirection action profile table initialization. */
   4137     if (_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) {
   4138 
   4139         /* Initialize regular keygen and post mux keygen program profiles. */
   4140         rv = _field_th_keygen_profiles_init(unit, stage_fc, fc);
   4141         if (BCM_FAILURE(rv)) {
   4142             LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4143                 "FP(unit %d) Error: _field_th_keygen_profiles_init=%d\n"),
   4144                  unit, rv));
   4145             _field_th_stage_delete(unit, fc, stage_fc);
   4146             return (rv);
   4147         }
   4148 
   4149         /* Initialize range checker seed ID value. */
   4150         stage_fc->range_id = 1;
   4151         if (soc_feature(unit, soc_feature_udf_support)) {
   4152             /* Initialize stage data control information. */
   4153             rv = _field_th_stage_data_ctrl_init(unit, stage_fc);
   4154             if (BCM_FAILURE(rv)) {
   4155                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4156                     "FP(unit %d) Error: _field_th_stage_data_ctrl_init=%d\n"),
   4157                      unit, rv));
   4158                  _field_th_stage_delete(unit, fc, stage_fc);
   4159                  return (rv);
   4160              }
   4161          }
   4162     }
   4163 
   4164     switch (stage_fc->stage_id) {
   4165 
   4166         case _BCM_FIELD_STAGE_LOOKUP:
   4167             /* hash select action memory profile initialization. */
   4168             soc_profile_mem_t_init(&stage_fc->hash_select[0]);
   4169             soc_profile_mem_t_init(&stage_fc->hash_select[1]);
   4170 
   4171             /* Hash select 0 action profile table initialization. */
   4172             if (SOC_MEM_IS_VALID(unit, VFP_HASH_FIELD_BMAP_TABLE_Am)) {
   4173                 mem = VFP_HASH_FIELD_BMAP_TABLE_Am;
   4174                 entry_words = sizeof(vfp_hash_field_bmap_table_a_entry_t) /
   4175                                  sizeof(uint32);
   4176                 rv = soc_profile_mem_create(unit, &mem, &entry_words, 1,
   4177                                              &stage_fc->hash_select[0]);
   4178 
   4179                 if (BCM_FAILURE(rv)) {
   4180                     _field_th_stage_delete(unit, fc, stage_fc);
   4181                     return (rv);
   4182                 }
   4183             }
   4184             /* Hash select 1 action profile table initialization. */
   4185             if (SOC_MEM_IS_VALID(unit, VFP_HASH_FIELD_BMAP_TABLE_Bm)) {
   4186                 mem = VFP_HASH_FIELD_BMAP_TABLE_Bm;
   4187                 entry_words = sizeof(vfp_hash_field_bmap_table_a_entry_t) /
   4188                                  sizeof(uint32);
   4189                 rv = soc_profile_mem_create(unit, &mem, &entry_words, 1,
   4190                                              &stage_fc->hash_select[1]);
   4191 
   4192                 if (BCM_FAILURE(rv)) {
   4193                     _field_th_stage_delete(unit, fc, stage_fc);
   4194                     return (rv);
   4195                 }
   4196             }
   4197             /*
   4198              * Index 0 of vfp_hash_field_bmap_table_a/b is invalid as the
   4199              * hardware will consider hash bitmap selection from VFP only
   4200              * if HASH_FIELD_BITMAP_PTR_A and HASH_FIELD_BITMAP_PTR_B are non-zero.
   4201              * Making the entry to NULL.
   4202              */
   4203             rv = _bcm_field_td2_hash_select_profile_alloc_reserve_entry(unit,
   4204                                                                     stage_fc);
   4205             if (BCM_FAILURE(rv)) {
   4206                 _field_th_stage_delete(unit, fc, stage_fc);
   4207                 return (rv);
   4208             }
   4209         /* passthru */
   4210         /* coverity[MISSING_BREAK: FALSE] */
   4211         case _BCM_FIELD_STAGE_EGRESS:
   4212             /* Initializing supported Qset*/
   4213             sal_memset(&stage_fc->_field_supported_qset, 0, sizeof(bcm_field_qset_t));
   4214             /*
   4215              * Initialize the FP_SLICE_MAP for VFP and EFP.
   4216              *     Physical_slice and virtual_group are H/W initial values
   4217              */
   4218             for (inst = 0; inst < stage_fc->num_instances; inst++) {
   4219                if (!(fc->pipe_map & (1 << inst))) {
   4220                     continue;
   4221                }
   4222                for (map_id = 0; map_id < _FP_VMAP_CNT; map_id++) {
   4223                    for (idx = 0; idx < _FP_VMAP_SIZE; idx++) {
   4224                        stage_fc->vmap[inst][map_id][idx].valid = FALSE;
   4225                        stage_fc->vmap[inst][map_id][idx].vmap_key = idx;
   4226                        stage_fc->vmap[inst][map_id][idx].virtual_group = idx;
   4227                        stage_fc->vmap[inst][map_id][idx].flags = 0;
   4228                    }
   4229                }
   4230             }
   4231             break;
   4232 
   4233         case _BCM_FIELD_STAGE_INGRESS:
   4234             /* Initialize group running priority */ 
   4235             stage_fc->group_running_prio = BCM_FIELD_GROUP_PRIO_ANY;
   4236 
   4237             /* Initializing supported Qset*/
   4238             sal_memset(&stage_fc->_field_supported_qset, 0, sizeof(bcm_field_qset_t));
   4239             /* Initialize stage Preselector information. */
   4240             rv = _bcm_field_th_stage_preselector_init(unit, fc, stage_fc);
   4241             if (BCM_FAILURE(rv)) {
   4242                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4243                     "FP(unit %d) Error: _bcm_field_th_stage_preselector_init=%d"
   4244                     "\n"), unit, rv));
   4245                 _field_th_stage_delete(unit, fc, stage_fc);
   4246                 return (rv);
   4247             }
   4248 
   4249             /*
   4250              * Initialize stage's extractor configuration for various slice
   4251              * modes.
   4252              */
   4253 #if defined (BCM_TOMAHAWK3_SUPPORT)
   4254             if (soc_feature(unit, soc_feature_th3_style_fp)) {
   4255                 rv = _bcm_field_th3_extractors_init(unit, stage_fc);
   4256             } else
   4257 #endif /* BCM_TOMAHAWK3_SUPPORT */
   4258             {
   4259                 rv = _field_th_stage_extractors_init(unit, stage_fc);
   4260             }
   4261 
   4262             if (BCM_FAILURE(rv)) {
   4263                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4264                     "FP(unit %d) Error: _field_th_stage_extractors_init=%d\n"),
   4265                     unit, rv));
   4266                 _field_th_stage_delete(unit, fc, stage_fc);
   4267                 return (rv);
   4268             }
   4269 #if defined(BCM_TRIDENT3_SUPPORT)
   4270             if (soc_feature(unit, soc_feature_td3_style_fp)) {
   4271                 /* Intialize IFP_EM_DROP_VECTOR_MASK with default value */
   4272                 rv = _bcm_field_td3_drop_vector_mask_init(unit);
   4273                 if (BCM_FAILURE(rv)) {
   4274                     LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4275                         "FP(unit %d) Error: _bcm_field_td3_drop_vector_mask_init=%d\n"),
   4276                          unit, rv));
   4277                     _field_th_stage_delete(unit, fc, stage_fc);
   4278                     return (rv);
   4279                 }
   4280 
   4281                 /* Initialize InPorts flex support. */
   4282                 rv = _bcm_field_td3_inports_flex_init(unit);
   4283                 if (BCM_FAILURE(rv)) {
   4284                     LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4285                         "FP(unit %d) Error: _bcm_field_td3_inports_flex_init=%d\n"),
   4286                          unit, rv));
   4287                     _field_th_stage_delete(unit, fc, stage_fc);
   4288                     return (rv);
   4289                 }
   4290                 /* Initialize IFP qualifers to HW input bus fields & offsets. */
   4291                 rv = _field_td3_stage_quals_ibus_map_init(unit, stage_fc);
   4292             } else
   4293 #endif
   4294 #if defined(BCM_TOMAHAWK3_SUPPORT)
   4295             if (soc_feature(unit, soc_feature_th3_style_fp)) {
   4296                 rv = _bcm_field_th3_qualifiers_init(unit, stage_fc);
   4297             } else
   4298 #endif /* BCM_TOMAHAWK3_SUPPORT */
   4299             {
   4300                 rv = _field_th_stage_quals_ibus_map_init(unit, stage_fc);
   4301             }
   4302 
   4303             if (BCM_FAILURE(rv)) {
   4304                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4305                     "FP(unit %d) Error: _field_th_stage_extractors_init=%d\n"),
   4306                     unit, rv));
   4307                 _field_th_stage_delete(unit, fc, stage_fc);
   4308                 return (rv);
   4309             }
   4310 #if defined(BCM_TRIDENT3_SUPPORT)
   4311             /* Initialize action profiles */
   4312             if (soc_feature(unit, soc_feature_ifp_action_profiling)) {
   4313                 _field_td3_ingress_action_profiles_init(unit, stage_fc);
   4314             }
   4315 #endif
   4316             break;
   4317         case _BCM_FIELD_STAGE_EXACTMATCH:
   4318             /* Initialize stage control for exact match */
   4319             rv = _field_th_emstage_init(unit, fc, stage_fc);
   4320             if (BCM_FAILURE(rv)) {
   4321                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4322                           "FP(unit %d) Error: _field_th_emstage_init=%d\n"),
   4323                           unit, rv));
   4324                 _field_th_stage_delete(unit, fc, stage_fc);
   4325                 return (rv);
   4326             }
   4327             break;
   4328 #if defined(BCM_FLOWTRACKER_SUPPORT)
   4329         case _BCM_FIELD_STAGE_FLOWTRACKER:
   4330             /* Initalize stage control for Flowtracker */
   4331             rv = _field_hx5_ftstage_init(unit, fc, stage_fc);
   4332             if (BCM_FAILURE(rv)) {
   4333                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4334                     "FP(unit %d) Error: _field_hx5_ftstage_init=%d"
   4335                     "\n"), unit, rv));
   4336                 _field_th_stage_delete(unit, fc, stage_fc);
   4337                 return (rv);
   4338             }
   4339             break;
   4340 #endif
   4341         default:
   4342             /* Should never hit this condition. */
   4343             return (BCM_E_INTERNAL);
   4344     }
   4345 
   4346     FP_LOCK(unit);
   4347 
   4348     /* Add stage to Field Control structure. */
   4349     stage_fc->next = fc->stages;
   4350     fc->stages = stage_fc;
   4351 
   4352     FP_UNLOCK(unit);
   4353 
   4354     return (rv);
   4355 }
   4356 
   4357 /*
   4358  * Function:
   4359  *    _field_th_stage_add
   4360  *
   4361  * Purpose:
   4362  *    Initialize all data structures related to a field stage.
   4363  *
   4364  * Parameters:
   4365  *     unit - (IN) BCM device number.
   4366  *     fc - (IN/OUT) Field control structure.
   4367  *     stage_id - (IN) Field processor stage ID.
   4368  *
   4369  * Returns:
   4370  *    BCM_E_PARAM - Null field control structure.
   4371  *    BCM_E_INTERNAL - Null stage slice control structure.
   4372  *    BCM_E_MEMORY - Allocation failure.
   4373  *    BCM_E_NONE - Success.
   4374  */
   4375 STATIC int
   4376 _field_th_stage_add(int unit,
   4377                     _field_control_t *fc,
   4378                     _field_stage_id_t stage_id,
   4379                     bcm_field_group_oper_mode_t mode)
   4380 {
   4381     int rv = BCM_E_INTERNAL; /* Operation return value. */
   4382     _field_stage_t *stage_fc; /* Stage information. */
   4383     int entry_ratio = 1;  /* Valid entries ratio.*/
   4384 
   4385     /* Input parameter check. */
   4386     if (NULL == fc) {
   4387         return (BCM_E_PARAM);
   4388     }
   4389 
   4390     /* Allocate field stage structure instance memory. */
   4391     stage_fc = sal_alloc(sizeof(_field_stage_t), "FP stage info.");
   4392     if (NULL == stage_fc) {
   4393         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4394             "FP(unit %d) Error: Allocation failure for stage info\n"), unit));
   4395         return (BCM_E_MEMORY);
   4396     }
   4397 
   4398     /* Clear contents of allocated buffer. */
   4399     sal_memset(stage_fc, 0, sizeof(_field_stage_t));
   4400 
   4401     /* Initialize FP stage. */
   4402     stage_fc->stage_id = stage_id;
   4403 
   4404     /* By default all CAP stages come up in Global mode (Legacy TD2). */
   4405     if (bcmFieldGroupOperModeCount == mode) {
   4406         if ((stage_id == _BCM_FIELD_STAGE_INGRESS) ||
   4407             (stage_id == _BCM_FIELD_STAGE_LOOKUP) ||
   4408             (stage_id == _BCM_FIELD_STAGE_EGRESS)) {
   4409            /* Initialize the SER during init for the given default mode. */
   4410            rv = (_field_ser_oper_mode_init(unit, stage_id,
   4411                                         bcmFieldGroupOperModeGlobal));
   4412            if (BCM_FAILURE(rv)) {
   4413                if (NULL != stage_fc) {
   4414                    sal_free(stage_fc);
   4415                }
   4416                return (rv);
   4417            }
   4418         }
   4419         stage_fc->oper_mode = bcmFieldGroupOperModeGlobal;
   4420     } else {
   4421         /* Default Group oper mode modified using Group oper mode API. */
   4422         stage_fc->oper_mode = mode;
   4423     }
   4424 
   4425     /*
   4426      * Initialize number of FP data structure instances to be supported
   4427      * per-stage.
   4428      */
   4429     stage_fc->num_pipes = NUM_PIPE(unit);
   4430 
   4431     if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) {
   4432         /*
   4433          * Initialize number of FP instances to number of pipes supported in
   4434          * hardware.
   4435          */
   4436         stage_fc->num_instances = stage_fc->num_pipes;
   4437     } else {
   4438         /* Initialize to legacy TD2 mode - Global mode (single instance). */
   4439         stage_fc->num_instances = 1;
   4440     }
   4441 
   4442     switch (stage_fc->stage_id) {
   4443         case _BCM_FIELD_STAGE_LOOKUP:
   4444             /* Flags */
   4445             stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE
   4446                                 | _FP_STAGE_AUTO_EXPANSION
   4447                                 | _FP_STAGE_GLOBAL_COUNTERS);
   4448             /* Slice geometry */
   4449             stage_fc->tcam_sz     = soc_mem_index_count(unit, VFP_TCAMm);
   4450             stage_fc->tcam_slices = 4;
   4451             break;
   4452 
   4453         case _BCM_FIELD_STAGE_INGRESS:
   4454             /* Flags */
   4455             stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE
   4456                                 | _FP_STAGE_AUTO_EXPANSION
   4457                                 | _FP_STAGE_GLOBAL_METER_POOLS
   4458                                 | _FP_STAGE_GLOBAL_COUNTERS
   4459                                 | _FP_STAGE_MULTI_PIPE_COUNTERS);
   4460 
   4461             /*
   4462              * Initialize Slice geometry.
   4463              *     Number of entries in TCAM remains the same for both duplicate
   4464              *     and unique views. Use duplicate view to calculate TCAM size.
   4465              *     Initialize to maximum entries supported per-slice (80bit
   4466              *     mode).
   4467              */
   4468             if (soc_feature(unit, soc_feature_field_stage_half_slice)) {
   4469                 entry_ratio = 2;
   4470             } else if (soc_feature(unit, soc_feature_field_stage_quarter_slice)) {
   4471                 entry_ratio = 4;
   4472             }
   4473             stage_fc->tcam_sz = soc_mem_index_count(unit, IFP_TCAMm) / entry_ratio;
   4474 
   4475             /* Number of hardware slices is equal to maximum number of LT parts. */
   4476             stage_fc->tcam_slices = _FP_MAX_LT_PARTS(unit);
   4477 
   4478             /* Initialize number of logical tables supported by device. */
   4479             if (SOC_IS_TOMAHAWK3(unit)) {
   4480                 stage_fc->num_logical_tables = 16;
   4481             } else {
   4482                 stage_fc->num_logical_tables = 32;
   4483             }
   4484 
   4485             /*
   4486              * Initialize number of valid entries in Logical Table selection
   4487              * TCAM.
   4488              */
   4489             stage_fc->lt_tcam_sz = stage_fc->tcam_slices
   4490                                     * stage_fc->num_logical_tables;
   4491             /* Initialize number of extractor levels */
   4492             stage_fc->num_ext_levels = 4;
   4493             /* Initialize the action set pointer. */
   4494             if (soc_feature(unit, soc_feature_ifp_action_profiling)) {
   4495                 stage_fc->action_set_ptr = SOC_IS_HELIX5(unit) \
   4496                                            ? bcm_field_hx5_ifp_action_set \
   4497                                            : bcm_field_td3_ifp_action_set;
   4498             }
   4499             break;
   4500 
   4501         case _BCM_FIELD_STAGE_EGRESS:
   4502             /* Flags */
   4503             stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE
   4504                                 | _FP_STAGE_GLOBAL_COUNTERS
   4505                                 | _FP_STAGE_SEPARATE_PACKET_BYTE_COUNTERS
   4506                                 | _FP_STAGE_AUTO_EXPANSION
   4507                                 | _FP_STAGE_MULTI_PIPE_COUNTERS);
   4508             /* Slice geometry */
   4509             stage_fc->tcam_sz = soc_mem_index_count(unit, EFP_TCAMm);
   4510             stage_fc->tcam_slices = 4;
   4511             break;
   4512         case _BCM_FIELD_STAGE_CLASS:
   4513             rv = _bcm_field_th_class_stage_add(unit, fc, stage_fc);
   4514             if (BCM_FAILURE(rv)) {
   4515                 sal_free(stage_fc);
   4516             }
   4517             return (rv);
   4518         case _BCM_FIELD_STAGE_EXACTMATCH:
   4519             stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE
   4520                                 | _FP_STAGE_GLOBAL_METER_POOLS
   4521                                 | _FP_STAGE_GLOBAL_COUNTERS
   4522                                 | _FP_STAGE_MULTI_PIPE_COUNTERS);
   4523             stage_fc->tcam_sz = soc_mem_index_count(unit, EXACT_MATCH_2m);
   4524             stage_fc->tcam_slices = 2;
   4525             if (SOC_IS_TOMAHAWK3(unit)) {
   4526                 stage_fc->num_logical_tables = 16;
   4527             } else {
   4528                 stage_fc->num_logical_tables = _FP_MAX_NUM_LT;
   4529             }
   4530             stage_fc->lt_tcam_sz = stage_fc->tcam_slices
   4531                 * stage_fc->num_logical_tables;
   4532             stage_fc->num_ext_levels = 4;
   4533             /* Initialize the action set pointer. */
   4534             if (soc_feature(unit, soc_feature_ifp_action_profiling)) {
   4535                 stage_fc->action_set_ptr = bcm_field_td3_em_action_set;
   4536             } else if (soc_feature(unit, soc_feature_th3_style_fp)) {
   4537                 stage_fc->action_set_ptr = bcm_field_th3_em_action_set;
   4538             } else if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) {
   4539                 stage_fc->action_set_ptr = bcm_field_th2_em_action_set;
   4540             } else {
   4541                 stage_fc->action_set_ptr = bcm_field_th_em_action_set;
   4542             }
   4543         break;
   4544 #if defined(BCM_FLOWTRACKER_SUPPORT)
   4545         case _BCM_FIELD_STAGE_FLOWTRACKER:
   4546             if (soc_feature(unit, soc_feature_field_flowtracker_support)) {
   4547                 stage_fc->flags |= (_FP_STAGE_SLICE_ENABLE);
   4548                 stage_fc->tcam_slices = 1;
   4549                 stage_fc->num_logical_tables = 1;
   4550                 stage_fc->tcam_sz =
   4551                     soc_mem_index_max(unit, BSK_FTFP_TCAMm) -
   4552                     soc_mem_index_min(unit, BSK_FTFP_TCAMm) + 1;
   4553                 stage_fc->lt_tcam_sz =
   4554                     soc_mem_index_max(unit, BSK_FTFP_LTS_LOGICAL_TBL_SEL_TCAMm) -
   4555                     soc_mem_index_min(unit, BSK_FTFP_LTS_LOGICAL_TBL_SEL_TCAMm) + 1;
   4556             }
   4557         break;
   4558 #endif
   4559         default:
   4560             if (NULL != stage_fc) {
   4561                 sal_free(stage_fc);
   4562             }
   4563             return (rv);
   4564     }
   4565 
   4566     /*
   4567      * Initialize Field Stage attributes. On error condition, memory location
   4568      * pointed by "stage_fc" pointer is freed inside this routine in error
   4569      * return section. So, no need to free again in the error return section.
   4570      * No need to do stage core init for stage class as it is a pseudo stage.
   4571      */
   4572     rv = _field_th_stage_core_init(unit, fc, stage_fc);
   4573     if (BCM_FAILURE(rv)) {
   4574         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4575             "FP(unit %d) Error: _field_th_stage_core_init=%d\n"), unit, rv));
   4576     }
   4577 
   4578     return (rv);
   4579 }
   4580 
   4581 /*
   4582  * Function:
   4583  *    _bcm_field_th_stages_delete
   4584  *
   4585  * Purpose:
   4586  *    Deinitialize a field stage.
   4587  *
   4588  * Parameters:
   4589  *    unit - (IN) BCM device number.
   4590  *    fc - (IN/OUT)Field control info for device.
   4591  *
   4592  * Returns:
   4593  *    BCM_E_PARAM - Null field control structure.
   4594  *    BCM_E_NONE - Success.
   4595  */
   4596 int
   4597 _bcm_field_th_stages_delete(int unit, _field_control_t *fc)
   4598 {
   4599     int rv = BCM_E_NONE;
   4600     _field_stage_t *stage_fc      = NULL; /* Stage field control structure. */
   4601     _field_stage_t *stage_fc_next = NULL; /* Stage field control structure. */
   4602 
   4603     /* Input parameters check. */
   4604     if (NULL == fc) {
   4605         return (BCM_E_PARAM);
   4606     }
   4607 
   4608     FP_LOCK(unit);
   4609 
   4610     stage_fc = fc->stages;
   4611     /* Free stages slices structures. */
   4612     while (NULL != stage_fc) {
   4613         stage_fc_next = stage_fc->next;
   4614         /*
   4615          * Retaining retaining ExactMatch stage during bcm_field_init.
   4616          */
   4617         if ((fc->flags & _FP_EXACTMATCH_STAGE_SKIP_DETACH) &&
   4618             (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)) {
   4619             stage_fc = stage_fc_next;
   4620             continue;
   4621         }
   4622         _field_th_stage_delete(unit, fc, stage_fc);
   4623         stage_fc = stage_fc_next;
   4624     }
   4625 
   4626 #if defined(BCM_TRIDENT3_SUPPORT)
   4627     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   4628        rv = (_bcm_field_td3_flex_qual_ceh_db_clear(unit));
   4629     }
   4630 #endif /* BCM_TRIDENT3_SUPPORT */
   4631 
   4632     FP_UNLOCK(unit);
   4633     return (rv);
   4634 }
   4635 
   4636 /*
   4637  * Function:
   4638  *    _bcm_field_th_stages_add
   4639  *
   4640  * Purpose:
   4641  *    Initialize all Field Processor stages of the device.
   4642  *
   4643  * Parameters:
   4644  *    unit - (IN) BCM device number
   4645  *    fc - (IN/OUT) Field control structure.
   4646  *
   4647  * Returns:
   4648  *    BCM_E_PARAM - Null field control structure.
   4649  *    BCM_E_NONE - Success.
   4650  */
   4651 int
   4652 _bcm_field_th_stages_add(int unit, _field_control_t *fc)
   4653 {
   4654     int rv; /* Operation return value. */
   4655 
   4656     /* Input parameters check. */
   4657     if (NULL == fc) {
   4658         return (BCM_E_PARAM);
   4659     }
   4660 
   4661 #if defined(BCM_TRIDENT3_SUPPORT)
   4662     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   4663         BCM_IF_ERROR_RETURN(_bcm_field_td3_flex_qual_ceh_db_init(unit));
   4664     }
   4665 #endif /* BCM_TRIDENT3_SUPPORT */
   4666 
   4667     /* Initialize CAP stages. */
   4668     if (soc_feature(unit, soc_feature_field_multi_stage)) {
   4669         int latency;
   4670 
   4671         /* Add VFP Stage. */
   4672         rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_LOOKUP,
   4673                 bcmFieldGroupOperModeCount);
   4674         if (BCM_FAILURE(rv)) {
   4675             LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4676             "FP(unit %d) Error: _field_th_stage_add(Lookup)=%d\n"), unit, rv));
   4677             _bcm_field_th_stages_delete(unit, fc);
   4678             return (rv);
   4679         }
   4680 
   4681         /* Add EFP Stage. */
   4682         latency = soc_property_get(unit, spn_SWITCH_BYPASS_MODE,
   4683                                    SOC_SWITCH_BYPASS_MODE_NONE);
   4684         if (SOC_SWITCH_BYPASS_MODE_EFP != latency) {
   4685             rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_EGRESS,
   4686                                         bcmFieldGroupOperModeCount);
   4687             if (BCM_FAILURE(rv)) {
   4688                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4689                                 "FP(unit %d) Error: _field_th_stage_add(Egress)=%d\n"), unit, rv));
   4690                 _bcm_field_th_stages_delete(unit, fc);
   4691                 return (rv);
   4692             }
   4693         }
   4694     }
   4695 
   4696     /* Add IFP Stage. */
   4697     rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_INGRESS,
   4698                                     bcmFieldGroupOperModeCount);
   4699     if (BCM_FAILURE(rv)) {
   4700         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4701             "FP(unit %d) Error: _field_th_stage_add(Ingress)=%d\n"), unit, rv));
   4702         /*
   4703          * Delete all previous stages initialized on this device in case of
   4704          * error.
   4705          */
   4706         _bcm_field_th_stages_delete(unit, fc);
   4707         return (rv);
   4708     }
   4709 
   4710     /* Add Class Stage. */
   4711     if (soc_feature(unit, soc_feature_field_compression)) {
   4712         rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_CLASS,
   4713                 bcmFieldGroupOperModeCount);
   4714         if (BCM_FAILURE(rv)) {
   4715             LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4716                             "FP(unit %d) Error: "
   4717                             "_field_th_stage_add(Class)=%d\n"), unit, rv));
   4718             /*
   4719              * Delete all previous stages initialized on this device in case of
   4720              * error.
   4721              */
   4722             _bcm_field_th_stages_delete(unit, fc);
   4723             return (rv);
   4724         }
   4725     }
   4726 
   4727     /*
   4728      * _field_detach doesn't clear Exact Match groups created by Flow Tracker.
   4729      * As ExactMatch stage is not freed no need to initialize it again.
   4730      */
   4731     if (0 == (fc->flags & _FP_EXACTMATCH_STAGE_SKIP_DETACH)) {
   4732         if (soc_feature(unit, soc_feature_field_exact_match_support)) {
   4733             /* Add Exact Match Stage */
   4734             rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_EXACTMATCH,
   4735                                      bcmFieldGroupOperModeCount);
   4736             if (BCM_FAILURE(rv)) {
   4737                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4738                                 "FP(unit %d) Error: "
   4739                                 "_field_th_stage_add(Exact Match)=%d\n"), unit, rv));
   4740                 _bcm_field_th_stages_delete(unit, fc);
   4741                 return (rv);
   4742             }
   4743         }
   4744     } else {
   4745         _field_stage_t *stage_ing = NULL;
   4746 
   4747         /* Get IFP stage structure */
   4748         for (stage_ing = fc->stages;
   4749             (NULL != stage_ing) && (_BCM_FIELD_STAGE_INGRESS != stage_ing->stage_id);
   4750             stage_ing = stage_ing->next);
   4751 
   4752         if ((NULL != stage_ing) && soc_feature(unit, soc_feature_field_exact_match_support)) {
   4753             /*
   4754              * ExactMatch Ibus database points to the Ibus database of IFP.
   4755              * Update ExactMacth Ibus database as IFP has been reinitialized
   4756              */
   4757             rv = _field_th_emstage_update(unit, stage_ing);
   4758             if (BCM_FAILURE(rv)) {
   4759                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4760                                 "FP(unit %d) Error: "
   4761                                 "_field_th_stage_add(Exact Match)=%d\n"), unit, rv));
   4762                 _bcm_field_th_stages_delete(unit, fc);
   4763                 return (rv);
   4764             }
   4765         }
   4766     }
   4767 
   4768 #if defined(BCM_FLOWTRACKER_SUPPORT)
   4769     if (soc_feature(unit, soc_feature_field_flowtracker_support)) {
   4770         rv = _field_th_stage_add(unit, fc, _BCM_FIELD_STAGE_FLOWTRACKER,
   4771                 bcmFieldGroupOperModeCount);
   4772         if (BCM_FAILURE(rv)) {
   4773             LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
   4774                             "FP(unit %d) Error: "
   4775                             "_field_th_stage_add(Flowtracker)=%d\n"), unit, rv));
   4776             _bcm_field_th_stages_delete(unit, fc);
   4777             return (rv);
   4778         }
   4779     }
   4780 #endif
   4781 
   4782     /* Initialize field control color independent flag by default. */
   4783     fc->flags |= _FP_COLOR_INDEPENDENT;
   4784 
   4785     /* Initialize device LT entry allocation ID variable. */
   4786     fc->last_allocated_lt_eid = 0;
   4787 
   4788 #if defined(BCM_TRIDENT3_SUPPORT)
   4789     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   4790        rv = (_bcm_field_td3_flex_qual_ceh_db_clear(unit));
   4791     }
   4792 #endif /* BCM_TRIDENT3_SUPPORT */
   4793 
   4794     return (rv);
   4795 }
   4796 
   4797 /*
   4798  * Function:
   4799  *     _bcm_field_action_insert
   4800  * Purpose:
   4801  *     Add action to stage actions list.
   4802  * Parameters:
   4803  *     unit     - (IN) BCM device number.
   4804  *     stage_fc - (IN) Stage field control strucutre.
   4805  *     action   - (IN) Field Action.
   4806  *     ptr      - (IN) FP action info.
   4807  * Returns:
   4808  *     BCM_E_XXX
   4809  */
   4810 int
   4811 _bcm_field_action_insert(int unit, _field_stage_t *stage_fc,
   4812                          int action, _bcm_field_action_offset_t *ptr)
   4813 {
   4814     int flag_first;                                /* action allocation flag. */
   4815     int alloc_size;                                /* Memory allocation size. */
   4816     uint32 i = 0;
   4817     _bcm_field_action_conf_t *f_action;            /* Action configuration.   */
   4818     _bcm_field_action_offset_t *offset_info;       /* Offset Information.     */
   4819     _bcm_field_action_offset_t *new_offset_info;   /* New Offset Information. */
   4820 
   4821     /* Input parameters check. */
   4822     if ((NULL == ptr) || (NULL == stage_fc) ||
   4823         (action < 0) || (action > _bcmFieldActionCount)) {
   4824         return BCM_E_PARAM;
   4825     }
   4826 
   4827     if ((_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) &&
   4828         (ptr->flags & _BCM_FIELD_ACTION_NO_IFP_SUPPORT)) {
   4829         return BCM_E_NONE;
   4830     }
   4831     if ((_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id) &&
   4832         (ptr->flags & _BCM_FIELD_ACTION_NO_EM_SUPPORT)) {
   4833          return BCM_E_NONE;
   4834     }
   4835 
   4836     f_action = NULL;
   4837     offset_info = NULL;
   4838     new_offset_info = NULL;
   4839 
   4840     f_action = stage_fc->f_action_arr[action];
   4841     /* Allocate Action descriptor. */
   4842     flag_first = 0;
   4843     if (NULL == f_action) {
   4844         alloc_size = sizeof(_bcm_field_action_conf_t);
   4845         _FP_XGS3_ALLOC(f_action, alloc_size, "FP Action info");
   4846         if (NULL == f_action) {
   4847             return (BCM_E_MEMORY);
   4848         }
   4849         f_action->action = action;
   4850         flag_first = 1;
   4851     } else {
   4852         offset_info = f_action->offset;
   4853         while (NULL != offset_info) {
   4854             if (offset_info->flags & ptr->flags) {
   4855                 return BCM_E_EXISTS;
   4856             }
   4857             offset_info = offset_info->next;
   4858         }
   4859     }
   4860 
   4861     alloc_size = sizeof(_bcm_field_action_offset_t);
   4862     _FP_XGS3_ALLOC(new_offset_info, alloc_size, "FP Action offset info");
   4863     if (NULL == new_offset_info) {
   4864         if (flag_first) {
   4865             if (NULL != f_action) {
   4866                 sal_free(f_action);
   4867             }
   4868         }
   4869         return (BCM_E_MEMORY);
   4870     }
   4871 
   4872     /* Copy new configuration to configuration array. */
   4873     new_offset_info->flags  |= ptr->flags;
   4874     new_offset_info->offset[0] = ptr->offset[0];
   4875     new_offset_info->width[0]  = ptr->width[0];
   4876     new_offset_info->value[0]  = ptr->value[0];
   4877     new_offset_info->offset[1] = ptr->offset[1];
   4878     new_offset_info->width[1]  = ptr->width[1];
   4879     new_offset_info->value[1]  = ptr->value[1];
   4880     new_offset_info->offset[2] = ptr->offset[2];
   4881     new_offset_info->width[2]  = ptr->width[2];
   4882     new_offset_info->value[2]  = ptr->value[2];
   4883     new_offset_info->offset[3] = ptr->offset[3];
   4884     new_offset_info->width[3]  = ptr->width[3];
   4885     new_offset_info->value[3]  = ptr->value[3];
   4886     /* Update the bitmap of offsets which hold encodings */
   4887     for (i = 0; (i < _FP_ACTION_MAX_PARAM_ENC) && (ptr->width[i]); i++) {
   4888         if (-1 != ptr->value[i]) {
   4889             SHR_BITSET(&new_offset_info->encode_bmp, i);
   4890         } else {
   4891             SHR_BITSET(&new_offset_info->param_bmp, i);
   4892         }
   4893     }
   4894     new_offset_info->aset      = ptr->aset;
   4895     new_offset_info->next    = f_action->offset;
   4896     f_action->offset = new_offset_info;
   4897 
   4898     /* Install Action configuration into stage actions array. */
   4899     stage_fc->f_action_arr[action] = f_action;
   4900 
   4901     return (BCM_E_NONE);
   4902 }
   4903 /*
   4904  * Function:
   4905  *     _bcm_field_th_action_conflict_check
   4906  * Purpose:
   4907  *     Check if action is conflicted with any other action in the entry.
   4908  * Parameters:
   4909  *     unit     - (IN) BCM device number.
   4910  *     f_ent    - (IN) Field entry structure to get policy info from.
   4911  *     action1  - (IN) Action to check(bcmFieldActionXXX)
   4912  *     action   - (IN) Action to check(bcmFieldActionXXX)
   4913  * Returns:
   4914  *     BCM_E_XXX
   4915  */
   4916 int
   4917 _bcm_field_th_action_conflict_check(int                unit,
   4918                                     _field_entry_t     *f_ent,
   4919                                     bcm_field_action_t action1,
   4920                                     bcm_field_action_t action)
   4921 {
   4922     /* Input parameters check */
   4923     if (NULL == f_ent) {
   4924         return (BCM_E_PARAM);
   4925     }
   4926     if (NULL == f_ent->group) {
   4927         return (BCM_E_PARAM);
   4928     }
   4929 
   4930     if (f_ent->group->stage_id == _BCM_FIELD_STAGE_INGRESS ||
   4931         f_ent->group->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
   4932         switch (action1) {
   4933             case bcmFieldActionUntaggedPacketPriorityNew:
   4934                 _FP_ACTIONS_CONFLICT(bcmFieldActionPfcClassNew);
   4935                 break;
   4936             case bcmFieldActionPfcClassNew:
   4937                 _FP_ACTIONS_CONFLICT(bcmFieldActionUntaggedPacketPriorityNew);
   4938                 break;
   4939             case bcmFieldActionCosMapNew:
   4940                 _FP_ACTIONS_CONFLICT(bcmFieldActionCosQNew);
   4941                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpCosQNew);
   4942                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpCosQNew);
   4943                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpCosQNew);
   4944                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCopy);
   4945                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntCopy);
   4946                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntCopy);
   4947                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntCopy);
   4948                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntNew);
   4949                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntNew);
   4950                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntNew);
   4951                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntNew);
   4952                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntTos);
   4953                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntTos);
   4954                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntTos);
   4955                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntTos);
   4956                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCancel);
   4957                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntCancel);
   4958                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntCancel);
   4959                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntCancel);
   4960                 _FP_ACTIONS_CONFLICT(bcmFieldActionUcastCosQNew);
   4961                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpUcastCosQNew);
   4962                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpUcastCosQNew);
   4963                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpUcastCosQNew);
   4964                 _FP_ACTIONS_CONFLICT(bcmFieldActionMcastCosQNew);
   4965                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpMcastCosQNew);
   4966                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpMcastCosQNew);
   4967                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpMcastCosQNew);
   4968                 _FP_ACTIONS_CONFLICT(bcmFieldActionCosMapNew);
   4969                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpCosMapNew);
   4970                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpCosMapNew);
   4971                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpCosMapNew);
   4972                 break;
   4973             case bcmFieldActionGpCosMapNew:
   4974                 _FP_ACTIONS_CONFLICT(bcmFieldActionCosQNew);
   4975                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpCosQNew);
   4976                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCopy);
   4977                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntCopy);
   4978                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntNew);
   4979                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntNew);
   4980                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntTos);
   4981                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntTos);
   4982                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCancel);
   4983                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpPrioIntCancel);
   4984                 _FP_ACTIONS_CONFLICT(bcmFieldActionUcastCosQNew);
   4985                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpUcastCosQNew);
   4986                 _FP_ACTIONS_CONFLICT(bcmFieldActionMcastCosQNew);
   4987                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpMcastCosQNew);
   4988                 _FP_ACTIONS_CONFLICT(bcmFieldActionCosMapNew);
   4989                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpCosMapNew);
   4990                 break;
   4991             case bcmFieldActionYpCosMapNew:
   4992                 _FP_ACTIONS_CONFLICT(bcmFieldActionCosQNew);
   4993                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpCosQNew);
   4994                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCopy);
   4995                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntCopy);
   4996                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntNew);
   4997                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntNew);
   4998                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntTos);
   4999                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntTos);
   5000                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCancel);
   5001                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpPrioIntCancel);
   5002                 _FP_ACTIONS_CONFLICT(bcmFieldActionUcastCosQNew);
   5003                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpUcastCosQNew);
   5004                 _FP_ACTIONS_CONFLICT(bcmFieldActionMcastCosQNew);
   5005                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpMcastCosQNew);
   5006                 _FP_ACTIONS_CONFLICT(bcmFieldActionCosMapNew);
   5007                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpCosMapNew);
   5008                 break;
   5009             case bcmFieldActionRpCosMapNew:
   5010                 _FP_ACTIONS_CONFLICT(bcmFieldActionCosQNew);
   5011                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpCosQNew);
   5012                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCopy);
   5013                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntCopy);
   5014                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntNew);
   5015                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntNew);
   5016                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntTos);
   5017                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntTos);
   5018                 _FP_ACTIONS_CONFLICT(bcmFieldActionPrioIntCancel);
   5019                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpPrioIntCancel);
   5020                 _FP_ACTIONS_CONFLICT(bcmFieldActionUcastCosQNew);
   5021                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpUcastCosQNew);
   5022                 _FP_ACTIONS_CONFLICT(bcmFieldActionMcastCosQNew);
   5023                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpMcastCosQNew);
   5024                 _FP_ACTIONS_CONFLICT(bcmFieldActionCosMapNew);
   5025                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpCosMapNew);
   5026                 break;
   5027             case bcmFieldActionGpIntCongestionNotificationNew:
   5028                 _FP_ACTIONS_CONFLICT(bcmFieldActionGpIntCongestionNotificationNew);
   5029                 break;
   5030             case bcmFieldActionYpIntCongestionNotificationNew:
   5031                 _FP_ACTIONS_CONFLICT(bcmFieldActionYpIntCongestionNotificationNew);
   5032                 break;
   5033             case bcmFieldActionRpIntCongestionNotificationNew:
   5034                 _FP_ACTIONS_CONFLICT(bcmFieldActionRpIntCongestionNotificationNew);
   5035                 break;
   5036             case bcmFieldActionFabricEHAddOrUpdate:
   5037             case bcmFieldActionRedirect:
   5038             case bcmFieldActionRedirectTrunk:
   5039             case bcmFieldActionRedirectPbmp:
   5040             case bcmFieldActionRedirectVlan:
   5041             case bcmFieldActionUnmodifiedPacketRedirectPort:
   5042             case bcmFieldActionRedirectCancel:
   5043             case bcmFieldActionRedirectBcastPbmp:
   5044             case bcmFieldActionRedirectMcast:
   5045             case bcmFieldActionEgressMask:
   5046             case bcmFieldActionEgressPortsAdd:
   5047                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirect);
   5048                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectTrunk);
   5049                 _FP_ACTIONS_CONFLICT(bcmFieldActionUnmodifiedPacketRedirectPort);
   5050                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5051                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectCancel);
   5052                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectVlan);
   5053                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectBcastPbmp);
   5054                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectMcast);
   5055                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5056                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressMask);
   5057                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressPortsAdd);
   5058                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricEHAddOrUpdate);
   5059                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5060                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectPbmp);
   5061                 break;
   5062             case bcmFieldActionRedirectIpmc:
   5063             case bcmFieldActionRedirectEgrNextHop:
   5064                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirect);
   5065                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectTrunk);
   5066                 _FP_ACTIONS_CONFLICT(bcmFieldActionUnmodifiedPacketRedirectPort);
   5067                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5068                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectCancel);
   5069                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectVlan);
   5070                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectBcastPbmp);
   5071                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectMcast);
   5072                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5073                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressMask);
   5074                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressPortsAdd);
   5075                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricEHAddOrUpdate);
   5076                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5077                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5078                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5079                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5080                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5081                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5082                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5083                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5084                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5085                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5086                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3ChangeVlan);
   5087                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3ChangeVlanCancel);
   5088                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3ChangeMacDa);
   5089                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3ChangeMacDaCancel);
   5090                 if (action1 != bcmFieldActionRedirectIpmc) {
   5091                     _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5092                 }
   5093                 break;
   5094             case bcmFieldActionChangeL2Fields:
   5095             case bcmFieldActionChangeL2FieldsCancel:
   5096             case bcmFieldActionFabricQueue:
   5097             case bcmFieldActionBFDSessionIdNew:
   5098                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5099                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5100                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5101                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5102                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5103                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5104                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5105                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5106                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5107                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5108                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5109                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5110                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5111                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5112                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5113                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5114                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5115                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5116                 if (action1 != bcmFieldActionFabricQueue) {
   5117                     _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5118                 }
   5119                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5120                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5121                 }
   5122                 break;
   5123             case bcmFieldActionAddClassTag:
   5124                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5125                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5126                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5127                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5128                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5129                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5130                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5131                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5132                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5133                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5134                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5135                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5136                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5137                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5138                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5139                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5140                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5141                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5142                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5143                 }
   5144                 break;
   5145             case bcmFieldActionL3SwitchCancel:
   5146                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5147                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5148                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5149                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5150                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5151                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5152                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5153                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5154                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5155                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5156                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5157                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5158                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5159                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5160                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5161                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5162                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5163                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5164                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5165                 }
   5166                 break;
   5167             case bcmFieldActionNewClassId:
   5168                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5169                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5170                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5171                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5172                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5173                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5174                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5175                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5176                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5177                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5178                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5179                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5180                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5181                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5182                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5183                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5184                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5185                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5186                 }
   5187                 break;
   5188             case bcmFieldActionEgressClassSelect:
   5189                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5190                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5191                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5192                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5193                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5194                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5195                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5196                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5197                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5198                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5199                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5200                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5201                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5202                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5203                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5204                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5205                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5206                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5207                 }
   5208                 break;
   5209             case bcmFieldActionL3Switch:
   5210                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5211                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5212                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5213                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5214                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5215                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5216                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5217                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5218                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5219                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5220                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5221                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5222                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5223                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5224                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5225                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5226                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5227                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5228                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectPbmp);
   5229                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5230                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5231                 }
   5232                 break;
   5233             case bcmFieldActionMultipathHash:
   5234                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5235                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5236                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5237                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5238                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5239                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5240                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5241                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5242                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5243                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5244                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5245                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5246                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5247                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5248                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5249                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5250                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5251                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5252                 }
   5253                 break;
   5254             case bcmFieldActionDstMacNew:
   5255                 _FP_ACTIONS_CONFLICT(bcmFieldActionDstMacNew);
   5256                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5257                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5258                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5259                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5260                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5261                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5262                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5263                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5264                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5265                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5266                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5267                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5268                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5269                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5270                 }
   5271                 break;
   5272             case bcmFieldActionSrcMacNew:
   5273                 _FP_ACTIONS_CONFLICT(bcmFieldActionSrcMacNew);
   5274                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5275                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5276                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5277                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5278                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5279                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5280                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5281                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5282                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5283                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5284                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5285                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5286                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5287                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5288                 }
   5289                 break;
   5290             case bcmFieldActionOuterVlanNew:
   5291                 _FP_ACTIONS_CONFLICT(bcmFieldActionOuterVlanNew);
   5292                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5293                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5294                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5295                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5296                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5297                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5298                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5299                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5300                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5301                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5302                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5303                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5304                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5305                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5306                 }
   5307                 break;
   5308             case bcmFieldActionVnTagNew:
   5309             case bcmFieldActionVnTagDelete:
   5310                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagNew);
   5311                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5312                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5313                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5314                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5315                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5316                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5317                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5318                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5319                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5320                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5321                 _FP_ACTIONS_CONFLICT(bcmFieldActionVnTagDelete);
   5322                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5323                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5324                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5325                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5326                 }
   5327                 break;
   5328             case bcmFieldActionEtagNew:
   5329             case bcmFieldActionEtagDelete:
   5330                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5331                 _FP_ACTIONS_CONFLICT(bcmFieldActionEtagDelete);
   5332                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5333                 _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5334                 _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5335                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5336                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5337                 _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5338                 _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5339                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5340                 _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5341                 _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5342                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectEgrNextHop);
   5343                 _FP_ACTIONS_CONFLICT(bcmFieldActionRedirectIpmc);
   5344                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5345                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5346                 }
   5347                 break;
   5348             case bcmFieldActionMirrorEgress:
   5349                 if (SOC_INFO(unit).th_ctc_replace_enabled) {
   5350                    _FP_ACTIONS_CONFLICT(bcmFieldActionEtagNew);
   5351                    _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2Fields);
   5352                    _FP_ACTIONS_CONFLICT(bcmFieldActionChangeL2FieldsCancel);
   5353                    _FP_ACTIONS_CONFLICT(bcmFieldActionFabricQueue);
   5354                    _FP_ACTIONS_CONFLICT(bcmFieldActionAddClassTag);
   5355                    _FP_ACTIONS_CONFLICT(bcmFieldActionL3Switch);
   5356                    _FP_ACTIONS_CONFLICT(bcmFieldActionMultipathHash);
   5357                    _FP_ACTIONS_CONFLICT(bcmFieldActionL3SwitchCancel);
   5358                    _FP_ACTIONS_CONFLICT(bcmFieldActionEgressClassSelect);
   5359                    _FP_ACTIONS_CONFLICT(bcmFieldActionNewClassId);
   5360                    _FP_ACTIONS_CONFLICT(bcmFieldActionBFDSessionIdNew);
   5361                    _FP_ACTIONS_CONFLICT(bcmFieldActionMirrorEgress);
   5362                 }
   5363                 break;
   5364 #ifdef	INCLUDE_L3
   5365             case bcmFieldActionDynamicEcmpEnable:
   5366             case bcmFieldActionDynamicEcmpCancel:
   5367                 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicEcmpEnable);
   5368                 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicEcmpCancel);
   5369                 break;
   5370 #endif /*INCLUDE_L3*/
   5371             case bcmFieldActionDynamicTrunkEnable:
   5372             case bcmFieldActionDynamicTrunkCancel:
   5373             case bcmFieldActionDynamicHgTrunkEnable:
   5374             case bcmFieldActionDynamicHgTrunkCancel:
   5375                 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicTrunkEnable);
   5376                 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicTrunkCancel);
   5377                 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicHgTrunkEnable);
   5378                 _FP_ACTIONS_CONFLICT(bcmFieldActionDynamicHgTrunkCancel);
   5379                 break;
   5380             case bcmFieldActionEgressTimeStampInsert:
   5381             case bcmFieldActionEgressTimeStampInsertCancel:
   5382                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressTimeStampInsert);
   5383                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressTimeStampInsertCancel);
   5384                 break;
   5385             case bcmFieldActionIngressTimeStampInsert:
   5386             case bcmFieldActionIngressTimeStampInsertCancel:
   5387                 _FP_ACTIONS_CONFLICT(bcmFieldActionIngressTimeStampInsert);
   5388                 _FP_ACTIONS_CONFLICT(bcmFieldActionIngressTimeStampInsertCancel);
   5389                 break;
   5390             case bcmFieldActionIntTurnAround:
   5391                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignEditCtrlId);
   5392                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressFlowEncapEnable);
   5393                 break;
   5394 
   5395             case bcmFieldActionIntEncapEnable:
   5396             case bcmFieldActionNshEncapEnable:
   5397                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignEditCtrlId);
   5398                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressFlowEncapEnable);
   5399                 /* Intentional fall through for Conflict check */
   5400                 /* Fall through */
   5401             case bcmFieldActionIntEncapDisable:
   5402             case bcmFieldActionIntEncapUpdate:
   5403             case bcmFieldActionAddIngOuterVlanToEgrOuterVlan:
   5404             case bcmFieldActionErspan3HdrVlanCosPktCopy:
   5405             case bcmFieldActionGbpClassifierAdd:
   5406             case bcmFieldActionGbpSrcMacMcastBitSet:
   5407             case bcmFieldActionAssignExtractionCtrlId:
   5408             case bcmFieldActionEgressFlowControlEnable:
   5409                 _FP_ACTIONS_CONFLICT(bcmFieldActionIntEncapEnable);
   5410                 _FP_ACTIONS_CONFLICT(bcmFieldActionNshEncapEnable);
   5411                 _FP_ACTIONS_CONFLICT(bcmFieldActionIntEncapDisable);
   5412                 _FP_ACTIONS_CONFLICT(bcmFieldActionIntEncapUpdate);
   5413                 _FP_ACTIONS_CONFLICT(bcmFieldActionAddIngOuterVlanToEgrOuterVlan);
   5414                 _FP_ACTIONS_CONFLICT(bcmFieldActionErspan3HdrVlanCosPktCopy);
   5415                 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpClassifierAdd);
   5416                 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpSrcMacMcastBitSet);
   5417                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignExtractionCtrlId);
   5418                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressFlowControlEnable);
   5419                 break;
   5420             case bcmFieldActionHiGigTrunkResilientHashEnable:
   5421             case bcmFieldActionHiGigTrunkResilientHashDisable:
   5422                 _FP_ACTIONS_CONFLICT(bcmFieldActionHiGigTrunkResilientHashEnable);
   5423                 _FP_ACTIONS_CONFLICT(bcmFieldActionHiGigTrunkResilientHashDisable);
   5424                 break;
   5425             case bcmFieldActionTrunkResilientHashEnable:
   5426             case bcmFieldActionTrunkResilientHashDisable:
   5427                 _FP_ACTIONS_CONFLICT(bcmFieldActionTrunkResilientHashEnable);
   5428                 _FP_ACTIONS_CONFLICT(bcmFieldActionTrunkResilientHashDisable);
   5429                 break;
   5430             case bcmFieldActionEcmpResilientHashEnable:
   5431             case bcmFieldActionEcmpResilientHashDisable:
   5432                 _FP_ACTIONS_CONFLICT(bcmFieldActionEcmpResilientHashEnable);
   5433                 _FP_ACTIONS_CONFLICT(bcmFieldActionEcmpResilientHashDisable);
   5434                 break;
   5435             case bcmFieldActionElephantLookupEnable:
   5436             case bcmFieldActionElephantLookupDisable:
   5437                 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantLookupEnable);
   5438                 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantLookupDisable);
   5439                 break;
   5440             case bcmFieldActionElephantQueueEnable:
   5441             case bcmFieldActionElephantQueueDisable:
   5442                 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantQueueEnable);
   5443                 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantQueueDisable);
   5444                 break;
   5445             case bcmFieldActionElephantColorEnable:
   5446             case bcmFieldActionElephantColorDisable:
   5447                 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantColorEnable);
   5448                 _FP_ACTIONS_CONFLICT(bcmFieldActionElephantColorDisable);
   5449                 break;
   5450             case bcmFieldActionNshServiceIndex:
   5451                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject2);
   5452                 break;
   5453             case bcmFieldActionNshServicePathId:
   5454                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject2);
   5455                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject1);
   5456                 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpSrcIdNew);
   5457                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignNatClassId);
   5458                 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpDstIdNew);
   5459                 break;
   5460             case bcmFieldActionAssignOpaqueObject1:
   5461             case bcmFieldActionGbpSrcIdNew:
   5462             case bcmFieldActionAssignNatClassId:
   5463                 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpSrcIdNew);
   5464                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignNatClassId);
   5465                 _FP_ACTIONS_CONFLICT(bcmFieldActionNshServicePathId);
   5466                 break;
   5467             case bcmFieldActionAssignOpaqueObject2:
   5468             case bcmFieldActionGbpDstIdNew:
   5469                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject2);
   5470                 _FP_ACTIONS_CONFLICT(bcmFieldActionNshServicePathId);
   5471                 _FP_ACTIONS_CONFLICT(bcmFieldActionNshServiceIndex);
   5472                 _FP_ACTIONS_CONFLICT(bcmFieldActionGbpDstIdNew);
   5473                 break;
   5474             case bcmFieldActionAssignOpaqueObject3:
   5475             case bcmFieldActionLoopbackSubtype:
   5476             case bcmFieldActionAssignChangeL2FieldsClassId:
   5477                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject3);
   5478                 _FP_ACTIONS_CONFLICT(bcmFieldActionLoopbackSubtype);
   5479                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignChangeL2FieldsClassId);
   5480                 break;
   5481             case bcmFieldActionAssignOpaqueObject4:
   5482                 _FP_ACTIONS_CONFLICT(bcmFieldActionAssignOpaqueObject4);
   5483                 break;
   5484             case bcmFieldActionAssignEditCtrlId:
   5485                 _FP_ACTIONS_CONFLICT(bcmFieldActionNshEncapEnable);
   5486                 _FP_ACTIONS_CONFLICT(bcmFieldActionIntEncapEnable);
   5487                 _FP_ACTIONS_CONFLICT(bcmFieldActionIntTurnAround);
   5488                 _FP_ACTIONS_CONFLICT(bcmFieldActionEgressFlowEncapEnable);
   5489                 break;
   5490             default:
   5491                 return  _bcm_field_td2_action_conflict_check(unit,
   5492                                                              f_ent,
   5493                                                              action1,
   5494                                                              action);
   5495                 break;
   5496         }
   5497 #if defined(BCM_FLOWTRACKER_SUPPORT)
   5498     } else if (f_ent->group->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) {
   5499         switch(action1) {
   5500             case bcmFieldActionFlowtrackerGroupId:
   5501                 _FP_ACTIONS_CONFLICT(bcmFieldActionFlowtrackerGroupId);
   5502                 break;
   5503             case bcmFieldActionFlowtrackerEnable:
   5504                 _FP_ACTIONS_CONFLICT(bcmFieldActionFlowtrackerEnable);
   5505                 break;
   5506             case bcmFieldActionFlowtrackerNewLearnEnable:
   5507                 _FP_ACTIONS_CONFLICT(bcmFieldActionFlowtrackerNewLearnEnable);
   5508                 break;
   5509             default:
   5510                 break;
   5511         }
   5512 #endif
   5513     } else {
   5514         switch (action1) {
   5515             case bcmFieldActionLatencyMonitorEnable:
   5516             case bcmFieldActionLatencyMonitorDisable:
   5517                 _FP_ACTIONS_CONFLICT(bcmFieldActionLatencyMonitorEnable);
   5518                 _FP_ACTIONS_CONFLICT(bcmFieldActionLatencyMonitorDisable);
   5519                 return BCM_E_NONE;
   5520             default:
   5521                 break;
   5522         }
   5523         return  _bcm_field_td2_action_conflict_check(unit,
   5524                                                      f_ent,
   5525                                                      action1,
   5526                                                      action);
   5527     }
   5528 
   5529 
   5530     return (BCM_E_NONE);
   5531 
   5532 }
   5533 /*
   5534  * Function:
   5535  *     _field_th_common_actions_init
   5536  * Purpose:
   5537  *     Initialize device stage lookup qaualifiers
   5538  *     select codes & offsets
   5539  * Parameters:
   5540  *     unit       - (IN) BCM device number.
   5541  *     stage_fc   - (IN) Field Processor stage control structure.
   5542  * Returns:
   5543  *     BCM_E_NONE
   5544  */
   5545 int
   5546 _field_th_common_actions_init(int unit, _field_stage_t *stage_fc)
   5547 {
   5548     _FP_ACTION_DECL
   5549     uint32 offset = 0;                  /* General variable to carry offset. */
   5550     uint32 profile_one_offset = 0;      /* Offset of PROFILE_ONE_SET. */
   5551     uint32 profile_two_offset = 0;      /* Offset of PROFILE_TWO_SET. */
   5552     uint32 redirect_offset = 0;         /* Offset of REDIRECT_SET. */
   5553     uint32 l3swl2change_offset = 0;     /* Offset of L3SW_CHANGE_L2_SET. */
   5554     uint32 nat_offset = 0;              /* Offset of NAT_SET. */
   5555     uint32 mirror_offset = 0;           /* Offset of MIRROR_SET. */
   5556     uint32 lb_offset = 0;               /* Offset of LB_CONTROL_SET. */
   5557     uint32 nat_override_offset = 0;     /* Offset of NAT_OVERRIDE_SET. */
   5558     uint32 copytocpu_offset = 0;        /* Offset of COPY_TO_CPU_SET. */
   5559     uint32 cutthrough_offset = 0;       /* Offset of CUT_THRU_OVERRIDE_SET. */
   5560     uint32 urpf_offset = 0;             /* Offset of URPF_OVERRIDE_SET. */
   5561     uint32 ttl_offset = 0;              /* Offset of TTL_SET. */
   5562     uint32 cpucos_offset = 0;           /* Offset of CHANGE_CPU_COS_SET. */
   5563     uint32 drop_offset = 0;             /* Offset of DROP_SET. */
   5564     uint32 mirror_override_offset = 0;  /* Offset of MIRROR_OVERRIDE_SET. */
   5565     uint32 sflow_offset = 0;            /* Offset of SFLOW_SET. */
   5566     uint32 debug_offset = 0;            /* Offset of INSTRUMENTATION_TRIGGERS_ENABLE. */
   5567 
   5568     /* Input parameters check. */
   5569     if (NULL == stage_fc) {
   5570         return (BCM_E_PARAM);
   5571     }
   5572     if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) {
   5573         profile_one_offset     = 0;  /* Start of the IFP_POLICY_TABLE */
   5574         mirror_offset          = 56; /* IFP_PROFILE_SET_1(56b) */
   5575         lb_offset              = 68; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) */
   5576         nat_override_offset    = 71; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5577                                       *  LB_CONTROLS_SET(3b)
   5578                                       */
   5579         copytocpu_offset       = 72; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5580                                       *  LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b)
   5581                                       */
   5582         cutthrough_offset      = 89; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5583                                       * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) +
   5584                                       *  COPY_TO_CPU_SET(17b)
   5585                                       */
   5586         urpf_offset            = 90; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5587                                       * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) +
   5588                                       * COPY_TO_CPU_SET(17b) +
   5589                                       * CUT_THRU_OVERRIDE_SET(1b)
   5590                                       */
   5591         ttl_offset             = 91; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5592                                       * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) +
   5593                                       * COPY_TO_CPU_SET(17b) +
   5594                                       * CUT_THRU_OVERRIDE_SET(1b) +
   5595                                       * URPF_OVERRIDE_SET(1b)
   5596                                       */
   5597         profile_two_offset    = 101; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5598                                       * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) +
   5599                                       * COPY_TO_CPU_SET(17b) +
   5600                                       * CUT_THRU_OVERRIDE_SET(1b) +
   5601                                       * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5602                                       * RESERVED_0(1b) + ECCP_0(8b)
   5603                                       */
   5604         l3swl2change_offset   = 153; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5605                                       * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) +
   5606                                       * COPY_TO_CPU_SET(17b) +
   5607                                       * CUT_THRU_OVERRIDE_SET(1b) +
   5608                                       * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5609                                       * RESERVED_0(1b) + ECCP_0(8b) +
   5610                                       * PROFILE_SET_2(52b)
   5611                                       */
   5612         cpucos_offset         = 176; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5613                                       * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) +
   5614                                       * COPY_TO_CPU_SET(17b) +
   5615                                       * CUT_THRU_OVERRIDE_SET(1b) +
   5616                                       * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5617                                       * RESERVED_0(1b) + ECCP_0(8b) +
   5618                                       * PROFILE_SET_2(52b) + L3SW_CHANGE_L2_SET(33b)
   5619                                       */
   5620         drop_offset           = 184; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5621                                       * LB_CONTROLS_SET(3b) + NAT_OVERRIDE_SET(1b) +
   5622                                       * COPY_TO_CPU_SET(17b) +
   5623                                       * CUT_THRU_OVERRIDE_SET(1b) +
   5624                                       * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5625                                       * RESERVED_0(1b) + ECCP_0(8b) +
   5626                                       * PROFILE_SET_2(52b) + L3SW_CHANGE_L2_SET(33b)
   5627                                       * + CHANGE_CPU_COS_SET(8b)
   5628                                       */
   5629         mirror_override_offset = 190; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5630                                        * LB_CONTROLS_SET(3b) +
   5631                                        * NAT_OVERRIDE_SET(1b) +
   5632                                        * COPY_TO_CPU_SET(17b) +
   5633                                        * CUT_THRU_OVERRIDE_SET(1b) +
   5634                                        * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5635                                        * RESERVED_0(1b) + ECCP_0(8b) +
   5636                                        * PROFILE_SET_2(52b) +
   5637                                        * L3SW_CHANGE_L2_SET(33b) +
   5638                                        * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) +
   5639                                        */
   5640         sflow_offset           = 192; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5641                                        * LB_CONTROLS_SET(3b) +
   5642                                        * NAT_OVERRIDE_SET(1b) +
   5643                                        * COPY_TO_CPU_SET(17b) +
   5644                                        * CUT_THRU_OVERRIDE_SET(1b) +
   5645                                        * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5646                                        * RESERVED_0(1b) + ECCP_0(8b) +
   5647                                        * PROFILE_SET_2(52b) +
   5648                                        * L3SW_CHANGE_L2_SET(33b) +
   5649                                        * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) +
   5650                                        * MIRROR_OVERRIDE_SET(1b) +
   5651                                        * GREEN_TO_PID_SET(1b)
   5652                                        */
   5653         debug_offset           = 193; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5654                                        * LB_CONTROLS_SET(3b) +
   5655                                        * NAT_OVERRIDE_SET(1b) +
   5656                                        * COPY_TO_CPU_SET(17b) +
   5657                                        * CUT_THRU_OVERRIDE_SET(1b) +
   5658                                        * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5659                                        * RESERVED_0(1b) + ECCP_0(8b) +
   5660                                        * PROFILE_SET_2(52b) +
   5661                                        * L3SW_CHANGE_L2_SET(33b) +
   5662                                        * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) +
   5663                                        * MIRROR_OVERRIDE_SET(1b) +
   5664                                        * GREEN_TO_PID_SET(1b) + SFLOW_SET(1b)
   5665                                        */
   5666         redirect_offset        = 202; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5667                                        * LB_CONTROLS_SET(3b) +
   5668                                        * NAT_OVERRIDE_SET(1b) +
   5669                                        * COPY_TO_CPU_SET(17b) +
   5670                                        * CUT_THRU_OVERRIDE_SET(1b) +
   5671                                        * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5672                                        * RESERVED_0(1b) + ECCP_0(8b) +
   5673                                        * PROFILE_SET_2(52b) +
   5674                                        * L3SW_CHANGE_L2_SET(33b) +
   5675                                        * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) +
   5676                                        * MIRROR_OVERRIDE_SET(1b) +
   5677                                        * GREEN_TO_PID_SET(1b) + SFLOW_SET(1b) +
   5678                                        * INSTRUMENTATION_TRIGGERS_ENABLE(1b) +
   5679                                        * ECCP_1(8b)
   5680                                        */
   5681         nat_offset             = 283; /* PROFILE_SET_1(56b) + MIRROR_SET(12b) +
   5682                                        * LB_CONTROLS_SET(3b) +
   5683                                        * NAT_OVERRIDE_SET(1b) +
   5684                                        * COPY_TO_CPU_SET(17b) +
   5685                                        * CUT_THRU_OVERRIDE_SET(1b) +
   5686                                        * URPF_OVERRIDE_SET(1b) + IFP_TTL_SET(1b) +
   5687                                        * RESERVED_0(1b) + ECCP_0(8b) +
   5688                                        * PROFILE_SET_2(52b) +
   5689                                        * L3SW_CHANGE_L2_SET(33b) +
   5690                                        * CHANGE_CPU_COS_SET(8b) + DROP_SET(6b) +
   5691                                        * MIRROR_OVERRIDE_SET(1b) +
   5692                                        * GREEN_TO_PID_SET(1b) + SFLOW_SET(1b) +
   5693                                        * INSTRUMENTATION_TRIGGERS_ENABLE(1b) +
   5694                                        * ECCP_1(8b) + REDIRECT_SET(38b) +
   5695                                        * COUNTER_SET(25b) + METER_SET(18b)
   5696                                        */
   5697     } else if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
   5698         profile_two_offset=56;
   5699     }
   5700 
   5701     /* IFP_PROFILE_SET_1(56b) */
   5702     offset = profile_one_offset;
   5703     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionUntaggedPacketPriorityNew,
   5704                                       0, offset + 52, 4, -1, offset + 51, 1, 1);
   5705     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDropPrecedence,
   5706                                                          0, offset + 0, 2, -1);
   5707     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDropPrecedence,
   5708                                                          0, offset + 2, 2, -1);
   5709     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDropPrecedence,
   5710                                                          0, offset + 4, 2, -1);
   5711 
   5712     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpCosQNew,
   5713                                                0, offset + 6, 8, -1, 30, 4, 1);
   5714     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpCosMapNew,
   5715                                                0, offset + 6, 2, -1, 30, 4, 2);
   5716     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntCopy,
   5717                                                          0, offset + 30, 4, 4);
   5718     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpPrioIntNew,
   5719                                                0, offset + 6, 8, -1, 30, 4, 5);
   5720     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntTos,
   5721                                                          0, offset + 30, 4, 6);
   5722     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntCancel,
   5723                                                          0, offset + 30, 4, 7);
   5724     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpUcastCosQNew,
   5725                                                0, offset + 6, 4, -1, 30, 4, 8);
   5726     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpMcastCosQNew,
   5727                                               0, offset + 10, 4, -1, 30, 4, 9);
   5728 
   5729     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpCosQNew,
   5730                                               0, offset + 14, 8, -1, 34, 4, 1);
   5731     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpCosMapNew,
   5732                                               0, offset + 14, 2, -1, 34, 4, 2);
   5733     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntCopy,
   5734                                                          0, offset + 34, 4, 4);
   5735     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpPrioIntNew,
   5736                                               0, offset + 14, 8, -1, 34, 4, 5);
   5737     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntTos,
   5738                                                          0, offset + 34, 4, 6);
   5739     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntCancel,
   5740                                                          0, offset + 34, 4, 7);
   5741     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpUcastCosQNew,
   5742                                               0, offset + 14, 4, -1, 34, 4, 8);
   5743     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpMcastCosQNew,
   5744                                               0, offset + 18, 4, -1, 34, 4, 9);
   5745 
   5746     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpCosQNew,
   5747                                               0, offset + 22, 8, -1, 38, 4, 1);
   5748     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpCosMapNew,
   5749                                               0, offset + 22, 2, -1, 38, 4, 2);
   5750     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntCopy,
   5751                                                          0, offset + 38, 4, 4);
   5752     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpPrioIntNew,
   5753                                               0, offset + 22, 8, -1, 38, 4, 5);
   5754     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntTos,
   5755                                                          0, offset + 38, 4, 6);
   5756     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntCancel,
   5757                                                          0, offset + 38, 4, 7);
   5758     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpUcastCosQNew,
   5759                                               0, offset + 22, 4, -1, 38, 4, 8);
   5760     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpMcastCosQNew,
   5761                                               0, offset + 26, 4, -1, 38, 4, 9);
   5762 
   5763     if (soc_feature(unit, soc_feature_ecn_wred)) {
   5764         _FP_ACTION_ADD_TWO(unit, stage_fc,
   5765                            bcmFieldActionGpIntCongestionNotificationNew,
   5766                            _BCM_FIELD_ACTION_NO_EM_SUPPORT,
   5767                            offset + 46, 2, -1, 50, 1, 1);
   5768         _FP_ACTION_ADD_TWO(unit, stage_fc,
   5769                            bcmFieldActionYpIntCongestionNotificationNew,
   5770                            _BCM_FIELD_ACTION_NO_EM_SUPPORT
   5771                            , offset + 44, 2, -1, 49, 1, 1);
   5772        _FP_ACTION_ADD_TWO(unit, stage_fc,
   5773                           bcmFieldActionRpIntCongestionNotificationNew,
   5774                           _BCM_FIELD_ACTION_NO_EM_SUPPORT
   5775                           , offset + 42, 2, -1, 48, 1, 1);
   5776     }
   5777 
   5778     if (soc_feature(unit, soc_feature_field_action_pfc_class)) {
   5779        _FP_ACTION_ADD_TWO(unit, stage_fc,
   5780                           bcmFieldActionPfcClassNew,
   5781                           0, offset + 52, 4, -1, 51, 1, 1);
   5782     }
   5783 
   5784     /* IFP_MIRROR_SET(12b) */
   5785     offset = mirror_offset;
   5786 
   5787     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMirrorIngress,
   5788                                           0, _FieldActionMirrorSet,
   5789                                           offset + 8, 4, 0, offset , 8, 0);
   5790 
   5791     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMirrorEgress,
   5792                                           0, _FieldActionMirrorSet,
   5793                                           offset + 8, 4, 0, offset , 8, 0);
   5794 
   5795     /* IFP_LB_CONTROLS_SET(3b) */
   5796     offset = lb_offset;
   5797 
   5798     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc,
   5799                        bcmFieldActionHgTrunkRandomRoundRobinHashCancel,
   5800                        0, _FieldActionLbControlSet,
   5801                        offset + 0, 1, 1);
   5802     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc,
   5803                        bcmFieldActionTrunkRandomRoundRobinHashCancel,
   5804                        0, _FieldActionLbControlSet,
   5805                        offset + 1, 1, 1);
   5806     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc,
   5807                        bcmFieldActionEcmpRandomRoundRobinHashCancel,
   5808                        0, _FieldActionLbControlSet,
   5809                        offset + 2, 1, 1);
   5810 
   5811     /* IFP_NAT_OVERRIDE_SET(1b) */
   5812     offset = nat_override_offset;
   5813 
   5814     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionNatCancel,
   5815                                  0, _FieldActionNatOverrideSet, offset + 0, 1, 1);
   5816 
   5817     /* IFP_COPY_TO_CPU_SET(17b) */
   5818     offset = copytocpu_offset;
   5819 
   5820     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionRpCopyToCpu,
   5821                                         0, _FieldActionCopyToCpuSet,
   5822                                         offset + 9, 8, -1, offset + 0, 3, 1);
   5823     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpCopyToCpuCancel,
   5824                                         0, _FieldActionCopyToCpuSet,
   5825                                         offset + 0, 3, 2);
   5826     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpSwitchToCpuCancel,
   5827                                         0, _FieldActionCopyToCpuSet,
   5828                                         offset + 0, 3, 3);
   5829     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpSwitchToCpuReinstate,
   5830                                         0, _FieldActionCopyToCpuSet,
   5831                                         offset + 0, 3, 4);
   5832     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionRpTimeStampToCpu,
   5833                                         0, _FieldActionCopyToCpuSet,
   5834                                         offset + 9, 8, -1, offset + 0, 3, 5);
   5835 
   5836     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionYpCopyToCpu,
   5837                                         0, _FieldActionCopyToCpuSet,
   5838                                         offset + 9, 8, -1, offset + 3, 3, 1);
   5839     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpCopyToCpuCancel,
   5840                                         0, _FieldActionCopyToCpuSet,
   5841                                         offset + 3, 3, 2);
   5842     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpSwitchToCpuCancel,
   5843                                         0, _FieldActionCopyToCpuSet,
   5844                                         offset + 3, 3, 3);
   5845     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpSwitchToCpuReinstate,
   5846                                         0, _FieldActionCopyToCpuSet,
   5847                                         offset + 3, 3, 4);
   5848     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionYpTimeStampToCpu,
   5849                                         0, _FieldActionCopyToCpuSet,
   5850                                         offset + 9, 8, -1, offset + 3, 3, 5);
   5851 
   5852     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionGpCopyToCpu,
   5853                                         0, _FieldActionCopyToCpuSet,
   5854                                         offset + 9, 8, -1, offset + 6, 3, 1);
   5855     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpCopyToCpuCancel,
   5856                                         0, _FieldActionCopyToCpuSet,
   5857                                         offset + 6, 3, 2);
   5858     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpSwitchToCpuCancel,
   5859                                         0, _FieldActionCopyToCpuSet,
   5860                                         offset + 6, 3, 3);
   5861     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpSwitchToCpuReinstate,
   5862                                         0, _FieldActionCopyToCpuSet,
   5863                                         offset + 6, 3, 4);
   5864     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionGpTimeStampToCpu,
   5865                                         0, _FieldActionCopyToCpuSet,
   5866                                         offset + 9, 8, -1, offset + 6, 3, 5);
   5867 
   5868     /* IFP_CUT_THRU_OVERRIDE_SET(1b) */
   5869     offset = cutthrough_offset;
   5870     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotCutThrough,
   5871                                  0, _FieldActionCutThrOverrideSet, offset + 0, 1, 1);
   5872 
   5873     /* IFP_URPF_OVERRIDE_SET(1b) */
   5874     offset = urpf_offset;
   5875 
   5876     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotCheckUrpf,
   5877                                  0, _FieldActionUrpfOverrideSet, offset + 0, 1, 1);
   5878 
   5879     /* IFP_TTL_SET(1b) */
   5880     offset = ttl_offset;
   5881 
   5882     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotChangeTtl,
   5883                                  0, _FieldActionTtlOverrideSet, offset + 0, 1, 1);
   5884 
   5885     /* IFP_PROFILE_SET_2(52b) */
   5886     offset = profile_two_offset;
   5887 
   5888     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpEcnNew,
   5889                                         0, offset + 0, 2, -1, offset + 6, 1, 1);
   5890     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpEcnNew,
   5891                                         0, offset + 2, 2, -1, offset + 7, 1, 1);
   5892     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpEcnNew,
   5893                                         0, offset + 4, 2, -1, offset + 8, 1, 1);
   5894 
   5895     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDot1pPreserve,
   5896                                                           0, offset + 18, 3, 3);
   5897     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktCopy,
   5898                                                           0, offset + 18, 3, 4);
   5899     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpPrioPktNew,
   5900                                        0, offset + 9, 3, -1, offset + 18, 3, 5);
   5901     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktTos,
   5902                                                           0, offset + 18, 3, 6);
   5903     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktCancel,
   5904                                                           0, offset + 18, 3, 7);
   5905 
   5906     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDot1pPreserve,
   5907                                                           0, offset + 21, 3, 3);
   5908     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktCopy,
   5909                                                           0, offset + 21, 3, 4);
   5910     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpPrioPktNew,
   5911                                       0, offset + 12, 3, -1, offset + 21, 3, 5);
   5912     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktTos,
   5913                                                           0, offset + 21, 3, 6);
   5914     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktCancel,
   5915                                                           0, offset + 21, 3, 7);
   5916 
   5917     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDot1pPreserve,
   5918                                                           0, offset + 24, 3, 3);
   5919     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktCopy,
   5920                                                           0, offset + 24, 3, 4);
   5921     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpPrioPktNew,
   5922                                       0, offset + 15, 3, -1, offset + 24, 3, 5);
   5923     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktTos,
   5924                                                           0, offset + 24, 3, 6);
   5925     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktCancel,
   5926                                                           0, offset + 24, 3, 7);
   5927 
   5928     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpDscpNew,
   5929                                       0, offset + 40, 6, -1, offset + 27, 2, 1);
   5930     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDscpCancel,
   5931                                                           0, offset + 27, 2, 2);
   5932     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDscpPreserve,
   5933                                                           0, offset + 27, 2, 3);
   5934 
   5935     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpDscpNew,
   5936                                       0, offset + 34, 6, -1, offset + 29, 2, 1);
   5937     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDscpCancel,
   5938                                                           0, offset + 29, 2, 2);
   5939     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDscpPreserve,
   5940                                                           0, offset + 29, 2, 3);
   5941 
   5942     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpDscpNew,
   5943                                       0, offset + 46, 6, -1, offset + 31, 3, 3);
   5944     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDscpCancel,
   5945                                                           0, offset + 31, 3, 4);
   5946     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDscpPreserve,
   5947                                                           0, offset + 31, 3, 5);
   5948 
   5949     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpTosPrecedenceNew,
   5950                                       0, offset + 46, 6, -1, offset + 31, 3, 1);
   5951     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpTosPrecedenceCopy,
   5952                                                           0, offset + 31, 3, 2);
   5953 
   5954     /* IFP_L3SW_CHANGE_L2_SET(33b) */
   5955     offset = l3swl2change_offset;
   5956     if (!soc_feature(unit, soc_feature_th3_style_fp)) {
   5957         _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionDstMacNew,
   5958                                           0, _FieldActionL3SwChangeL2Set,
   5959                                           offset + 0, 15, -1, offset + 19, 4, 1);
   5960         _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionSrcMacNew,
   5961                                           0, _FieldActionL3SwChangeL2Set,
   5962                                           offset + 0, 15, -1, offset + 19, 4, 1);
   5963         _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionOuterVlanNew,
   5964                                           0, _FieldActionL3SwChangeL2Set,
   5965                                           offset + 0, 15, -1, offset + 19, 4, 1);
   5966         _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionVnTagNew,
   5967                                           0, _FieldActionL3SwChangeL2Set,
   5968                                           offset + 0, 15, -1, offset + 19, 4, 1);
   5969         _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionVnTagDelete,
   5970                                           0, _FieldActionL3SwChangeL2Set,
   5971                                           offset + 0, 15, -1, offset + 19, 4, 1);
   5972         _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEtagNew,
   5973                                           0, _FieldActionL3SwChangeL2Set,
   5974                                           offset + 0, 15, -1, offset + 19, 4, 1);
   5975         _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEtagDelete,
   5976                                           0, _FieldActionL3SwChangeL2Set,
   5977                                           offset + 0, 15, -1, offset + 19, 4, 1);
   5978     }
   5979     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionChangeL2Fields,
   5980                                       0, _FieldActionL3SwChangeL2Set,
   5981                                       offset + 0, 15, -1, offset + 19, 4, 1);
   5982     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc,
   5983                                       bcmFieldActionChangeL2FieldsCancel,
   5984                                       0, _FieldActionL3SwChangeL2Set,
   5985                                       offset + 19, 4, 2);
   5986     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionFabricQueue,
   5987                                       0, _FieldActionL3SwChangeL2Set,
   5988                                       offset + 0, 2, -1,
   5989                                       offset + 2, 16, -1, offset + 19, 4, 3);
   5990     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionAddClassTag,
   5991                                       0, _FieldActionL3SwChangeL2Set,
   5992                                       offset + 0, 16, -1, offset + 19, 4, 4);
   5993     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionL3Switch,
   5994                                    _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP,
   5995                                    _FieldActionL3SwChangeL2Set,
   5996                                    offset + 0, 15, -1,
   5997                                    offset + 17, 1, 0, offset + 19, 4, 6);
   5998     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionL3Switch,
   5999                                    _BCM_FIELD_ACTION_L3SWITCH_ECMP,
   6000                                    _FieldActionL3SwChangeL2Set,
   6001                                    offset + 0, 11, -1,
   6002                                    offset + 17, 1, 1, offset + 19, 4, 6);
   6003     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMultipathHash,
   6004                                       0, _FieldActionL3SwChangeL2Set,
   6005                                       offset + 11, 3, -1, offset + 19, 4, 6);
   6006     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionL3SwitchCancel,
   6007                                       0, _FieldActionL3SwChangeL2Set,
   6008                                       offset + 19, 4, 7);
   6009     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressClassSelect,
   6010                                       0, _FieldActionL3SwChangeL2Set,
   6011                                       offset + 0, 4, -1, offset + 19, 4, 8);
   6012     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionHiGigClassSelect,
   6013                                       0, _FieldActionL3SwChangeL2Set,
   6014                                       offset + 4, 3, -1, offset + 19, 4, 8);
   6015     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionNewClassId,
   6016                                       0, _FieldActionL3SwChangeL2Set,
   6017                                       offset + 7, 9, -1, offset + 19, 4, 8);
   6018     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionBFDSessionIdNew,
   6019                                       0, _FieldActionL3SwChangeL2Set,
   6020                                       offset + 0, 12, -1, offset + 19, 4, 9);
   6021 
   6022     /* IFP_CHANGE_CPU_COS_SET(8b) */
   6023     offset = cpucos_offset;
   6024     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionCosQCpuNew,
   6025                                         0, _FieldActionChangeCpuCosSet,
   6026                                         offset + 0, 6, -1, offset + 6, 2, 1);
   6027     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionServicePoolIdNew, 0,
   6028                                                    _FieldActionChangeCpuCosSet,
   6029                                                               offset + 2, 2, -1,
   6030                                                               offset + 4, 2, 2,
   6031                                                               offset + 6, 2, 2);
   6032     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionServicePoolIdPrecedenceNew, 0,
   6033                                                    _FieldActionChangeCpuCosSet,
   6034                                                               offset + 2, 2, -1,
   6035                                                               offset + 0, 2, -1,
   6036                                                               offset + 4, 2, 3,
   6037                                                               offset + 6, 2, 2);
   6038     /* IFP_DROP_SET(6b) */
   6039     offset = drop_offset;
   6040    _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpDrop,
   6041                                  0, _FieldActionDropSet, offset + 0, 2, 1);
   6042     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpDropCancel,
   6043                                  0, _FieldActionDropSet, offset + 0, 2, 2);
   6044     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpDrop,
   6045                                  0, _FieldActionDropSet, offset + 2, 2, 1);
   6046     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpDropCancel,
   6047                                  0, _FieldActionDropSet,  offset + 2, 2, 2);
   6048     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpDrop,
   6049                                  0, _FieldActionDropSet, offset + 4, 2, 1);
   6050     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpDropCancel,
   6051                                  0, _FieldActionDropSet, offset + 4, 2, 2);
   6052 
   6053     /* IFP_MIRROR_OVERRIDE_SET(1b) */
   6054     offset = mirror_override_offset;
   6055 
   6056      _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionMirrorOverride,
   6057                                  0, _FieldActionMirrorOverrideSet, offset + 0, 1, 1);
   6058 
   6059     /* IFP_SFLOW_SET(1b) */
   6060     offset = sflow_offset;
   6061 
   6062     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionIngSampleEnable,
   6063                                  0, _FieldActionSflowSet, offset + 0, 1, 1);
   6064 
   6065     /* IFP_INSTRUMENTATION_TRIGGERS_ENABLE_SET(1b)*/
   6066     offset = debug_offset;
   6067     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionPacketTraceEnable,
   6068                                        _BCM_FIELD_ACTION_NO_EM_SUPPORT,
   6069                                        _FieldActionInstrumentationSet,
   6070                                        offset + 0, 1, 1);
   6071 
   6072     /* IFP_REDIRECT_SET(38b) */
   6073     offset = redirect_offset;
   6074     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirect,
   6075                                          _BCM_FIELD_ACTION_REDIRECT_DGLP,
   6076                                          _FieldActionRedirectSet,
   6077                                          offset + 6, 16, -1, offset + 22 , 1, 0,
   6078                                          offset + 3, 3, 0, offset + 0, 3, 1);
   6079     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirect,
   6080                                           _BCM_FIELD_ACTION_REDIRECT_DVP,
   6081                                           _FieldActionRedirectSet,
   6082                                           offset + 6, 14, -1,
   6083                                           offset + 3, 3, 6, offset + 0, 3, 1);
   6084     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirect,
   6085                                           _BCM_FIELD_ACTION_REDIRECT_TRUNK,
   6086                                           _FieldActionRedirectSet,
   6087                                           offset + 6, 16, -1, offset + 22, 1, 1,
   6088                                           offset + 3, 3, 0, offset + 0, 3, 1);
   6089     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirectTrunk,
   6090                                             _BCM_FIELD_ACTION_REDIRECT_TRUNK,
   6091                                             _FieldActionRedirectSet,
   6092                                             offset + 6, 16, -1, offset + 22, 1, 1,
   6093                                             offset + 3, 3, 0, offset + 0, 3, 1);
   6094     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectTrunk,
   6095                                             _BCM_FIELD_ACTION_REDIRECT_DVP,
   6096                                             _FieldActionRedirectSet,
   6097                                           offset + 6, 14, -1,
   6098                                           offset + 3, 3, 6, offset + 0, 3, 1);
   6099     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc,
   6100                                      bcmFieldActionUnmodifiedPacketRedirectPort,
   6101                                      _BCM_FIELD_ACTION_REDIRECT_DGLP,
   6102                                      _FieldActionRedirectSet,
   6103                                       offset + 6, 16, -1, offset + 22, 1, 0,
   6104                                       offset + 3, 3, 1, offset + 0, 3, 1);
   6105     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectEgrNextHop,
   6106                                           _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP,
   6107                                           _FieldActionRedirectSet,
   6108                                           offset + 6, 16, -1,
   6109                                           offset + 3, 3, 2, offset + 0, 3, 1);
   6110     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectEgrNextHop,
   6111                                          _BCM_FIELD_ACTION_REDIRECT_ECMP,
   6112                                          _FieldActionRedirectSet,
   6113                                          offset + 6, 16, -1,
   6114                                          offset + 3, 3, 3, offset + 0, 3, 1);
   6115     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRedirectCancel,
   6116                                    0, _FieldActionRedirectSet, offset + 0, 3, 2);
   6117     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectPbmp, 0,
   6118                                          _FieldActionRedirectSet,
   6119                                          offset + 6, 10, -1,
   6120                                          offset + 23, 2, 0, offset + 0, 3, 3);
   6121     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectVlan, 0,
   6122                                          _FieldActionRedirectSet,
   6123                                          offset + 17, 1, 0,
   6124                                          offset + 23, 2, 1, offset + 0, 3, 3);
   6125     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirectBcastPbmp, 0,
   6126                                           _FieldActionRedirectSet,
   6127                                           offset + 6, 10, -1, offset + 17, 1, 1,
   6128                                           offset + 23, 2, 1, offset + 0, 3, 3);
   6129     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectMcast, 0,
   6130                                           _FieldActionRedirectSet,
   6131                                           offset + 6, 14, -1,
   6132                                           offset + 23, 2, 2, offset + 0, 3, 3);
   6133     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectIpmc, 0,
   6134                                           _FieldActionRedirectSet,
   6135                                           offset + 6, 14, -1,
   6136                                           offset + 23, 2, 3, offset + 0, 3, 3);
   6137     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressMask, 0,
   6138                                           _FieldActionRedirectSet,
   6139                                           offset + 6, 10, -1, offset + 0, 3, 4);
   6140     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressPortsAdd, 0,
   6141                                           _FieldActionRedirectSet,
   6142                                           offset + 6, 10, -1, offset + 0, 3, 5);
   6143     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionFabricEHAddOrUpdate, 0,
   6144                                           _FieldActionRedirectSet,
   6145                                           offset + 3, 32, -1,
   6146                                           offset + 35, 3, -1, offset + 0, 3, 6);
   6147 
   6148     /* IFP_NAT_SET(12b) */
   6149     offset = nat_offset;
   6150     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionNat,
   6151                                 0, _FieldActionNatSet, offset + 11, 1, 1);
   6152     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionNatEgressOverride,
   6153                                 0, _FieldActionNatSet,
   6154                                 offset + 0, 10, -1, offset + 10, 1, -1);
   6155 
   6156     /* ExactMatch Action Class Id (12b) */
   6157     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionExactMatchClassId,
   6158                        _BCM_FIELD_ACTION_NO_IFP_SUPPORT, 0, 12, 0);
   6159 
   6160     /* All actions which have corresponding Colored(Gp/Yp/Rp) Actions needs to be
   6161      * initialized with some default configuration(offset = 0, width = 0, value = 0).
   6162      */
   6163     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionCosQNew, 0, 0, 0, 0);
   6164     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntCopy, 0, 0, 0, 0);
   6165     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntNew, 0, 0, 0, 0);
   6166     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntTos, 0, 0, 0, 0);
   6167     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntCancel, 0, 0, 0, 0);
   6168     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionUcastCosQNew, 0, 0, 0, 0);
   6169     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionMcastCosQNew, 0, 0, 0, 0);
   6170     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDropPrecedence, 0, 0, 0, 0);
   6171     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionColorIndependent,
   6172                                  0, _FieldActionGreenToPidSet, 0, 0, 0);
   6173     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionEcnNew, 0, 0, 0, 0);
   6174     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktCopy, 0, 0, 0, 0);
   6175     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktNew, 0, 0, 0, 0);
   6176     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktTos, 0, 0, 0, 0);
   6177     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktCancel, 0, 0, 0, 0);
   6178     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpNew, 0, 0, 0, 0);
   6179     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpCancel, 0, 0, 0, 0);
   6180     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionCopyToCpu,
   6181                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6182     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionCopyToCpuCancel,
   6183                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6184     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionSwitchToCpuCancel,
   6185                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6186     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionSwitchToCpuReinstate,
   6187                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6188     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionTimeStampToCpu,
   6189                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6190     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionTimeStampToCpuCancel,
   6191                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6192     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpTimeStampToCpuCancel,
   6193                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6194     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpTimeStampToCpuCancel,
   6195                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6196     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpTimeStampToCpuCancel,
   6197                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6198     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDrop,
   6199                                  0, _FieldActionDropSet, 0, 0, 0);
   6200     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDropCancel,
   6201                                  0, _FieldActionDropSet, 0, 0, 0);
   6202     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntCopy, 0, 0, 0, 0);
   6203     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntNew, 0, 0, 0, 0);
   6204     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntTos, 0, 0, 0, 0);
   6205     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntCancel, 0, 0, 0, 0);
   6206     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntCopy, 0, 0, 0, 0);
   6207     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntNew, 0, 0, 0, 0);
   6208     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntTos, 0, 0, 0, 0);
   6209     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntCancel, 0, 0, 0, 0);
   6210     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntCopy, 0, 0, 0, 0);
   6211     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntNew, 0, 0, 0, 0);
   6212     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntTos, 0, 0, 0, 0);
   6213     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntCancel, 0, 0, 0, 0);
   6214     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntCopy, 0, 0, 0, 0);
   6215     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntNew, 0, 0, 0, 0);
   6216     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntTos, 0, 0, 0, 0);
   6217     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntCancel, 0, 0, 0, 0);
   6218     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionCosMapNew, 0, 0, 0, 0);
   6219     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpPreserve, 0, 0, 0, 0);
   6220     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDot1pPreserve, 0, 0, 0, 0);
   6221 
   6222     return BCM_E_NONE;
   6223 }
   6224 
   6225 #ifdef BCM_TOMAHAWK2_SUPPORT
   6226 /*
   6227  * Function:
   6228  *     _field_th2_common_actions_init
   6229  * Purpose:
   6230  *     Initialize device stage lookup qaualifiers
   6231  *     select codes & offsets
   6232  * Parameters:
   6233  *     unit       - (IN) BCM device number.
   6234  *     stage_fc   - (IN) Field Processor stage control structure.
   6235  * Returns:
   6236  *     BCM_E_NONE
   6237  */
   6238 int
   6239 _field_th2_common_actions_init(int unit, _field_stage_t *stage_fc)
   6240 {
   6241     _FP_ACTION_DECL
   6242     uint32 offset = 0;                  /* General variable to carry offset. */
   6243     uint32 profile_one_offset = 0;      /* Offset of PROFILE_ONE_SET. */
   6244     uint32 profile_two_offset = 0;      /* Offset of PROFILE_TWO_SET. */
   6245     uint32 redirect_offset = 0;         /* Offset of REDIRECT_SET. */
   6246     uint32 l3swl2change_offset = 0;     /* Offset of L3SW_CHANGE_L2_SET. */
   6247     uint32 nat_offset = 0;              /* Offset of NAT_SET. */
   6248     uint32 mirror_offset = 0;           /* Offset of MIRROR_SET. */
   6249     uint32 lb_offset = 0;               /* Offset of LB_CONTROL_SET. */
   6250     uint32 nat_override_offset = 0;     /* Offset of NAT_OVERRIDE_SET. */
   6251     uint32 copytocpu_offset = 0;        /* Offset of COPY_TO_CPU_SET. */
   6252     uint32 cutthrough_offset = 0;       /* Offset of CUT_THRU_OVERRIDE_SET. */
   6253     uint32 urpf_offset = 0;             /* Offset of URPF_OVERRIDE_SET. */
   6254     uint32 ttl_offset = 0;              /* Offset of TTL_SET. */
   6255     uint32 cpucos_offset = 0;           /* Offset of CHANGE_CPU_COS_SET. */
   6256     uint32 drop_offset = 0;             /* Offset of DROP_SET. */
   6257     uint32 mirror_override_offset = 0;  /* Offset of MIRROR_OVERRIDE_SET. */
   6258     uint32 sflow_offset = 0;            /* Offset of SFLOW_SET. */
   6259     uint32 debug_offset = 0;            /* Offset of INSTRUMENTATION_TRIGGERS_ENABLE. */
   6260     uint32 timestamp_offset = 0;        /* Offset of TIMESTAMP_SET. */
   6261     uint32 dlb_hgt_lag_offset = 0;      /* Offset of DLB_HGT_LAG_SET. */
   6262 #if defined(INCLUDE_L3)
   6263     uint32 prot_switch_offset = 0;      /* Offset of PROTECTION_SWITCHING_SET. */
   6264     uint32 dlb_ecmp_offset = 0;         /* Offset of DLB_ECMP_SET. */
   6265     uint32 dlb_alternate_path_control_offset = 0;      /* Offset of DLB_ALTERNATE_PATH_CONTROL_SET. */
   6266 #endif /* INCLUDE_L3 */
   6267     soc_field_info_t * f_info;
   6268 
   6269     /* Input parameters check. */
   6270     if (NULL == stage_fc) {
   6271         return (BCM_E_PARAM);
   6272     }
   6273 
   6274     if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) {
   6275         profile_one_offset = 0;
   6276         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, MIRROR_SETf);
   6277         mirror_offset = f_info->bp;
   6278         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, LB_CONTROLS_SETf);
   6279         lb_offset = f_info->bp;
   6280         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, NAT_OVERRIDE_SETf);
   6281         nat_override_offset = f_info->bp;
   6282         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, COPY_TO_CPU_SETf);
   6283         copytocpu_offset = f_info->bp;
   6284         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, CUT_THRU_OVERRIDE_SETf);
   6285         cutthrough_offset = f_info->bp;
   6286         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, URPF_OVERRIDE_SETf);
   6287         urpf_offset = f_info->bp;
   6288         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, TTL_OVERRIDE_SETf);
   6289         ttl_offset = f_info->bp;
   6290         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, PROFILE_SET_2f);
   6291         profile_two_offset = f_info->bp;
   6292         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, L3SW_CHANGE_L2_SETf);
   6293         l3swl2change_offset = f_info->bp;
   6294         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, CHANGE_CPU_COS_SETf);
   6295         cpucos_offset = f_info->bp;
   6296         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, DROP_SETf);
   6297         drop_offset = f_info->bp;
   6298         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, MIRROR_OVERRIDE_SETf);
   6299         mirror_override_offset = f_info->bp;
   6300         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, SFLOW_SETf);
   6301         sflow_offset = f_info->bp;
   6302         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, INSTRUMENTATION_TRIGGERS_ENABLEf);
   6303         debug_offset = f_info->bp;
   6304         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, REDIRECT_SETf);
   6305         redirect_offset = f_info->bp;
   6306         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, NAT_SETf);
   6307         nat_offset = f_info->bp;
   6308         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, DLB_HGT_LAG_SETf);
   6309         dlb_hgt_lag_offset = f_info->bp;
   6310         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, TIMESTAMP_SETf);
   6311         timestamp_offset = f_info->bp;
   6312 #if defined(INCLUDE_L3)
   6313         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, PROTECTION_SWITCHING_SETf);
   6314         prot_switch_offset = f_info->bp;
   6315         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, DLB_ECMP_SETf);
   6316         dlb_ecmp_offset = f_info->bp;
   6317         f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, DLB_ALTERNATE_PATH_CONTROL_SETf);
   6318         dlb_alternate_path_control_offset = f_info->bp;
   6319 #endif /* INCLUDE_L3 */
   6320     } else if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
   6321         f_info = soc_mem_fieldinfo_get(unit, EXACT_MATCH_QOS_ACTIONS_PROFILEm, PROFILE_SET_2f);
   6322         profile_two_offset = f_info->bp;
   6323     }
   6324 
   6325     /* IFP_PROFILE_SET_1(56b) */
   6326     offset = profile_one_offset;
   6327     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionUntaggedPacketPriorityNew,
   6328                                       0, offset + 52, 4, -1, offset + 51, 1, 1);
   6329     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDropPrecedence,
   6330                                                          0, offset + 0, 2, -1);
   6331     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDropPrecedence,
   6332                                                          0, offset + 2, 2, -1);
   6333     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDropPrecedence,
   6334                                                          0, offset + 4, 2, -1);
   6335 
   6336     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpCosQNew,
   6337                                                0, offset + 6, 8, -1, 30, 4, 1);
   6338     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpCosMapNew,
   6339                                                0, offset + 6, 2, -1, 30, 4, 2);
   6340     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntCopy,
   6341                                                          0, offset + 30, 4, 4);
   6342     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpPrioIntNew,
   6343                                                0, offset + 6, 8, -1, 30, 4, 5);
   6344     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntTos,
   6345                                                          0, offset + 30, 4, 6);
   6346     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioIntCancel,
   6347                                                          0, offset + 30, 4, 7);
   6348     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpUcastCosQNew,
   6349                                                0, offset + 6, 4, -1, 30, 4, 8);
   6350     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpMcastCosQNew,
   6351                                               0, offset + 10, 4, -1, 30, 4, 9);
   6352 
   6353     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpCosQNew,
   6354                                               0, offset + 14, 8, -1, 34, 4, 1);
   6355     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpCosMapNew,
   6356                                               0, offset + 14, 2, -1, 34, 4, 2);
   6357     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntCopy,
   6358                                                          0, offset + 34, 4, 4);
   6359     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpPrioIntNew,
   6360                                               0, offset + 14, 8, -1, 34, 4, 5);
   6361     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntTos,
   6362                                                          0, offset + 34, 4, 6);
   6363     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioIntCancel,
   6364                                                          0, offset + 34, 4, 7);
   6365     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpUcastCosQNew,
   6366                                               0, offset + 14, 4, -1, 34, 4, 8);
   6367     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpMcastCosQNew,
   6368                                               0, offset + 18, 4, -1, 34, 4, 9);
   6369 
   6370     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpCosQNew,
   6371                                               0, offset + 22, 8, -1, 38, 4, 1);
   6372     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpCosMapNew,
   6373                                               0, offset + 22, 2, -1, 38, 4, 2);
   6374     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntCopy,
   6375                                                          0, offset + 38, 4, 4);
   6376     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpPrioIntNew,
   6377                                               0, offset + 22, 8, -1, 38, 4, 5);
   6378     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntTos,
   6379                                                          0, offset + 38, 4, 6);
   6380     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioIntCancel,
   6381                                                          0, offset + 38, 4, 7);
   6382     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpUcastCosQNew,
   6383                                               0, offset + 22, 4, -1, 38, 4, 8);
   6384     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpMcastCosQNew,
   6385                                               0, offset + 26, 4, -1, 38, 4, 9);
   6386 
   6387     if (soc_feature(unit, soc_feature_ecn_wred)) {
   6388         _FP_ACTION_ADD_TWO(unit, stage_fc,
   6389                            bcmFieldActionGpIntCongestionNotificationNew,
   6390                            _BCM_FIELD_ACTION_NO_EM_SUPPORT,
   6391                            offset + 46, 2, -1, 50, 1, 1);
   6392         _FP_ACTION_ADD_TWO(unit, stage_fc,
   6393                            bcmFieldActionYpIntCongestionNotificationNew,
   6394                            _BCM_FIELD_ACTION_NO_EM_SUPPORT
   6395                            , offset + 44, 2, -1, 49, 1, 1);
   6396        _FP_ACTION_ADD_TWO(unit, stage_fc,
   6397                           bcmFieldActionRpIntCongestionNotificationNew,
   6398                           _BCM_FIELD_ACTION_NO_EM_SUPPORT
   6399                           , offset + 42, 2, -1, 48, 1, 1);
   6400     }
   6401 
   6402     if (soc_feature(unit, soc_feature_field_action_pfc_class)) {
   6403        _FP_ACTION_ADD_TWO(unit, stage_fc,
   6404                           bcmFieldActionPfcClassNew,
   6405                           0, offset + 52, 4, -1, 51, 1, 1);
   6406     }
   6407 
   6408     /* IFP_MIRROR_SET(12b) */
   6409     offset = mirror_offset;
   6410 
   6411     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMirrorIngress,
   6412                                           0, _FieldActionMirrorSet,
   6413                                           offset + 8, 4, 0, offset , 8, 0);
   6414 
   6415     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMirrorEgress,
   6416                                           0, _FieldActionMirrorSet,
   6417                                           offset + 8, 4, 0, offset , 8, 0);
   6418 
   6419     /* IFP_LB_CONTROLS_SET(3b) */
   6420     offset = lb_offset;
   6421 
   6422 
   6423     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc,
   6424                        bcmFieldActionHgTrunkRandomRoundRobinHashCancel,
   6425                        0, _FieldActionLbControlSet,
   6426                        offset + 0, 1, 1);
   6427     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc,
   6428                        bcmFieldActionTrunkRandomRoundRobinHashCancel,
   6429                        0, _FieldActionLbControlSet,
   6430                        offset + 1, 1, 1);
   6431     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc,
   6432                        bcmFieldActionEcmpRandomRoundRobinHashCancel,
   6433                        0, _FieldActionLbControlSet,
   6434                        offset + 2, 1, 1);
   6435 
   6436     /* IFP_NAT_OVERRIDE_SET(1b) */
   6437     offset = nat_override_offset;
   6438 
   6439     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionNatCancel,
   6440                        0, _FieldActionNatOverrideSet, offset + 0, 1, 1);
   6441     /* IFP_COPY_TO_CPU_SET(17b) */
   6442     offset = copytocpu_offset;
   6443 
   6444     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionRpCopyToCpu,
   6445                                         0, _FieldActionCopyToCpuSet,
   6446                                         offset + 9, 8, -1, offset + 0, 3, 1);
   6447     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpCopyToCpuCancel,
   6448                                         0, _FieldActionCopyToCpuSet,
   6449                                         offset + 0, 3, 2);
   6450     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpSwitchToCpuCancel,
   6451                                         0, _FieldActionCopyToCpuSet,
   6452                                         offset + 0, 3, 3);
   6453     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpSwitchToCpuReinstate,
   6454                                         0, _FieldActionCopyToCpuSet,
   6455                                         offset + 0, 3, 4);
   6456     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionRpTimeStampToCpu,
   6457                                         0, _FieldActionCopyToCpuSet,
   6458                                         offset + 9, 8, -1, offset + 0, 3, 5);
   6459 
   6460     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionYpCopyToCpu,
   6461                                         0, _FieldActionCopyToCpuSet,
   6462                                         offset + 9, 8, -1, offset + 3, 3, 1);
   6463     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpCopyToCpuCancel,
   6464                                         0, _FieldActionCopyToCpuSet,
   6465                                         offset + 3, 3, 2);
   6466     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpSwitchToCpuCancel,
   6467                                         0, _FieldActionCopyToCpuSet,
   6468                                         offset + 3, 3, 3);
   6469     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpSwitchToCpuReinstate,
   6470                                         0, _FieldActionCopyToCpuSet,
   6471                                         offset + 3, 3, 4);
   6472     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionYpTimeStampToCpu,
   6473                                         0, _FieldActionCopyToCpuSet,
   6474                                         offset + 9, 8, -1, offset + 3, 3, 5);
   6475 
   6476     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionGpCopyToCpu,
   6477                                         0, _FieldActionCopyToCpuSet,
   6478                                         offset + 9, 8, -1, offset + 6, 3, 1);
   6479     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpCopyToCpuCancel,
   6480                                         0, _FieldActionCopyToCpuSet,
   6481                                         offset + 6, 3, 2);
   6482     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpSwitchToCpuCancel,
   6483                                         0, _FieldActionCopyToCpuSet,
   6484                                         offset + 6, 3, 3);
   6485     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpSwitchToCpuReinstate,
   6486                                         0, _FieldActionCopyToCpuSet,
   6487                                         offset + 6, 3, 4);
   6488     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionGpTimeStampToCpu,
   6489                                         0, _FieldActionCopyToCpuSet,
   6490                                         offset + 9, 8, -1, offset + 6, 3, 5);
   6491 
   6492     /* IFP_CUT_THRU_OVERRIDE_SET(1b) */
   6493     offset = cutthrough_offset;
   6494     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotCutThrough,
   6495                                 0, _FieldActionCutThrOverrideSet, offset + 0, 1, 1);
   6496 
   6497     /* IFP_URPF_OVERRIDE_SET(1b) */
   6498     offset = urpf_offset;
   6499 
   6500     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotCheckUrpf,
   6501                                 0, _FieldActionUrpfOverrideSet, offset + 0, 1, 1);
   6502 
   6503     /* IFP_TTL_SET(1b) */
   6504     offset = ttl_offset;
   6505 
   6506     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDoNotChangeTtl,
   6507                                 0, _FieldActionTtlOverrideSet, offset + 0, 1, 1);
   6508 
   6509     /* IFP_PROFILE_SET_2(52b) */
   6510     offset = profile_two_offset;
   6511 
   6512     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpEcnNew,
   6513                                         0, offset + 0, 2, -1, offset + 6, 1, 1);
   6514     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpEcnNew,
   6515                                         0, offset + 2, 2, -1, offset + 7, 1, 1);
   6516     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpEcnNew,
   6517                                         0, offset + 4, 2, -1, offset + 8, 1, 1);
   6518 
   6519     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDot1pPreserve,
   6520                                                           0, offset + 18, 3, 3);
   6521     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktCopy,
   6522                                                           0, offset + 18, 3, 4);
   6523     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpPrioPktNew,
   6524                                        0, offset + 9, 3, -1, offset + 18, 3, 5);
   6525     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktTos,
   6526                                                           0, offset + 18, 3, 6);
   6527     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktCancel,
   6528                                                           0, offset + 18, 3, 7);
   6529 
   6530     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDot1pPreserve,
   6531                                                           0, offset + 21, 3, 3);
   6532     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktCopy,
   6533                                                           0, offset + 21, 3, 4);
   6534     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpPrioPktNew,
   6535                                       0, offset + 12, 3, -1, offset + 21, 3, 5);
   6536     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktTos,
   6537                                                           0, offset + 21, 3, 6);
   6538     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktCancel,
   6539                                                           0, offset + 21, 3, 7);
   6540 
   6541     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDot1pPreserve,
   6542                                                           0, offset + 24, 3, 3);
   6543     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktCopy,
   6544                                                           0, offset + 24, 3, 4);
   6545     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpPrioPktNew,
   6546                                       0, offset + 15, 3, -1, offset + 24, 3, 5);
   6547     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktTos,
   6548                                                           0, offset + 24, 3, 6);
   6549     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktCancel,
   6550                                                           0, offset + 24, 3, 7);
   6551 
   6552     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionRpDscpNew,
   6553                                       0, offset + 40, 6, -1, offset + 27, 2, 1);
   6554     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDscpCancel,
   6555                                                           0, offset + 27, 2, 2);
   6556     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpDscpPreserve,
   6557                                                           0, offset + 27, 2, 3);
   6558 
   6559     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionYpDscpNew,
   6560                                       0, offset + 34, 6, -1, offset + 29, 2, 1);
   6561     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDscpCancel,
   6562                                                           0, offset + 29, 2, 2);
   6563     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpDscpPreserve,
   6564                                                           0, offset + 29, 2, 3);
   6565 
   6566     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpDscpNew,
   6567                                       0, offset + 46, 6, -1, offset + 31, 3, 3);
   6568     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDscpCancel,
   6569                                                           0, offset + 31, 3, 4);
   6570     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpDscpPreserve,
   6571                                                           0, offset + 31, 3, 5);
   6572 
   6573     _FP_ACTION_ADD_TWO(unit, stage_fc, bcmFieldActionGpTosPrecedenceNew,
   6574                                       0, offset + 46, 6, -1, offset + 31, 3, 1);
   6575     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpTosPrecedenceCopy,
   6576                                                           0, offset + 31, 3, 2);
   6577 
   6578     /* IFP_L3SW_CHANGE_L2_SET(33b) */
   6579     offset = l3swl2change_offset;
   6580 
   6581     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionDstMacNew,
   6582                                       0, _FieldActionL3SwChangeL2Set,
   6583                                       offset + 0, 16, -1, offset + 19, 4, 1);
   6584     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionSrcMacNew,
   6585                                       0, _FieldActionL3SwChangeL2Set,
   6586                                       offset + 0, 16, -1, offset + 19, 4, 1);
   6587     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionOuterVlanNew,
   6588                                       0, _FieldActionL3SwChangeL2Set,
   6589                                       offset + 0, 16, -1, offset + 19, 4, 1);
   6590     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionVnTagNew,
   6591                                       0, _FieldActionL3SwChangeL2Set,
   6592                                       offset + 0, 16, -1, offset + 19, 4, 1);
   6593     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionVnTagDelete,
   6594                                       0, _FieldActionL3SwChangeL2Set,
   6595                                       offset + 0, 16, -1, offset + 19, 4, 1);
   6596     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEtagNew,
   6597                                       0, _FieldActionL3SwChangeL2Set,
   6598                                       offset + 0, 16, -1, offset + 19, 4, 1);
   6599     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEtagDelete,
   6600                                       0, _FieldActionL3SwChangeL2Set,
   6601                                       offset + 0, 16, -1, offset + 19, 4, 1);
   6602     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionChangeL2Fields,
   6603                                       0, _FieldActionL3SwChangeL2Set,
   6604                                       offset + 0, 16, -1, offset + 19, 4, 1);
   6605     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionChangeL2FieldsCancel,
   6606                                       0, _FieldActionL3SwChangeL2Set,
   6607                                       offset + 19, 4, 2);
   6608     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionFabricQueue, 0,
   6609                                     _FieldActionL3SwChangeL2Set,
   6610                                     offset + 0, 2, -1,  offset + 2, 16, -1, offset + 19, 4, 3);
   6611     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionAddClassTag,
   6612                                       0, _FieldActionL3SwChangeL2Set,
   6613                                       offset + 0, 16, -1, offset + 19, 4, 4);
   6614     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionL3Switch,
   6615                                       _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP,
   6616                                       _FieldActionL3SwChangeL2Set,
   6617                                       offset + 0, 16, -1,
   6618                                       offset + 17, 1, 0, offset + 19, 4, 6);
   6619     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionL3Switch,
   6620                                       _BCM_FIELD_ACTION_L3SWITCH_ECMP,
   6621                                       _FieldActionL3SwChangeL2Set,
   6622                                       offset + 0, 12, -1,
   6623                                       offset + 17, 1, 1, offset + 19, 4, 6);
   6624     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionMultipathHash,
   6625                                       0, _FieldActionL3SwChangeL2Set,
   6626                                       offset + 12, 3, -1, offset + 19, 4, 6);
   6627     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionL3SwitchCancel,
   6628                                       0, _FieldActionL3SwChangeL2Set,
   6629                                       offset + 19, 4, 7);
   6630     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressClassSelect,
   6631                                        0, _FieldActionL3SwChangeL2Set,
   6632                                        offset + 0, 4, -1, offset + 19, 4, 8);
   6633     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionHiGigClassSelect,
   6634                                        0, _FieldActionL3SwChangeL2Set,
   6635                                       offset + 4, 3, -1, offset + 19, 4, 8);
   6636     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionNewClassId,
   6637                                        0, _FieldActionL3SwChangeL2Set,
   6638                                       offset + 7, 9, -1, offset + 19, 4, 8);
   6639     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionBFDSessionIdNew,
   6640                                        0, _FieldActionL3SwChangeL2Set,
   6641                                        offset + 0, 12, -1, offset + 19, 4, 9);
   6642 
   6643     /* IFP_CHANGE_CPU_COS_SET(8b) */
   6644     offset = cpucos_offset;
   6645 
   6646     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionCosQCpuNew,
   6647                                         0, _FieldActionChangeCpuCosSet,
   6648                                         offset + 0, 6, -1, offset + 6, 2, 1);
   6649     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionServicePoolIdNew, 0,
   6650                                                        _FieldActionChangeCpuCosSet,
   6651                                                               offset + 2, 2, -1,
   6652                                                               offset + 4, 2, 2,
   6653                                                               offset + 6, 2, 2);
   6654     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionServicePoolIdPrecedenceNew, 0,
   6655                                                              _FieldActionChangeCpuCosSet,
   6656                                                               offset + 2, 2, -1,
   6657                                                               offset + 0, 2, -1,
   6658                                                               offset + 4, 2, 3,
   6659                                                               offset + 6, 2, 2);
   6660 
   6661     /* IFP_DROP_SET(6b) */
   6662     offset = drop_offset;
   6663 
   6664     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpDrop,
   6665                                  0, _FieldActionDropSet, offset + 0, 2, 1);
   6666     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpDropCancel,
   6667                                  0, _FieldActionDropSet, offset + 0, 2, 2);
   6668     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpDrop,
   6669                                  0, _FieldActionDropSet, offset + 2, 2, 1);
   6670     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpDropCancel,
   6671                                  0, _FieldActionDropSet, offset + 2, 2, 2);
   6672     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpDrop,
   6673                                  0, _FieldActionDropSet, offset + 4, 2, 1);
   6674     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpDropCancel,
   6675                                  0, _FieldActionDropSet, offset + 4, 2, 2);
   6676 
   6677     /* IFP_MIRROR_OVERRIDE_SET(1b) */
   6678     offset = mirror_override_offset;
   6679 
   6680     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionMirrorOverride,
   6681                                  0, _FieldActionMirrorOverrideSet, offset + 0, 1, 1);
   6682 
   6683     /* IFP_SFLOW_SET(1b) */
   6684     offset = sflow_offset;
   6685 
   6686     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionIngSampleEnable,
   6687                                  0, _FieldActionSflowSet, offset + 0, 1, 1);
   6688 
   6689     /* IFP_INSTRUMENTATION_TRIGGERS_ENABLE_SET(1b)*/
   6690     offset = debug_offset;
   6691     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionPacketTraceEnable,
   6692                                  0, _FieldActionInstrumentationSet, offset + 0, 1, 1);
   6693 
   6694     /* IFP_REDIRECT_SET(38b) */
   6695     offset = redirect_offset;
   6696 
   6697     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirect,
   6698                                          _BCM_FIELD_ACTION_REDIRECT_DGLP,
   6699                                          _FieldActionRedirectSet,
   6700                                          offset + 6, 16, -1, offset + 22 , 1, 0,
   6701                                          offset + 3, 3, 0, offset + 0, 3, 1);
   6702     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirect,
   6703                                          _BCM_FIELD_ACTION_REDIRECT_DVP,
   6704                                          _FieldActionRedirectSet,
   6705                                          offset + 6, 14, -1,
   6706                                          offset + 3, 3, 6, offset + 0, 3, 1);
   6707     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirect,
   6708                                          _BCM_FIELD_ACTION_REDIRECT_TRUNK,
   6709                                          _FieldActionRedirectSet,
   6710                                          offset + 6, 16, -1, offset + 22, 1, 1,
   6711                                            offset + 3, 3, 0, offset + 0, 3, 1);
   6712     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirectTrunk,
   6713                                          _BCM_FIELD_ACTION_REDIRECT_TRUNK,
   6714                                          _FieldActionRedirectSet,
   6715                                          offset + 6, 16, -1, offset + 22, 1, 1,
   6716                                          offset + 3, 3, 0, offset + 0, 3, 1);
   6717     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectTrunk,
   6718                                          _BCM_FIELD_ACTION_REDIRECT_DVP,
   6719                                          _FieldActionRedirectSet,
   6720                         offset + 6, 14, -1, offset + 3, 3, 6, offset + 0, 3, 1);
   6721     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc,
   6722                                      bcmFieldActionUnmodifiedPacketRedirectPort,
   6723                                          _BCM_FIELD_ACTION_REDIRECT_DGLP,
   6724                                          _FieldActionRedirectSet,
   6725                                          offset + 6, 16, -1, offset + 22, 1, 0,
   6726                                          offset + 3, 3, 1, offset + 0, 3, 1);
   6727     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectEgrNextHop,
   6728                                          _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP,
   6729                                          _FieldActionRedirectSet,
   6730                         offset + 6, 16, -1, offset + 3, 3, 2, offset + 0, 3, 1);
   6731     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectEgrNextHop,
   6732                                          _BCM_FIELD_ACTION_REDIRECT_ECMP,
   6733                                          _FieldActionRedirectSet,
   6734                         offset + 6, 16, -1, offset + 3, 3, 3, offset + 0, 3, 1);
   6735     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRedirectCancel,
   6736                                          0, _FieldActionRedirectSet,
   6737                                          offset + 0, 3, 2);
   6738     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectPbmp, 0,
   6739                                          _FieldActionRedirectSet,
   6740                        offset + 6, 10, -1, offset + 23, 2, 0, offset + 0, 3, 3);
   6741     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectVlan, 0,
   6742                                          _FieldActionRedirectSet,
   6743                         offset + 17, 1, 0, offset + 23, 2, 1, offset + 0, 3, 3);
   6744     _FP_ACTION_WITH_ASET_ADD_FOUR(unit, stage_fc, bcmFieldActionRedirectBcastPbmp, 0,
   6745                                           _FieldActionRedirectSet,
   6746                                           offset + 6, 10, -1, offset + 17, 1, 1,
   6747                                           offset + 23, 2, 1, offset + 0, 3, 3);
   6748     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectMcast, 0,
   6749                                          _FieldActionRedirectSet,
   6750                        offset + 6, 14, -1, offset + 23, 2, 2, offset + 0, 3, 3);
   6751     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionRedirectIpmc, 0,
   6752                                          _FieldActionRedirectSet,
   6753                        offset + 6, 14, -1, offset + 23, 2, 3, offset + 0, 3, 3);
   6754     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressMask, 0,
   6755                                          _FieldActionRedirectSet,
   6756                                          offset + 6, 10, -1, offset + 0, 3, 4);
   6757     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionEgressPortsAdd, 0,
   6758                                          _FieldActionRedirectSet,
   6759                                          offset + 6, 10, -1, offset + 0, 3, 5);
   6760     _FP_ACTION_WITH_ASET_ADD_THREE(unit, stage_fc, bcmFieldActionFabricEHAddOrUpdate, 0,
   6761                                          _FieldActionRedirectSet,
   6762                       offset + 3, 32, -1, offset + 35, 3, -1, offset + 0, 3, 6);
   6763 
   6764     /* IFP_NAT_SET(12b) */
   6765     offset = nat_offset;
   6766 
   6767     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionNat,
   6768                                     0, _FieldActionNatSet, offset + 11, 1, 1);
   6769     _FP_ACTION_WITH_ASET_ADD_TWO(unit, stage_fc, bcmFieldActionNatEgressOverride,
   6770                                     0, _FieldActionNatSet,
   6771                                     offset + 0, 10, -1, offset + 10, 1, -1);
   6772     /* ExactMatch Action Class Id (12b) */
   6773     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionExactMatchClassId,
   6774                        _BCM_FIELD_ACTION_NO_IFP_SUPPORT, 0, 12, 0);
   6775 
   6776     /* TIMESTAMP_SET(4b) */
   6777     offset = timestamp_offset;
   6778     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionIngressTimeStampInsert,
   6779                                         0, _FieldActionTimestampInsertionSet,
   6780                                         offset + 0, 2, 1);
   6781     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionIngressTimeStampInsertCancel,
   6782                                         0, _FieldActionTimestampInsertionSet,
   6783                                         offset + 0, 2, 2);
   6784     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionEgressTimeStampInsert,
   6785                                         0, _FieldActionTimestampInsertionSet,
   6786                                         offset + 2, 2, 1);
   6787     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionEgressTimeStampInsertCancel,
   6788                                         0, _FieldActionTimestampInsertionSet,
   6789                                         offset + 2, 2, 2);
   6790         /* DLB_HGT_LAG_SET(2b) */
   6791     offset = dlb_hgt_lag_offset;
   6792     if (soc_feature(unit, soc_feature_lag_dlb)) {
   6793         _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicTrunkEnable,
   6794                     0, _FieldActionHgtLagDlbActionSet, offset + 0, 1, 1);
   6795         _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicTrunkCancel,
   6796                     0, _FieldActionHgtLagDlbActionSet, offset + 1, 1, 1);
   6797     }
   6798     if (soc_feature(unit, soc_feature_hg_dlb)) {
   6799         _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicHgTrunkEnable,
   6800                     0, _FieldActionHgtLagDlbActionSet, offset + 0, 1, 1);
   6801         _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicHgTrunkCancel,
   6802                     0, _FieldActionHgtLagDlbActionSet, offset + 1, 1, 1);
   6803     }
   6804 
   6805 #if defined(INCLUDE_L3)
   6806     /* PROTECTION_SWITCHING_SET(1b) */
   6807     offset = prot_switch_offset;
   6808     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRecoverableDropCancel,
   6809                           0, _FieldActionProtectionSwitchingDropOverrideSet,
   6810                           offset + 0, 1, 1);
   6811 
   6812     /* DLB_ECMP_SET(2b) */
   6813     offset = dlb_ecmp_offset;
   6814     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicEcmpEnable,
   6815                             0, _FieldActionEcmpDlbActionSet, offset + 0, 1, 1);
   6816     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDynamicEcmpCancel,
   6817                             0, _FieldActionEcmpDlbActionSet, offset + 1, 1, 1);
   6818 
   6819     /* DLB_ALTERNATE_PATH_CONTROL_SET(10b) */
   6820     offset = dlb_alternate_path_control_offset;
   6821     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDgm,
   6822                                  0, _FieldActionIfpDlbAlternatePathControlSet,
   6823                                  offset + 0, 1, 1);
   6824     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDgmThreshold,
   6825                                  0, _FieldActionIfpDlbAlternatePathControlSet,
   6826                                  offset + 7, 3, -1);
   6827     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDgmBias,
   6828                                  0, _FieldActionIfpDlbAlternatePathControlSet,
   6829                                  offset + 4, 3, -1);
   6830     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDgmCost,
   6831                                  0, _FieldActionIfpDlbAlternatePathControlSet,
   6832                                  offset + 1, 3, -1);
   6833 #endif /* INCLUDE_L3 */
   6834     /* All actions which have corresponding Colored(Gp/Yp/Rp) Actions needs to be
   6835      * initialized with some default configuration(offset = 0, width = 0, value = 0).
   6836      */
   6837     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionCosQNew, 0, 0, 0, 0);
   6838     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntCopy, 0, 0, 0, 0);
   6839     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntNew, 0, 0, 0, 0);
   6840     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntTos, 0, 0, 0, 0);
   6841     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioIntCancel, 0, 0, 0, 0);
   6842     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionUcastCosQNew, 0, 0, 0, 0);
   6843     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionMcastCosQNew, 0, 0, 0, 0);
   6844     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDropPrecedence, 0, 0, 0, 0);
   6845     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionColorIndependent,
   6846                                  0, _FieldActionGreenToPidSet, 0, 0, 0);
   6847     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionEcnNew, 0, 0, 0, 0);
   6848     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktCopy, 0, 0, 0, 0);
   6849     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktNew, 0, 0, 0, 0);
   6850     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktTos, 0, 0, 0, 0);
   6851     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktCancel, 0, 0, 0, 0);
   6852     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpNew, 0, 0, 0, 0);
   6853     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpCancel, 0, 0, 0, 0);
   6854     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionCopyToCpu,
   6855                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6856     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionCopyToCpuCancel,
   6857                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6858     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionSwitchToCpuCancel,
   6859                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6860     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionSwitchToCpuReinstate,
   6861                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6862     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionTimeStampToCpu,
   6863                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6864     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionTimeStampToCpuCancel,
   6865                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6866     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionGpTimeStampToCpuCancel,
   6867                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6868     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionYpTimeStampToCpuCancel,
   6869                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6870     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionRpTimeStampToCpuCancel,
   6871                                  0, _FieldActionCopyToCpuSet, 0, 0, 0);
   6872     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDrop,
   6873                                  0, _FieldActionDropSet, 0, 0, 0);
   6874     _FP_ACTION_WITH_ASET_ADD_ONE(unit, stage_fc, bcmFieldActionDropCancel,
   6875                                  0, _FieldActionDropSet, 0, 0, 0);
   6876     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntCopy, 0, 0, 0, 0);
   6877     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntNew, 0, 0, 0, 0);
   6878     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntTos, 0, 0, 0, 0);
   6879     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionPrioPktAndIntCancel, 0, 0, 0, 0);
   6880     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntCopy, 0, 0, 0, 0);
   6881     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntNew, 0, 0, 0, 0);
   6882     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntTos, 0, 0, 0, 0);
   6883     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionRpPrioPktAndIntCancel, 0, 0, 0, 0);
   6884     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntCopy, 0, 0, 0, 0);
   6885     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntNew, 0, 0, 0, 0);
   6886     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntTos, 0, 0, 0, 0);
   6887     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionGpPrioPktAndIntCancel, 0, 0, 0, 0);
   6888     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntCopy, 0, 0, 0, 0);
   6889     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntNew, 0, 0, 0, 0);
   6890     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntTos, 0, 0, 0, 0);
   6891     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionYpPrioPktAndIntCancel, 0, 0, 0, 0);
   6892     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionCosMapNew, 0, 0, 0, 0);
   6893     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDscpPreserve, 0, 0, 0, 0);
   6894     _FP_ACTION_ADD_ONE(unit, stage_fc, bcmFieldActionDot1pPreserve, 0, 0, 0, 0);
   6895 
   6896     return BCM_E_NONE;
   6897 }
   6898 #endif /*BCM_TOMAHAWK2_SUPPORT*/
   6899 
   6900 
   6901 /*
   6902  * Function:
   6903  *     _field_th_actionss_init
   6904  * Purpose:
   6905  *     Initialize device actions offsets, widths and encodings.
   6906  * Parameters:
   6907  *     unit       - (IN) BCM device number.
   6908  *     stage_fc   - (IN) Field Processor stage control structure.
   6909  *
   6910  * Returns:
   6911  *     BCM_E_NONE
   6912  * Notes:
   6913  */
   6914 STATIC int
   6915 _field_th_actions_init(int unit, _field_stage_t *stage_fc)
   6916 {
   6917     switch (stage_fc->stage_id) {
   6918         case _BCM_FIELD_STAGE_INGRESS:
   6919         case _BCM_FIELD_STAGE_EXACTMATCH:
   6920              /* Allocated stage qualifiers configuration array. */
   6921              _FP_XGS3_ALLOC(stage_fc->f_action_arr,
   6922                    (_bcmFieldActionCount * sizeof(_bcm_field_action_conf_t *)),
   6923                    "Field Actions");
   6924              if (NULL == stage_fc->f_action_arr) {
   6925                 LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META(
   6926                    "TH Actions INIT Memory Resource Error\n")));
   6927                 return (BCM_E_MEMORY);
   6928              }
   6929 #if defined(BCM_TRIDENT3_SUPPORT)
   6930              if(soc_feature(unit, soc_feature_ifp_action_profiling)) {
   6931                  return (_field_td3_common_actions_init(unit, stage_fc));
   6932              } else
   6933 #endif
   6934 #ifdef BCM_TOMAHAWK2_SUPPORT
   6935              if (SOC_IS_TOMAHAWK2(unit)) {
   6936                  return (_field_th2_common_actions_init(unit, stage_fc));
   6937              } else
   6938 #endif
   6939 #if defined(BCM_TOMAHAWK3_SUPPORT)
   6940             if (SOC_IS_TOMAHAWK3(unit)) {
   6941                 return _bcm_field_th3_common_actions_init(unit, stage_fc);
   6942             } else
   6943 #endif /* BCM_TOMAHAWK3_SUPPORT */
   6944             {
   6945                 return (_field_th_common_actions_init(unit, stage_fc));
   6946             }
   6947             break;
   6948         default:
   6949             break;
   6950     }
   6951 
   6952     return (BCM_E_NONE);
   6953 }
   6954 
   6955 /*
   6956  * Function:
   6957  *     _field_th_lookup_qualifiers_init
   6958  * Purpose:
   6959  *     Initialize device stage lookup qaualifiers
   6960  *     select codes & offsets
   6961  * Parameters:
   6962  *     unit       - (IN) BCM device number.
   6963  *     stage_fc   - (IN) Field Processor stage control structure.
   6964  * Returns:
   6965  *     BCM_E_NONE
   6966  */
   6967 STATIC int
   6968 _field_th_lookup_qualifiers_init(int unit, _field_stage_t *stage_fc)
   6969 {
   6970     uint32 cancun_ver;
   6971     const unsigned f1_offset = 164, f2_offset = 36, f3_offset = 0;
   6972     _FP_QUAL_DECL;
   6973 
   6974     /* Input parameters check. */
   6975     if (NULL == stage_fc) {
   6976         return (BCM_E_PARAM);
   6977     }
   6978 
   6979     /* Allocated stage qualifiers configuration array. */
   6980     _FP_XGS3_ALLOC(stage_fc->f_qual_arr,
   6981         (_bcmFieldQualifyCount * sizeof(_bcm_field_qual_info_t *)),
   6982          "Field qualifiers");
   6983     if (NULL == stage_fc->f_qual_arr) {
   6984         return (BCM_E_MEMORY);
   6985     }
   6986 
   6987     /* Enable the overlay of Sender Ethernet Address onto MACSA
   6988      * on ARP/RARP packets.
   6989      */
   6990     BCM_IF_ERROR_RETURN
   6991         (soc_reg_field32_modify(unit, ING_CONFIG_64r, REG_PORT_ANY,
   6992                                 ARP_VALIDATION_ENf, 1));
   6993 
   6994     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyStageLookup,
   6995                  _bcmFieldSliceSelDisable, 0, 0, 0);
   6996     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp4,
   6997                  _bcmFieldSliceSelDisable, 0, 0, 0);
   6998     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp6,
   6999                  _bcmFieldSliceSelDisable, 0, 0, 0);
   7000 
   7001     /* FPF1 */
   7002     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   7003                                bcmFieldQualifyInnerIpProtocolCommon,
   7004                                _bcmFieldSliceSelFpf1, 0,
   7005                                _bcmFieldSliceIpHeaderSelect, 1, f1_offset, 3);
   7006     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocolCommon,
   7007                                _bcmFieldSliceSelFpf1, 0,
   7008                                _bcmFieldSliceIpHeaderSelect, 0, f1_offset, 3);
   7009     if (!soc_feature(unit, soc_feature_td3_style_fp)) {
   7010         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTunnelTerminated,
   7011                      _bcmFieldSliceSelFpf1, 0, f1_offset + 3, 1);
   7012     }
   7013     /* 1-bit IpInfo is used to qualify on BCM_FIELD_IP_CHECKSUM_OK */
   7014     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpInfo,
   7015                  _bcmFieldSliceSelFpf1, 0, f1_offset + 4, 1);
   7016 
   7017     if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) {
   7018         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerTpid,
   7019                      _bcmFieldSliceSelFpf1, 0, f1_offset + 5, 2);
   7020     }
   7021 
   7022     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterTpid,
   7023                  _bcmFieldSliceSelFpf1, 0, f1_offset + 7, 2);
   7024     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL2Format,
   7025                  _bcmFieldSliceSelFpf1, 0, f1_offset + 9, 2);
   7026 
   7027     if (soc_feature(unit, soc_feature_higig_lookup)) {
   7028         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy,
   7029                      _bcmFieldSliceSelFpf1, 0, f1_offset + 11, 1);
   7030     }
   7031 
   7032     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig,
   7033                  _bcmFieldSliceSelFpf1, 0, f1_offset + 12, 1);
   7034     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlan,
   7035                  _bcmFieldSliceSelFpf1, 0, f1_offset + 13, 16);
   7036     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanId,
   7037                  _bcmFieldSliceSelFpf1, 0, f1_offset + 13, 12);
   7038     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanCfi,
   7039                  _bcmFieldSliceSelFpf1, 0, f1_offset + 25, 1);
   7040     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanPri,
   7041                  _bcmFieldSliceSelFpf1, 0, f1_offset + 26, 3);
   7042     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanFormat,
   7043                  _bcmFieldSliceSelFpf1, 0, f1_offset + 29, 2);
   7044     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpType,
   7045                                _bcmFieldSliceSelFpf1, 0,
   7046                                _bcmFieldSliceIpHeaderSelect, 1, f1_offset + 31,
   7047                                5);
   7048     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpType,
   7049                                _bcmFieldSliceSelFpf1, 0,
   7050                                _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 31,
   7051                                5);
   7052     _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcPort,
   7053                      _bcmFieldDevSelDisable, 0,
   7054                      _bcmFieldSliceSelFpf1, 0,
   7055                      _bcmFieldSliceSrcEntitySelect, _bcmFieldFwdEntityGlp,
   7056                      0,
   7057                      f1_offset + 36, 8, /* Port value in SGLP */
   7058                      f1_offset + 44, 8, /* Module value in SGLP */
   7059                      f1_offset + 52, 1, /* Trunk bit in SGLP (should be 0) */
   7060                      0
   7061                      );
   7062 
   7063     _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcTrunk,
   7064                      _bcmFieldDevSelDisable, 0,
   7065                      _bcmFieldSliceSelFpf1, 0,
   7066                      _bcmFieldSliceSrcEntitySelect, _bcmFieldFwdEntityGlp,
   7067                      0,
   7068                      f1_offset + 36, 16, /* trunk id field of SGLP */
   7069                      f1_offset + 52, 1,  /* trunk bit of SGLP */
   7070                      0, 0,
   7071                      0
   7072                      );
   7073 
   7074     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   7075 
   7076         _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcMplsGport,
   7077                          _bcmFieldDevSelDisable, 0,
   7078                          _bcmFieldSliceSelFpf1, 0,
   7079                          _bcmFieldSliceSrcEntitySelect, _bcmFieldFwdEntityMplsGport,
   7080                          0,
   7081                          f1_offset + 36, 17, /* S_FIELD */
   7082                          f1_offset + 56, 1,  /* SVP_VALID */
   7083                          0, 0,
   7084                          0
   7085                          );
   7086 
   7087         _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcMimGport,
   7088                          _bcmFieldDevSelDisable, 0,
   7089                          _bcmFieldSliceSelFpf1, 0,
   7090                          _bcmFieldSliceSrcEntitySelect, _bcmFieldFwdEntityMimGport,
   7091                          0,
   7092                          f1_offset + 36, 17, /* S_FIELD */
   7093                          f1_offset + 56, 1,  /* SVP_VALID */
   7094                          0, 0,
   7095                          0
   7096                          );
   7097 
   7098          _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcVxlanGport,
   7099                           _bcmFieldDevSelDisable, 0,
   7100                           _bcmFieldSliceSelFpf1, 0,
   7101                           _bcmFieldSliceSrcEntitySelect,
   7102                           _bcmFieldFwdEntityVxlanGport,
   7103                           0,
   7104                           f1_offset + 36, 17, /* S_FIELD */
   7105                           f1_offset + 56, 1,  /* SVP_VALID */
   7106                           0, 0,
   7107                           0
   7108                           );
   7109     }
   7110 
   7111     _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcModPortGport,
   7112                      _bcmFieldDevSelDisable, 0,
   7113                      _bcmFieldSliceSelFpf1, 0,
   7114                      _bcmFieldSliceSrcEntitySelect,
   7115                      _bcmFieldFwdEntityModPortGport,
   7116                      0,
   7117                      f1_offset + 36, 16, /* mod + port field of unresolved SGLP */
   7118                      0, 0,
   7119                      0, 0,
   7120                      0
   7121                      );
   7122 
   7123     _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport,
   7124                      _bcmFieldDevSelDisable, 0,
   7125                      _bcmFieldSliceSelFpf1, 0,
   7126                      _bcmFieldSliceSrcEntitySelect,
   7127                      _bcmFieldFwdEntityModPortGport,
   7128                      0,
   7129                      f1_offset + 36 + 8, 8, /* mod field of unresolved SGLP */
   7130                      0, 0,
   7131                      0, 0,
   7132                      0
   7133                      );
   7134 
   7135     _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyInPort,
   7136                      _bcmFieldDevSelDisable, 0,
   7137                      _bcmFieldSliceSelFpf1, 0,
   7138                      _bcmFieldSliceSrcEntitySelect,
   7139                      _bcmFieldFwdEntityPortGroupNum,
   7140                      0,
   7141                      f1_offset + 36, 8, /* ingress port field */
   7142                      0, 0,
   7143                      0, 0,
   7144                      0
   7145                      );
   7146 
   7147     _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort,
   7148                      _bcmFieldDevSelDisable, 0,
   7149                      _bcmFieldSliceSelFpf1, 0,
   7150                      _bcmFieldSliceSrcEntitySelect,
   7151                      _bcmFieldFwdEntityPortGroupNum,
   7152                      0,
   7153                      f1_offset + 36 + 8, 8, /* ingress port group field */
   7154                      0, 0,
   7155                      0, 0,
   7156                      0
   7157                      );
   7158 
   7159     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports,
   7160                  _bcmFieldSliceSelFpf1, 0, f1_offset + 57, 1);
   7161 
   7162 #if defined (BCM_TOMAHAWK3_SUPPORT)
   7163     if (soc_feature(unit, soc_feature_th3_style_fp)) {
   7164         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOpaqueTagType,
   7165                      _bcmFieldSliceSelFpf1, 0, f1_offset + 58, 2);
   7166     }
   7167 #endif
   7168 
   7169     /* F2_0 */
   7170     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTtl,
   7171                                _bcmFieldSliceSelFpf2, 0,
   7172                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 8);
   7173     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTtl,
   7174                                _bcmFieldSliceSelFpf2, 0,
   7175                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 8);
   7176     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTcpControl,
   7177                  _bcmFieldSliceSelFpf2, 0, f2_offset + 8, 6);
   7178     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpFrag,
   7179                                _bcmFieldSliceSelFpf2, 0,
   7180                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 14,
   7181                                2);
   7182     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpFrag,
   7183                                _bcmFieldSliceSelFpf2, 0,
   7184                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 14,
   7185                                2);
   7186     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTos,
   7187                                _bcmFieldSliceSelFpf2, 0,
   7188                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 16,
   7189                                8);
   7190     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTos,
   7191                                _bcmFieldSliceSelFpf2, 0,
   7192                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 16,
   7193                                8);
   7194     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerL4DstPort,
   7195                                _bcmFieldSliceSelFpf2, 0,
   7196                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 24,
   7197                                16);
   7198     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort,
   7199                                _bcmFieldSliceSelFpf2, 0,
   7200                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 24,
   7201                                16);
   7202     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerL4SrcPort,
   7203                                _bcmFieldSliceSelFpf2, 0,
   7204                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 40,
   7205                                16);
   7206     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort,
   7207                                _bcmFieldSliceSelFpf2, 0,
   7208                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 40,
   7209                                16);
   7210     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode,
   7211                                _bcmFieldSliceSelFpf2, 0,
   7212                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 40,
   7213                                16);
   7214     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol,
   7215                                _bcmFieldSliceSelFpf2, 0,
   7216                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 56,
   7217                                8);
   7218     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol,
   7219                                _bcmFieldSliceSelFpf2, 0,
   7220                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 56,
   7221                                8);
   7222     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp,
   7223                                _bcmFieldSliceSelFpf2, 0,
   7224                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 64,
   7225                                32);
   7226     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp,
   7227                                _bcmFieldSliceSelFpf2, 0,
   7228                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 64,
   7229                                32);
   7230     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp,
   7231                                _bcmFieldSliceSelFpf2, 0,
   7232                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 96,
   7233                                32);
   7234     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp,
   7235                                _bcmFieldSliceSelFpf2, 0,
   7236                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 96,
   7237                                32);
   7238 
   7239     /* F2_1 */
   7240     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp6,
   7241                                _bcmFieldSliceSelFpf2, 1,
   7242                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 128);
   7243     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp6,
   7244                                _bcmFieldSliceSelFpf2, 1,
   7245                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 128);
   7246 
   7247     /* F2_2 */
   7248     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp6,
   7249                                _bcmFieldSliceSelFpf2, 2,
   7250                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 128);
   7251     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6,
   7252                                _bcmFieldSliceSelFpf2, 2,
   7253                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 128);
   7254 
   7255     /* F2_3 */
   7256     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType,
   7257                  _bcmFieldSliceSelFpf2, 3, f2_offset + 16, 16);
   7258     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcMac,
   7259                  _bcmFieldSliceSelFpf2, 3, f2_offset + 32, 48);
   7260     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstMac,
   7261                  _bcmFieldSliceSelFpf2, 3, f2_offset + 80, 48);
   7262 
   7263     /* F2_4 */
   7264     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTos,
   7265                                _bcmFieldSliceSelFpf2, 4,
   7266                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 8);
   7267     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTos,
   7268                                _bcmFieldSliceSelFpf2, 4,
   7269                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 8);
   7270     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol,
   7271                                _bcmFieldSliceSelFpf2, 4,
   7272                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 8,
   7273                                8);
   7274     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol,
   7275                                _bcmFieldSliceSelFpf2, 4,
   7276                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 8,
   7277                                8);
   7278     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp,
   7279                                _bcmFieldSliceSelFpf2, 4,
   7280                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 16,
   7281                                32);
   7282     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp,
   7283                                _bcmFieldSliceSelFpf2, 4,
   7284                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 16,
   7285                                32);
   7286     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp,
   7287                                _bcmFieldSliceSelFpf2, 4,
   7288                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 48,
   7289                                32);
   7290     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp,
   7291                                _bcmFieldSliceSelFpf2, 4,
   7292                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 48,
   7293                                32);
   7294     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcMac,
   7295                  _bcmFieldSliceSelFpf2, 4, f2_offset + 80, 48);
   7296 
   7297     /* F2_5 */
   7298     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTos,
   7299                                _bcmFieldSliceSelFpf2, 5,
   7300                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 8);
   7301     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTos,
   7302                                _bcmFieldSliceSelFpf2, 5,
   7303                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 8);
   7304     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol,
   7305                                _bcmFieldSliceSelFpf2, 5,
   7306                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 8,
   7307                                8);
   7308     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol,
   7309                                _bcmFieldSliceSelFpf2, 5,
   7310                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 8,
   7311                                8);
   7312     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp,
   7313                                _bcmFieldSliceSelFpf2, 5,
   7314                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 16,
   7315                                32);
   7316     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp,
   7317                                _bcmFieldSliceSelFpf2, 5,
   7318                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 16,
   7319                                32);
   7320     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp,
   7321                                _bcmFieldSliceSelFpf2, 5,
   7322                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 48,
   7323                                32);
   7324     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp,
   7325                                _bcmFieldSliceSelFpf2, 5,
   7326                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 48,
   7327                                32);
   7328     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstMac,
   7329                  _bcmFieldSliceSelFpf2, 5, f2_offset + 80, 48);
   7330 
   7331     /* F2_6 */
   7332     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp6High,
   7333                                _bcmFieldSliceSelFpf2, 6,
   7334                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset, 64);
   7335     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp6High,
   7336                                _bcmFieldSliceSelFpf2, 6,
   7337                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset, 64);
   7338     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp6High,
   7339                                _bcmFieldSliceSelFpf2, 6,
   7340                                _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 64,
   7341                                64);
   7342     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6High,
   7343                                _bcmFieldSliceSelFpf2, 6,
   7344                                _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 64,
   7345                                64);
   7346 
   7347     /* F2_7 */
   7348 
   7349     if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) {
   7350         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVnTag,
   7351                      _bcmFieldSliceSelFpf2, 7, f2_offset + 0, 33);
   7352     }
   7353     if (soc_feature(unit, soc_feature_niv)) {
   7354         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVnTag,
   7355                      _bcmFieldSliceSelFpf2, 7, f2_offset + 0, 33);
   7356     }
   7357     if (soc_feature(unit, soc_feature_snap)) {
   7358         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySnap,
   7359                      _bcmFieldSliceSelFpf2, 7, f2_offset + 64, 40);
   7360     }
   7361     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLlc,
   7362                  _bcmFieldSliceSelFpf2, 7, f2_offset + 104, 24);
   7363 
   7364     /* F2_8 */
   7365     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   7366        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData0,
   7367                     _bcmFieldSliceSelFpf2, 8, f2_offset + 0, 16);
   7368        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData1,
   7369                     _bcmFieldSliceSelFpf2, 8, f2_offset + 16, 16);
   7370        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData2,
   7371                     _bcmFieldSliceSelFpf2, 8, f2_offset + 32, 16);
   7372        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData3,
   7373                     _bcmFieldSliceSelFpf2, 8, f2_offset + 48, 16);
   7374        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData4,
   7375                     _bcmFieldSliceSelFpf2, 8, f2_offset + 64, 16);
   7376        /* IP header Identifier field is mapped to UDF Chunk 4. */ 
   7377        BCM_IF_ERROR_RETURN(soc_cancun_version_get(unit, &cancun_ver));
   7378        if (SOC_CANCUN_VERSION_5_2_UNDER_SERIES(cancun_ver)) {
   7379            _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpIdentifier,
   7380                       _bcmFieldSliceSelFpf2, 8, f2_offset + 64, 16);
   7381        }
   7382        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData5,
   7383                     _bcmFieldSliceSelFpf2, 8, f2_offset + 80, 16);
   7384        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData6,
   7385                     _bcmFieldSliceSelFpf2, 8, f2_offset + 96, 16);
   7386        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData7,
   7387                     _bcmFieldSliceSelFpf2, 8, f2_offset + 112, 16);
   7388        /* UDF2 Chunk 6 and 7 */
   7389        _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyINTProbeMarker1,
   7390                     _bcmFieldSliceSelFpf2, 9, f2_offset + 96, 32);
   7391        /* UDF2 Chunk 4 and 5 */
   7392        _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyINTProbeMarker2,
   7393                     _bcmFieldSliceSelFpf2, 9, f2_offset + 64, 32);
   7394        /* UDF2 Chunk 2 and 3 */
   7395        _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyINTReserved4Bytes,
   7396                     _bcmFieldSliceSelFpf2, 8, f2_offset + 32, 32);
   7397 #if defined(BCM_TOMAHAWK3_SUPPORT)
   7398     } else if (soc_feature(unit, soc_feature_udf_selector_support)) {
   7399        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData7,
   7400                     _bcmFieldSliceSelFpf2, 8, f2_offset + 0, 16);
   7401        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData6,
   7402                     _bcmFieldSliceSelFpf2, 8, f2_offset + 16, 16);
   7403        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData5,
   7404                     _bcmFieldSliceSelFpf2, 8, f2_offset + 32, 16);
   7405        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData4,
   7406                     _bcmFieldSliceSelFpf2, 8, f2_offset + 48, 16);
   7407        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData3,
   7408                     _bcmFieldSliceSelFpf2, 8, f2_offset + 64, 16);
   7409        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData2,
   7410                     _bcmFieldSliceSelFpf2, 8, f2_offset + 80, 16);
   7411        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData1,
   7412                     _bcmFieldSliceSelFpf2, 8, f2_offset + 96, 16);
   7413        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData0,
   7414                     _bcmFieldSliceSelFpf2, 8, f2_offset + 112, 16);
   7415 #endif
   7416     } else {
   7417        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData4,
   7418                     _bcmFieldSliceSelFpf2, 8, f2_offset + 0, 32);
   7419        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData3,
   7420                     _bcmFieldSliceSelFpf2, 8, f2_offset + 32, 32);
   7421        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData2,
   7422                     _bcmFieldSliceSelFpf2, 8, f2_offset + 64, 32);
   7423        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData1,
   7424                     _bcmFieldSliceSelFpf2, 8, f2_offset + 96, 16);
   7425        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData0,
   7426                     _bcmFieldSliceSelFpf2, 8, f2_offset + 112, 16);
   7427     }
   7428 
   7429     /* F2_9 */
   7430     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   7431        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData8,
   7432                     _bcmFieldSliceSelFpf2, 9, f2_offset + 0, 16);
   7433        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData9,
   7434                     _bcmFieldSliceSelFpf2, 9, f2_offset + 16, 16);
   7435        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData10,
   7436                     _bcmFieldSliceSelFpf2, 9, f2_offset + 32, 16);
   7437        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData11,
   7438                     _bcmFieldSliceSelFpf2, 9, f2_offset + 48, 16);
   7439        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData12,
   7440                     _bcmFieldSliceSelFpf2, 9, f2_offset + 64, 16);
   7441        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData13,
   7442                     _bcmFieldSliceSelFpf2, 9, f2_offset + 80, 16);
   7443        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData14,
   7444                     _bcmFieldSliceSelFpf2, 9, f2_offset + 96, 16);
   7445        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData15,
   7446                     _bcmFieldSliceSelFpf2, 9, f2_offset + 112, 16);
   7447 #if defined(BCM_TOMAHAWK3_SUPPORT)
   7448     } else if (soc_feature(unit, soc_feature_udf_selector_support)) {
   7449        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData15,
   7450                     _bcmFieldSliceSelFpf2, 9, f2_offset + 0, 16);
   7451        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData14,
   7452                     _bcmFieldSliceSelFpf2, 9, f2_offset + 16, 16);
   7453        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData13,
   7454                     _bcmFieldSliceSelFpf2, 9, f2_offset + 32, 16);
   7455        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData12,
   7456                     _bcmFieldSliceSelFpf2, 9, f2_offset + 48, 16);
   7457        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData11,
   7458                     _bcmFieldSliceSelFpf2, 9, f2_offset + 64, 16);
   7459        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData10,
   7460                     _bcmFieldSliceSelFpf2, 9, f2_offset + 80, 16);
   7461        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData9,
   7462                     _bcmFieldSliceSelFpf2, 9, f2_offset + 96, 16);
   7463        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData8,
   7464                     _bcmFieldSliceSelFpf2, 9, f2_offset + 112, 16);
   7465 #endif
   7466     } else {
   7467        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData9,
   7468                     _bcmFieldSliceSelFpf2, 9, f2_offset, 32);
   7469        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData8,
   7470                     _bcmFieldSliceSelFpf2, 9, f2_offset + 32, 32);
   7471        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData7,
   7472                     _bcmFieldSliceSelFpf2, 9, f2_offset + 64, 32);
   7473        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData6,
   7474                     _bcmFieldSliceSelFpf2, 9, f2_offset + 96, 16);
   7475        _FP_QUAL_ADD(unit, stage_fc, _bcmFieldQualifyData5,
   7476                     _bcmFieldSliceSelFpf2, 9, f2_offset + 112, 16);
   7477     }
   7478 
   7479     /* F2_10 */
   7480 
   7481     if (soc_feature(unit, soc_feature_fcoe)) {
   7482 
   7483         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanInner,
   7484                      _bcmFieldSliceSelFpf2, 10, f2_offset + 0, 3);
   7485         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanOuter,
   7486                      _bcmFieldSliceSelFpf2, 10, f2_offset + 3, 3);
   7487         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFcoeSOF,
   7488                      _bcmFieldSliceSelFpf2, 10, f2_offset + 6, 8);
   7489         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanDFCtl,
   7490                      _bcmFieldSliceSelFpf2, 10, f2_offset + 14, 8);
   7491         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanCSCtl,
   7492                      _bcmFieldSliceSelFpf2, 10, f2_offset + 22, 8);
   7493         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanFCtl,
   7494                      _bcmFieldSliceSelFpf2, 10, f2_offset + 30, 24);
   7495         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanType,
   7496                      _bcmFieldSliceSelFpf2, 10, f2_offset + 54, 8);
   7497         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanDstId,
   7498                      _bcmFieldSliceSelFpf2, 10, f2_offset + 62, 24);
   7499         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanSrcId,
   7500                      _bcmFieldSliceSelFpf2, 10, f2_offset + 86, 24);
   7501         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanRCtl,
   7502                      _bcmFieldSliceSelFpf2, 10, f2_offset + 110, 8);
   7503     }
   7504     /* F3_0 */
   7505 
   7506     if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) {
   7507         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan,
   7508                      _bcmFieldSliceSelFpf3, 0, f3_offset + 0, 16);
   7509         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId,
   7510                      _bcmFieldSliceSelFpf3, 0, f3_offset + 0, 12);
   7511         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi,
   7512                      _bcmFieldSliceSelFpf3, 0, f3_offset + 12, 1);
   7513         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri,
   7514                      _bcmFieldSliceSelFpf3, 0, f3_offset + 13, 3);
   7515     }
   7516 
   7517 #if defined (BCM_TOMAHAWK3_SUPPORT)
   7518     if (SOC_IS_TOMAHAWK3(unit)) {
   7519         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType,
   7520                  _bcmFieldSliceSelFpf3, 0, f3_offset + 0, 16);
   7521     } else
   7522 #endif
   7523     {
   7524         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType,
   7525                  _bcmFieldSliceSelFpf3, 0, f3_offset + 16, 16);
   7526     }
   7527 
   7528     /* F3_1 */
   7529     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerL4DstPort,
   7530                                _bcmFieldSliceSelFpf3, 1,
   7531                                _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 0,
   7532                                16);
   7533     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort,
   7534                                _bcmFieldSliceSelFpf3, 1,
   7535                                _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 0,
   7536                                16);
   7537     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerL4SrcPort,
   7538                                _bcmFieldSliceSelFpf3, 1,
   7539                                _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 16,
   7540                                16);
   7541     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort,
   7542                                _bcmFieldSliceSelFpf3, 1,
   7543                                _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 16,
   7544                                16);
   7545     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode,
   7546                                _bcmFieldSliceSelFpf3, 1,
   7547                                _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 16,
   7548                                16);
   7549 
   7550     /* F3_2 */
   7551     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerTos,
   7552                                _bcmFieldSliceSelFpf3, 2,
   7553                                _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 0,
   7554                                8);
   7555     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyTos,
   7556                                _bcmFieldSliceSelFpf3, 2,
   7557                                _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 0,
   7558                                8);
   7559     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol,
   7560                                _bcmFieldSliceSelFpf3, 2,
   7561                                _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 8,
   7562                                8);
   7563     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol,
   7564                                _bcmFieldSliceSelFpf3, 2,
   7565                                _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 8,
   7566                                8);
   7567     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderSubCode,
   7568                  _bcmFieldSliceSelFpf3, 2, f3_offset + 16, 8);
   7569     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderType,
   7570                  _bcmFieldSliceSelFpf3, 2, f3_offset + 24, 8);
   7571 
   7572 
   7573     /* F3_3 */
   7574 #ifdef BCM_TRIDENT3_SUPPORT
   7575     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   7576         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan,
   7577                 _bcmFieldSliceSelFpf3, 3, f3_offset, 16);
   7578         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId,
   7579                 _bcmFieldSliceSelFpf3, 3, f3_offset, 12);
   7580         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi,
   7581                 _bcmFieldSliceSelFpf3, 3, f3_offset + 12, 1);
   7582         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri,
   7583                 _bcmFieldSliceSelFpf3, 3, f3_offset + 13, 3);
   7584         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport,
   7585                 _bcmFieldSliceSelFpf3, 3, f3_offset + 16, 8);
   7586     } else
   7587 #endif
   7588 #ifdef BCM_TOMAHAWK2_SUPPORT
   7589     if (SOC_IS_TOMAHAWK2(unit)) {
   7590         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   7591                      _bcmFieldSliceSelFpf3, 3, f3_offset + 0, 12);
   7592         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan,
   7593                      _bcmFieldSliceSelFpf3, 3, f3_offset + 12, 16);
   7594         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId,
   7595                      _bcmFieldSliceSelFpf3, 3, f3_offset + 12, 12);
   7596         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi,
   7597                      _bcmFieldSliceSelFpf3, 3, f3_offset + 24, 1);
   7598         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri,
   7599                      _bcmFieldSliceSelFpf3, 3, f3_offset + 25, 3);
   7600         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport,
   7601                      _bcmFieldSliceSelFpf3, 3, f3_offset + 28, 8);
   7602     } else
   7603 #endif /*BCM_TOMAHAWK2_SUPPORT*/
   7604 #ifdef BCM_TOMAHAWK3_SUPPORT
   7605     if (SOC_IS_TOMAHAWK3(unit)) {
   7606         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   7607                      _bcmFieldSliceSelFpf3, 3, f3_offset + 0, 12);
   7608         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport,
   7609                      _bcmFieldSliceSelFpf3, 3, f3_offset + 28, 8);
   7610     } else
   7611 #endif /*BCM_TOMAHAWK3_SUPPORT*/
   7612     {
   7613         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   7614                      _bcmFieldSliceSelFpf3, 3, f3_offset + 0, 8);
   7615         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan,
   7616                      _bcmFieldSliceSelFpf3, 3, f3_offset + 8, 16);
   7617         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId,
   7618                      _bcmFieldSliceSelFpf3, 3, f3_offset + 8, 12);
   7619         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi,
   7620                      _bcmFieldSliceSelFpf3, 3, f3_offset + 20, 1);
   7621         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri,
   7622                      _bcmFieldSliceSelFpf3, 3, f3_offset + 21, 3);
   7623         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcModuleGport,
   7624                      _bcmFieldSliceSelFpf3, 3, f3_offset + 24, 8);
   7625     }
   7626 
   7627     /* F3_4 ? */
   7628 
   7629     /* F3_5 */
   7630     if (soc_feature(unit, soc_feature_fcoe)) {
   7631         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanVFTHopCount,
   7632                      _bcmFieldSliceSelFpf3, 5, f3_offset, 8);
   7633         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanVFTVsanId,
   7634                      _bcmFieldSliceSelFpf3, 5, f3_offset + 8, 12);
   7635         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanVFTVsanPri,
   7636                      _bcmFieldSliceSelFpf3, 5, f3_offset + 20, 3);
   7637         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFibreChanVFTVersion,
   7638                      _bcmFieldSliceSelFpf3, 5, f3_offset + 23, 2);
   7639     }
   7640 
   7641     /* DWF3 */
   7642     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerTos,
   7643                             _bcmFieldSliceSelFpf3, 0,
   7644                             _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 0, 8);
   7645     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTos,
   7646                             _bcmFieldSliceSelFpf3, 0,
   7647                             _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 0, 8);
   7648     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerTtl,
   7649                             _bcmFieldSliceSelFpf3, 0,
   7650                             _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 8, 8);
   7651     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTtl,
   7652                             _bcmFieldSliceSelFpf3, 0,
   7653                             _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 8, 8);
   7654     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTcpControl,
   7655                             _bcmFieldSliceSelFpf3, 0,
   7656                             _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 16,
   7657                             6);
   7658     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerIpFrag,
   7659                             _bcmFieldSliceSelFpf3, 0,
   7660                             _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 22,
   7661                             2);
   7662     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIpFrag,
   7663                             _bcmFieldSliceSelFpf3, 0,
   7664                             _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 22,
   7665                             2);
   7666     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol,
   7667                             _bcmFieldSliceSelFpf3, 0,
   7668                             _bcmFieldSliceIpHeaderSelect, 1, f3_offset + 24,
   7669                             8);
   7670     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol,
   7671                             _bcmFieldSliceSelFpf3, 0,
   7672                             _bcmFieldSliceIpHeaderSelect, 0, f3_offset + 24,
   7673                             8);
   7674 
   7675     /* DWF2_0 */
   7676     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerTtl,
   7677                             _bcmFieldSliceSelFpf2, 0,
   7678                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 0,
   7679                             8);
   7680     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTtl,
   7681                             _bcmFieldSliceSelFpf2, 0,
   7682                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 0,
   7683                             8);
   7684     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTcpControl,
   7685                             _bcmFieldSliceSelFpf2, 0,
   7686                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 8,
   7687                             6);
   7688     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerIpFrag,
   7689                             _bcmFieldSliceSelFpf2, 0,
   7690                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 14,
   7691                             2);
   7692     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIpFrag,
   7693                             _bcmFieldSliceSelFpf2, 0,
   7694                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 14,
   7695                             2);
   7696     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerTos,
   7697                             _bcmFieldSliceSelFpf2, 0,
   7698                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 16,
   7699                             8);
   7700     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyTos,
   7701                             _bcmFieldSliceSelFpf2, 0,
   7702                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 16,
   7703                             8);
   7704     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerL4DstPort,
   7705                             _bcmFieldSliceSelFpf2, 0,
   7706                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 24,
   7707                             16);
   7708     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort,
   7709                             _bcmFieldSliceSelFpf2, 0,
   7710                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 24,
   7711                             16);
   7712     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerL4SrcPort,
   7713                             _bcmFieldSliceSelFpf2, 0,
   7714                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 40,
   7715                             16);
   7716     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort,
   7717                             _bcmFieldSliceSelFpf2, 0,
   7718                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 40,
   7719                             16);
   7720     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode,
   7721                             _bcmFieldSliceSelFpf2, 0,
   7722                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 40,
   7723                             16);
   7724     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerIpProtocol,
   7725                             _bcmFieldSliceSelFpf2, 0,
   7726                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 56,
   7727                             8);
   7728     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol,
   7729                             _bcmFieldSliceSelFpf2, 0,
   7730                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 56,
   7731                             8);
   7732     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp,
   7733                             _bcmFieldSliceSelFpf2, 0,
   7734                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 64,
   7735                             32);
   7736     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyDstIp,
   7737                             _bcmFieldSliceSelFpf2, 0,
   7738                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 64,
   7739                             32);
   7740     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp,
   7741                             _bcmFieldSliceSelFpf2, 0,
   7742                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 96,
   7743                             32);
   7744     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifySrcIp,
   7745                             _bcmFieldSliceSelFpf2, 0,
   7746                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 96,
   7747                             32);
   7748 
   7749     /* DWF2_1 */
   7750     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerSrcIp6,
   7751                             _bcmFieldSliceSelFpf2, 1,
   7752                             _bcmFieldSliceIpHeaderSelect, 1, f2_offset,
   7753                             128);
   7754     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifySrcIp6,
   7755                             _bcmFieldSliceSelFpf2, 1,
   7756                             _bcmFieldSliceIpHeaderSelect, 0, f2_offset,
   7757                             128);
   7758 
   7759     if (!soc_feature(unit, soc_feature_td3_style_fp)) {
   7760        /* DWF2_2 */
   7761        _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, _bcmFieldQualifyData1,
   7762                             _bcmFieldSliceSelFpf2, 2,
   7763                             _bcmFieldSliceSelDisable, 0,
   7764                             f2_offset, 128);
   7765     }
   7766 
   7767 #if defined (BCM_TOMAHAWK3_SUPPORT)
   7768     if (SOC_IS_TOMAHAWK3(unit)) {
   7769         /* DWF2_3 */
   7770         _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInnerDstIp6High,
   7771                                 _bcmFieldSliceSelFpf2, 3,
   7772                                 _bcmFieldSliceIpHeaderSelect, 1, f2_offset + 64,
   7773                                 64);
   7774         _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyDstIp6High,
   7775                                 _bcmFieldSliceSelFpf2, 3,
   7776                                 _bcmFieldSliceIpHeaderSelect, 0, f2_offset + 64,
   7777                                 64);
   7778         _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyDstMac,
   7779                                 _bcmFieldSliceSelFpf2, 3,
   7780                                 _bcmFieldSliceSelDisable, 0,
   7781                                 f2_offset, 48);
   7782     }
   7783 #endif
   7784 
   7785     /* DWF1 */
   7786     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc,
   7787                             bcmFieldQualifyExtensionHeaderSubCode,
   7788                             _bcmFieldSliceSelFpf1, 0,
   7789                             _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 0,
   7790                             8);
   7791     _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderType,
   7792                             _bcmFieldSliceSelFpf1, 0,
   7793                             _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 8,
   7794                             8);
   7795 #if defined (BCM_TOMAHAWK3_SUPPORT)
   7796    if (soc_feature(unit, soc_feature_th3_style_fp)) {
   7797        _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   7798                                 _bcmFieldSliceSelFpf1, 0,
   7799                                 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 16,
   7800                                 12);
   7801         _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyEtherType,
   7802                                 _bcmFieldSliceSelFpf1, 0,
   7803                                 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 28,
   7804                                 16);
   7805    } else
   7806 #endif
   7807 #if defined (BCM_TRIDENT3_SUPPORT)
   7808     if (soc_feature(unit, soc_feature_td3_style_fp)) {
   7809         _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyEtherType,
   7810                                 _bcmFieldSliceSelFpf1, 0,
   7811                                 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 16,
   7812                                 16);
   7813     } else
   7814 #endif
   7815     {
   7816         _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   7817                                 _bcmFieldSliceSelFpf1, 0,
   7818                                 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 16,
   7819                                 8);
   7820         _FP_QUAL_INTRASLICE_ADD(unit, stage_fc, bcmFieldQualifyEtherType,
   7821                                 _bcmFieldSliceSelFpf1, 0,
   7822                                 _bcmFieldSliceIpHeaderSelect, 0, f1_offset + 24,
   7823                                 16);
   7824     }
   7825 
   7826     return (BCM_E_NONE);
   7827 }
   7828 
   7829 /*
   7830  * Function:
   7831  *     _field_th_egress_qualifiers_init
   7832  * Purpose:
   7833  *     Initialize device stage egress qaualifiers
   7834  *     select codes & offsets
   7835  * Parameters:
   7836  *     unit       - (IN) BCM device number.
   7837  *     stage_fc   - (IN) Field Processor stage control structure.
   7838  *
   7839  * Returns:
   7840  *     BCM_E_NONE
   7841  */
   7842 STATIC int
   7843 _field_th_egress_qualifiers_init(int unit, _field_stage_t *stage_fc)
   7844 {
   7845     _FP_QUAL_DECL;
   7846     _key_fld_ = KEYf;
   7847 
   7848     /* Input parameters check. */
   7849     if (NULL == stage_fc) {
   7850         return (BCM_E_PARAM);
   7851     }
   7852 
   7853     /* Allocated stage qualifiers configuration array. */
   7854     _FP_XGS3_ALLOC(stage_fc->f_qual_arr,
   7855         (_bcmFieldQualifyCount * sizeof(_bcm_field_qual_info_t *)),
   7856          "Field qualifiers");
   7857     if (NULL == stage_fc->f_qual_arr) {
   7858         return (BCM_E_MEMORY);
   7859     }
   7860 
   7861     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyStageEgress,
   7862                  _bcmFieldSliceSelDisable, 0, 0, 0);
   7863 
   7864    /* EFP_KEY4(L2 Key) Qualifiers */
   7865     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports,
   7866                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 0, 1);
   7867 
   7868 
   7869     if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   7870         /* EG_NEXT_HOP_CLASS_ID */
   7871         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   7872                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7873                                    _bcmFieldSliceSelEgrClassKey4, 1,
   7874                                    2, 12);
   7875         /* EG_L3_INTF_CLASS_ID */
   7876         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   7877                                    bcmFieldQualifyEgressClassL3Interface,
   7878                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7879                                    _bcmFieldSliceSelEgrClassKey4, 2,
   7880                                    2, 12);
   7881     }
   7882 
   7883     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   7884         /* EG_NEXT_HOP_CLASS_ID */
   7885         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   7886                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7887                                    _bcmFieldSliceSelEgrDvpKey4, 1,
   7888                                    2, 12);
   7889         /* EG_L3_INTF_CLASS_ID */
   7890         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   7891                                    bcmFieldQualifyEgressClassL3Interface,
   7892                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7893                                    _bcmFieldSliceSelEgrDvpKey4, 2,
   7894                                    2, 12);
   7895         /* EG_DVP_CLASS_ID */
   7896         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill,
   7897                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7898                                    _bcmFieldSliceSelEgrDvpKey4, 3,
   7899                                    2, 12);
   7900         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassWlan,
   7901                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7902                                    _bcmFieldSliceSelEgrDvpKey4, 3,
   7903                                    2, 12);
   7904         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre,
   7905                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7906                                    _bcmFieldSliceSelEgrDvpKey4, 3,
   7907                                    2, 12);
   7908         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan,
   7909                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7910                                    _bcmFieldSliceSelEgrDvpKey4, 3,
   7911                                    2, 12);
   7912 
   7913         /* DVP_VALID + DVP + SPARE_DVP */
   7914         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMplsGport,
   7915                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7916                                    _bcmFieldSliceSelEgrDvpKey4, 0,
   7917                                    1, 17);
   7918         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMimGport,
   7919                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7920                                    _bcmFieldSliceSelEgrDvpKey4, 0,
   7921                                    1, 17);
   7922         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstVxlanGport,
   7923                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7924                                    _bcmFieldSliceSelEgrDvpKey4, 0,
   7925                                    1, 17);
   7926         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   7927                                    bcmFieldQualifyDestVirtualPortValid,
   7928                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7929                                    _bcmFieldSliceSelEgrDvpKey4, 0,
   7930                                    1, 1);
   7931     }
   7932 
   7933     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority,
   7934                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 18, 4);
   7935     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor,
   7936                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 22, 2);
   7937     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL2Format,
   7938                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 24, 2);
   7939     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType,
   7940                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 26, 16);
   7941     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcMac,
   7942                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 42, 48);
   7943     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstMac,
   7944                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 90, 48);
   7945 
   7946     if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) {
   7947         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanTranslationHit,
   7948                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 138, 1);
   7949         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlan,
   7950                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 141, 16);
   7951         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanCfi,
   7952                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 141, 1);
   7953         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanPri,
   7954                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 142, 3);
   7955         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId,
   7956                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 145, 12);
   7957     }
   7958 
   7959     if (soc_feature(unit, soc_feature_higig_lookup)) {
   7960         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy,
   7961                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 139, 1);
   7962         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig,
   7963                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 140, 1);
   7964     }
   7965 
   7966     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort,
   7967                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 157, 8);
   7968     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL3Routable,
   7969                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 165, 1);
   7970     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMirrorCopy,
   7971                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 166, 1);
   7972     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlan,
   7973                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 167, 16);
   7974     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanId,
   7975                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 167, 12);
   7976     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanCfi,
   7977                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 179, 1);
   7978     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanPri,
   7979                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 180, 3);
   7980     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanFormat,
   7981                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 183, 2);
   7982 
   7983 
   7984     if (soc_feature(unit, soc_feature_higig_lookup)) {
   7985         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstHiGig,
   7986                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 185, 1);
   7987     }
   7988 
   7989     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort,
   7990                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 186, 8);
   7991     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2,
   7992                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7993                                _bcmFieldSliceSelEgrClassF4, 0,
   7994                                194, 13
   7995                                );
   7996     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3,
   7997                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   7998                                _bcmFieldSliceSelEgrClassF4, 0,
   7999                                194, 13
   8000                                );
   8001     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField,
   8002                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8003                                _bcmFieldSliceSelEgrClassF4, 0,
   8004                                194, 13
   8005                                );
   8006     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField,
   8007                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8008                                _bcmFieldSliceSelEgrClassF4, 0,
   8009                                194, 13
   8010                                );
   8011     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2,
   8012                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8013                                _bcmFieldSliceSelEgrClassF4, 0,
   8014                                194, 13
   8015                                );
   8016     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3,
   8017                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8018                                _bcmFieldSliceSelEgrClassF4, 0,
   8019                                194, 13
   8020                                );
   8021     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2,
   8022                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8023                                _bcmFieldSliceSelEgrClassF4, 0,
   8024                                194, 13
   8025                                );
   8026     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   8027                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8028                                _bcmFieldSliceSelEgrClassF4, 0,
   8029                                194, 13
   8030                                );
   8031     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyOutPort,
   8032                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8033                                _bcmFieldSliceSelEgrClassF4, 1,
   8034                                194, 8);
   8035     _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyCpuQueue,
   8036                      _bcmFieldDevSelDisable, 0,
   8037                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8038                      _bcmFieldSliceSelEgrClassF4, 2,
   8039                      0,
   8040                      194, 6, /* CpuCos - 6 bits */
   8041                      0, 0,
   8042                      0, 0,
   8043                      0
   8044                      );
   8045     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField,
   8046                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8047                                _bcmFieldSliceSelEgrClassF4, 0,
   8048                                194, 13
   8049                                );
   8050     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8051                                bcmFieldQualifyIngressInterfaceClassPort,
   8052                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8053                                _bcmFieldSliceSelEgrClassF4, 0,
   8054                                194, 13
   8055                                );
   8056     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8057                                bcmFieldQualifyIngressInterfaceClassVPort,
   8058                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4,
   8059                                _bcmFieldSliceSelEgrClassF4, 0,
   8060                                194, 12
   8061                                );
   8062     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpType,
   8063                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 207, 5);
   8064     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingVlanId,
   8065                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 212, 12);
   8066     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVrf,
   8067                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 212, 13);
   8068     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVpn,
   8069                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 212,
   8070                  SOC_IS_HELIX5(unit) ? 12 : 13);
   8071 
   8072     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingType,
   8073                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 226, 2);
   8074     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification,
   8075                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 228, 2);
   8076     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop,
   8077                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 230, 1);
   8078 
   8079     /* EFP_KEY1(IPv4 Key) Qualifiers */
   8080 
   8081     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports,
   8082                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 0, 1);
   8083     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority,
   8084                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 1, 4);
   8085     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor,
   8086                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 5, 2);
   8087     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpFrag,
   8088                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 7, 2);
   8089     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTcpControl,
   8090                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 9, 8);
   8091     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort,
   8092                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 17, 16);
   8093     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort,
   8094                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 33, 16);
   8095     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode,
   8096                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 33, 16);
   8097     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTtl,
   8098                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 49, 8);
   8099     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol,
   8100                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 57, 8);
   8101     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstIp,
   8102                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 65, 32);
   8103     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifySrcIp,
   8104                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 97, 32);
   8105     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTos,
   8106                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 129, 8);
   8107 
   8108     if (soc_feature(unit, soc_feature_higig_lookup)) {
   8109         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy,
   8110                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 137, 1);
   8111         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig,
   8112                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 138, 1);
   8113     }
   8114 
   8115     if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) {
   8116         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId,
   8117                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 139, 12);
   8118     }
   8119 
   8120     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort,
   8121                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 151, 8);
   8122     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL3Routable,
   8123                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 159, 1);
   8124     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMirrorCopy,
   8125                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 160, 1);
   8126     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlan,
   8127                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 161, 16);
   8128     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanId,
   8129                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 161, 12);
   8130     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanCfi,
   8131                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 173, 1);
   8132     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanPri,
   8133                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 174, 3);
   8134     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanFormat,
   8135                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 177, 2);
   8136 
   8137 
   8138     if (soc_feature(unit, soc_feature_higig_lookup)) {
   8139         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstHiGig,
   8140                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 179, 1);
   8141     }
   8142 
   8143     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort,
   8144                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 180, 8);
   8145     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOutPort,
   8146                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 188, 8);
   8147     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpType,
   8148                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 196, 5);
   8149     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2,
   8150                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8151                                _bcmFieldSliceSelEgrClassF1, 0,
   8152                                201, 13
   8153                                );
   8154     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3,
   8155                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8156                                _bcmFieldSliceSelEgrClassF1, 0,
   8157                                201, 13
   8158                                );
   8159     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField,
   8160                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8161                                _bcmFieldSliceSelEgrClassF1, 0,
   8162                                201, 13
   8163                                );
   8164     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField,
   8165                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8166                                _bcmFieldSliceSelEgrClassF1, 0,
   8167                                201, 13
   8168                                );
   8169     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2,
   8170                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8171                                _bcmFieldSliceSelEgrClassF1, 0,
   8172                                201, 13
   8173                                );
   8174     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3,
   8175                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8176                                _bcmFieldSliceSelEgrClassF1, 0,
   8177                                201, 13
   8178                                );
   8179     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2,
   8180                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8181                                _bcmFieldSliceSelEgrClassF1, 0,
   8182                                201, 13
   8183                                );
   8184     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   8185                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8186                                _bcmFieldSliceSelEgrClassF1, 0,
   8187                                201, 13
   8188                                );
   8189 
   8190     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   8191                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8192                                _bcmFieldSliceSelEgrClassF1, 1,
   8193                                201, 12
   8194                                );
   8195     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8196                                bcmFieldQualifyEgressClassL3Interface,
   8197                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8198                                _bcmFieldSliceSelEgrClassF1, 2,
   8199                                201, 12
   8200                                );
   8201     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   8202         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill,
   8203                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8204                                    _bcmFieldSliceSelEgrClassF1, 3,
   8205                                    201, 12
   8206                                    );
   8207         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre,
   8208                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8209                                    _bcmFieldSliceSelEgrClassF1, 3,
   8210                                    201, 12
   8211                                    );
   8212         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan,
   8213                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8214                                    _bcmFieldSliceSelEgrClassF1, 3,
   8215                                    201, 12
   8216                                    );
   8217     }
   8218     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField,
   8219                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8220                                _bcmFieldSliceSelEgrClassF1, 0,
   8221                                201, 13
   8222                                );
   8223     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8224                                bcmFieldQualifyIngressInterfaceClassPort,
   8225                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8226                                _bcmFieldSliceSelEgrClassF1, 0,
   8227                                201, 13
   8228                                );
   8229    _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8230                                bcmFieldQualifyIngressInterfaceClassVPort,
   8231                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1,
   8232                                _bcmFieldSliceSelEgrClassF1, 0,
   8233                                201, 13
   8234                                );
   8235     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingVlanId,
   8236                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 214, 12);
   8237     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVrf,
   8238                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 214, 13);
   8239     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVpn,
   8240                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 214, 13);
   8241 
   8242     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingType,
   8243                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 228, 2);
   8244     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification,
   8245                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 230, 2);
   8246     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop,
   8247                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 232, 1);
   8248     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp4,
   8249                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY1, 0, 0);
   8250 
   8251     /* EFP_KEY2 (IPv6 Singlewide Key) Qualifiers */
   8252 
   8253     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports,
   8254                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 0, 1);
   8255     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpProtocol,
   8256                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 1, 8);
   8257     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp6,
   8258                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8259                                _bcmFieldSliceIp6AddrSelect,
   8260                                _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP6,
   8261                                9, 128);
   8262     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6,
   8263                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8264                                _bcmFieldSliceIp6AddrSelect,
   8265                                _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_DIP6,
   8266                                9, 128);
   8267     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcIp6High,
   8268                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8269                                _bcmFieldSliceIp6AddrSelect,
   8270                                _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP_DIP_64,
   8271                                9, 64);
   8272     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6High,
   8273                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8274                                _bcmFieldSliceIp6AddrSelect,
   8275                                _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP_DIP_64,
   8276                                73, 64);
   8277     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTos,
   8278                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 137, 8);
   8279 
   8280     if (soc_feature(unit, soc_feature_higig_lookup)) {
   8281         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy,
   8282                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 145, 1);
   8283         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig,
   8284                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 146, 1);
   8285     }
   8286 
   8287     if (!soc_feature(unit, soc_feature_fp_no_inner_vlan_support)) {
   8288         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInnerVlanId,
   8289                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 147, 12);
   8290     }
   8291 
   8292     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort,
   8293                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 159, 8);
   8294     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL3Routable,
   8295                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 167, 1);
   8296     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMirrorCopy,
   8297                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 168, 1);
   8298     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlan,
   8299                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 169, 16);
   8300     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanId,
   8301                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 169, 12);
   8302     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanCfi,
   8303                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 181, 1);
   8304     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOuterVlanPri,
   8305                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 182, 3);
   8306     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVlanFormat,
   8307                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 185, 2);
   8308 
   8309     if (soc_feature(unit, soc_feature_higig_lookup)) {
   8310         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstHiGig,
   8311                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 187, 1);
   8312     }
   8313     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort,
   8314                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 188, 8);
   8315     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2,
   8316                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8317                                _bcmFieldSliceSelEgrClassF2, 0,
   8318                                196, 13
   8319                                );
   8320     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3,
   8321                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8322                                _bcmFieldSliceSelEgrClassF2, 0,
   8323                                196, 13
   8324                                );
   8325     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField,
   8326                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8327                                _bcmFieldSliceSelEgrClassF2, 0,
   8328                                196, 13
   8329                                );
   8330     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField,
   8331                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8332                                _bcmFieldSliceSelEgrClassF2, 0,
   8333                                196, 13
   8334                                );
   8335     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2,
   8336                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8337                                _bcmFieldSliceSelEgrClassF2, 0,
   8338                                196, 13
   8339                                );
   8340     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3,
   8341                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8342                                _bcmFieldSliceSelEgrClassF2, 0,
   8343                                196, 13
   8344                                );
   8345     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2,
   8346                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8347                                _bcmFieldSliceSelEgrClassF2, 0,
   8348                                196, 13
   8349                                );
   8350     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   8351                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8352                                _bcmFieldSliceSelEgrClassF2, 0,
   8353                                196, 13
   8354                                );
   8355     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField,
   8356                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8357                                _bcmFieldSliceSelEgrClassF2, 0,
   8358                                196, 13
   8359                                );
   8360 
   8361     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   8362         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill,
   8363                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8364                                    _bcmFieldSliceSelEgrClassF2, 4,
   8365                                    196, 12
   8366                                    );
   8367         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre,
   8368                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8369                                    _bcmFieldSliceSelEgrClassF2, 4,
   8370                                    196, 12
   8371                                    );
   8372         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan,
   8373                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8374                                    _bcmFieldSliceSelEgrClassF2, 4,
   8375                                    196, 12
   8376                                    );
   8377     }
   8378 
   8379     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   8380                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8381                                _bcmFieldSliceSelEgrClassF2, 1,
   8382                                196, 12
   8383                                );
   8384     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8385                                bcmFieldQualifyEgressClassL3Interface,
   8386                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8387                                _bcmFieldSliceSelEgrClassF2, 2,
   8388                                196, 12
   8389                                );
   8390     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyOutPort,
   8391                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8392                                _bcmFieldSliceSelEgrClassF2, 3,
   8393                                196, 8
   8394                                );
   8395     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField,
   8396                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8397                                _bcmFieldSliceSelEgrClassF2, 0,
   8398                                196, 13
   8399                                );
   8400     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8401                                bcmFieldQualifyIngressInterfaceClassPort,
   8402                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8403                                _bcmFieldSliceSelEgrClassF2, 0,
   8404                                196, 13
   8405                                );
   8406     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8407                                bcmFieldQualifyIngressInterfaceClassVPort,
   8408                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2,
   8409                                _bcmFieldSliceSelEgrClassF2, 0,
   8410                                196, 13
   8411                                );
   8412     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpType,
   8413                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 209, 5);
   8414 
   8415     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingVlanId,
   8416                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 214, 12);
   8417     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVrf,
   8418                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 214, 13);
   8419     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVpn,
   8420                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 214, 13);
   8421 
   8422     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingType,
   8423                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 228, 2);
   8424     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification,
   8425                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 230, 2);
   8426     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop,
   8427                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 232, 1);
   8428     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp6,
   8429                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY2, 0, 0);
   8430 
   8431     /* EFP_KEY3 (IPv6 Double Wide Key) Qualifiers */
   8432 
   8433     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4Ports,
   8434                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 0, 1);
   8435     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority,
   8436                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 1, 4);
   8437     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor,
   8438                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 5, 2);
   8439     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpFrag,
   8440                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 7, 2);
   8441     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTcpControl,
   8442                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 9, 8);
   8443     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4DstPort,
   8444                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 17, 16);
   8445     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyL4SrcPort,
   8446                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 33, 16);
   8447     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIcmpTypeCode,
   8448                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 33, 16);
   8449     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyTtl,
   8450                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 49, 8);
   8451     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstIp6,
   8452                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 57, 128);
   8453     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderSubCode,
   8454                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 185, 8);
   8455     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyExtensionHeaderType,
   8456                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 193, 8);
   8457     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIpType,
   8458                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 201, 5);
   8459 
   8460 
   8461     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   8462                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3,
   8463                                _bcmFieldSliceSelEgrClassF3, 0,
   8464                                206, 12);
   8465     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8466                                bcmFieldQualifyEgressClassL3Interface,
   8467                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3,
   8468                                _bcmFieldSliceSelEgrClassF3, 1,
   8469                                206, 12);
   8470 
   8471     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   8472         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill,
   8473                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3,
   8474                                    _bcmFieldSliceSelEgrClassF3, 3,
   8475                                    206, 12);
   8476         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre,
   8477                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3,
   8478                                    _bcmFieldSliceSelEgrClassF3, 3,
   8479                                    206, 12);
   8480         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan,
   8481                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3,
   8482                                    _bcmFieldSliceSelEgrClassF3, 3,
   8483                                    206, 12);
   8484     }
   8485     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification,
   8486                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 218, 2);
   8487     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop,
   8488                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 220, 1);
   8489     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIp6,
   8490                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY3, 0, 0);
   8491 #if defined(BCM_TOMAHAWK2_SUPPORT)
   8492     if (SOC_IS_TOMAHAWK2(unit)) {
   8493         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelExp,
   8494                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 231, 3);
   8495     }
   8496 #endif /* BCM_TOMAHAWK2_SUPPORT */
   8497 
   8498     /*EFP_KEY6 (HiGiG Key)  Qualifiers*/
   8499     if (soc_feature(unit, soc_feature_higig_lookup)) {
   8500         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyFabricQueueTag,
   8501                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 0, 32);
   8502         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstMulticast,
   8503                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 148, 1);
   8504         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstMulticastGroupId,
   8505                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 128, 16);
   8506         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigTrafficClass,
   8507                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 144, 4);
   8508         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstModuleGport,
   8509                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 136, 8);
   8510         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstPortGport,
   8511                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 128, 8);
   8512         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstModPortGport,
   8513                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 128, 16);
   8514         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcModuleGport,
   8515                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 120, 8);
   8516         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcPortGport,
   8517                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 112, 8);
   8518         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcModPortGport,
   8519                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 112, 16);
   8520         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigLoadBalanceID,
   8521                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 104, 8);
   8522         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigColor,
   8523                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 102, 2);
   8524         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigExtendedHeaderPresent,
   8525                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 101, 1);
   8526         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigIntCongestionNotification,
   8527                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 99, 2);
   8528         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigMirrorOrSwitchPkt,
   8529                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 88, 1);
   8530         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigIngressTagged,
   8531                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 91, 1);
   8532         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstTrunk,
   8533                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 95, 1);
   8534         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstTrunkId,
   8535                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 92, 3);
   8536         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigIngressL3SwitchPkt,
   8537                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 85, 1);
   8538         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigLabelType,
   8539                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 86, 2);
   8540         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigMplsPkt,
   8541                     _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 84, 1);
   8542         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigLabel,
   8543                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 64, 20);
   8544         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigReplicationId,
   8545                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 64, 19);
   8546         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigVlan,
   8547                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 48, 16);
   8548         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigPortFilteringMode,
   8549                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 46, 2);
   8550         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcTrunk,
   8551                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 45, 1);
   8552         _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigPreserveFlags,
   8553                      _bcmFieldDevSelDisable, 0,
   8554                     _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8555                     _bcmFieldDevSelDisable, 0,
   8556                     0,
   8557                     44, 1,
   8558                     43, 1,
   8559                     0, 0,
   8560                     0);
   8561         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigIngressClassificationTag,
   8562                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 80, 16);
   8563         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigEgressMcast,
   8564                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 95, 1);
   8565         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigForwardingType,
   8566                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 90, 5);
   8567         _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigVni,
   8568                      _bcmFieldDevSelDisable, 0,
   8569                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8570                      _bcmFieldDevSelDisable, 0,
   8571                      0,
   8572                      80, 10,
   8573                      36, 4,
   8574                      0, 0,
   8575                      0);
   8576         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstGport,
   8577                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 64, 16);
   8578         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigMulticastIndex,
   8579                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 64, 16);
   8580         _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigVpReplicationId,
   8581                      _bcmFieldDevSelDisable, 0,
   8582                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8583                      _bcmFieldDevSelDisable, 0,
   8584                      0,
   8585                      64, 16,
   8586                      40, 3,
   8587                      0, 0,
   8588                      0);
   8589         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcGport,
   8590                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 48, 16);
   8591         _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigDoNotFlags,
   8592                      _bcmFieldDevSelDisable, 0,
   8593                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8594                      _bcmFieldDevSelDisable, 0,
   8595                      0,
   8596                      46, 1,
   8597                      45, 1,
   8598                      0, 0,
   8599                      0);
   8600         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigVpLagFailoverPacket,
   8601                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 44, 1);
   8602         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProtectionSwitchingStatus,
   8603                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 43, 1);
   8604         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigMirrorToVp,
   8605                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 47, 1);
   8606         _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigVpPreserveFlags,
   8607                      _bcmFieldDevSelDisable, 0,
   8608                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8609                      _bcmFieldDevSelDisable, 0,
   8610                      0,
   8611                      35, 1,
   8612                      34, 1,
   8613                      0, 0,
   8614                      0);
   8615         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigDstType,
   8616                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 33, 1);
   8617         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigSrcType,
   8618                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 32, 1);
   8619         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineClassificationTag,
   8620                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 80, 16);
   8621         _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineDeferredFlags,
   8622                      _bcmFieldDevSelDisable, 0,
   8623                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8624                      _bcmFieldDevSelDisable, 0,
   8625                      0,
   8626                      79, 1,
   8627                      76, 1,
   8628                      72, 1,
   8629                      0);
   8630         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineVxltStatus,
   8631                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 77, 2);
   8632         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEnginePktPriNew,
   8633                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 73, 3);
   8634         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineDscpNew,
   8635                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 66, 6);
   8636         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEnginePreserveDscp,
   8637                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 47, 1);
   8638         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEnginePreserveDot1p,
   8639                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 46, 1);
   8640         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigOffloadEngineSrcType,
   8641                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 43, 1);
   8642         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMHOpcode,
   8643                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 40, 3);
   8644 
   8645         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy,
   8646                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 160, 1);
   8647         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig,
   8648                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 161, 1);
   8649 
   8650         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort,
   8651                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 162, 8);
   8652         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort,
   8653                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 170, 8);
   8654         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOutPort,
   8655                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 178, 8);
   8656         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2,
   8657                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8658                                    _bcmFieldSliceSelEgrClassF6, 0,
   8659                                    186, 13
   8660                                    );
   8661         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3,
   8662                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8663                                    _bcmFieldSliceSelEgrClassF6, 0,
   8664                                    186, 13
   8665                                    );
   8666         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField,
   8667                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8668                                    _bcmFieldSliceSelEgrClassF6, 0,
   8669                                    186, 13
   8670                                    );
   8671         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField,
   8672                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8673                                    _bcmFieldSliceSelEgrClassF6, 0,
   8674                                    186, 13
   8675                                    );
   8676         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2,
   8677                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8678                                    _bcmFieldSliceSelEgrClassF6, 0,
   8679                                    186, 13
   8680                                    );
   8681         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3,
   8682                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8683                                    _bcmFieldSliceSelEgrClassF6, 0,
   8684                                    186, 13
   8685                                    );
   8686         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2,
   8687                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8688                                    _bcmFieldSliceSelEgrClassF6, 0,
   8689                                    186, 13
   8690                                    );
   8691         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   8692                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8693                                    _bcmFieldSliceSelEgrClassF6, 0,
   8694                                    186, 13
   8695                                    );
   8696 
   8697         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8698                                    bcmFieldQualifyIngressInterfaceClassPort,
   8699                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8700                                    _bcmFieldSliceSelEgrClassF6, 0,
   8701                                    186, 13
   8702                                    );
   8703         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8704                                    bcmFieldQualifyIngressInterfaceClassVPort,
   8705                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8706                                    _bcmFieldSliceSelEgrClassF6, 0,
   8707                                    186, 13
   8708                                    );
   8709 
   8710         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField,
   8711                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8712                                    _bcmFieldSliceSelEgrClassF6, 0,
   8713                                    186, 13
   8714                                    );
   8715 
   8716         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification,
   8717                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 199, 2);
   8718         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop,
   8719                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6, 201, 1);
   8720     }
   8721 
   8722     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   8723                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8724                                _bcmFieldSliceSelEgrClassF3, 0,
   8725                                186, 12);
   8726     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8727                                bcmFieldQualifyEgressClassL3Interface,
   8728                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY6,
   8729                                _bcmFieldSliceSelEgrClassF6, 1,
   8730                                186, 12);
   8731 
   8732     /* EFP_KEY7(Loopback Key) qualifiers */
   8733 
   8734     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackQueue,
   8735                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 116, 4);
   8736     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopbackType,
   8737                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 111, 5);
   8738     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackSrcGport,
   8739                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 94, 16);
   8740     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyPktIsVisible,
   8741                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 93, 1);
   8742     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackCpuMasqueradePktProfile,
   8743                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 90, 3);
   8744     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackColor,
   8745                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 4, 2);
   8746     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackTrafficClass,
   8747                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 0, 4);
   8748     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyLoopBackPacketProcessingPort,
   8749                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 0, 8);
   8750 
   8751 
   8752     if (soc_feature(unit, soc_feature_higig_lookup)) {
   8753         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy,
   8754                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 128, 1);
   8755         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig,
   8756                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 129, 1);
   8757     }
   8758 
   8759     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort,
   8760                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 130, 8);
   8761     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort,
   8762                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 138, 8);
   8763     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyOutPort,
   8764                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 146, 8);
   8765     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority,
   8766                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 154, 4);
   8767     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor,
   8768                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY4, 158, 2);
   8769 
   8770     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2,
   8771                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8772                                _bcmFieldSliceSelEgrClassF7, 0,
   8773                                160, 13
   8774                                );
   8775     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3,
   8776                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8777                                _bcmFieldSliceSelEgrClassF7, 0,
   8778                                160, 13
   8779                                );
   8780     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField,
   8781                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8782                                _bcmFieldSliceSelEgrClassF7, 0,
   8783                                160, 13
   8784                                );
   8785     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField,
   8786                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8787                                _bcmFieldSliceSelEgrClassF7, 0,
   8788                                160, 13
   8789                                );
   8790     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2,
   8791                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8792                                _bcmFieldSliceSelEgrClassF7, 0,
   8793                                160, 13
   8794                                );
   8795     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3,
   8796                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8797                                _bcmFieldSliceSelEgrClassF7, 0,
   8798                                160, 13
   8799                                );
   8800     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2,
   8801                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8802                                _bcmFieldSliceSelEgrClassF7, 0,
   8803                                160, 13
   8804                                );
   8805     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   8806                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8807                                _bcmFieldSliceSelEgrClassF7, 0,
   8808                                160, 13
   8809                                );
   8810 
   8811     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8812                                bcmFieldQualifyIngressInterfaceClassPort,
   8813                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8814                                _bcmFieldSliceSelEgrClassF7, 0,
   8815                                160, 13
   8816                                );
   8817     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8818                                bcmFieldQualifyIngressInterfaceClassVPort,
   8819                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8820                                _bcmFieldSliceSelEgrClassF7, 0,
   8821                                160, 13
   8822                                );
   8823 
   8824     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField,
   8825                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8826                                _bcmFieldSliceSelEgrClassF7, 0,
   8827                                160, 13
   8828                                );
   8829 
   8830     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   8831                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8832                                _bcmFieldSliceSelEgrClassF7, 1,
   8833                                160, 12);
   8834     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8835                                bcmFieldQualifyEgressClassL3Interface,
   8836                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8837                                _bcmFieldSliceSelEgrClassF7, 2,
   8838                                160, 12);
   8839 
   8840     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   8841 
   8842         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill,
   8843                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8844                                    _bcmFieldSliceSelEgrClassF7, 3,
   8845                                    160, 12);
   8846         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre,
   8847                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8848                                    _bcmFieldSliceSelEgrClassF7, 3,
   8849                                    160, 12);
   8850         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan,
   8851                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8852                                    _bcmFieldSliceSelEgrClassF7, 3,
   8853                                    160, 12);
   8854 
   8855         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMplsGport,
   8856                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8857                                    _bcmFieldSliceSelEgrClassF7, 4,
   8858                                    0, 16);
   8859         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMimGport,
   8860                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8861                                    _bcmFieldSliceSelEgrClassF7, 4,
   8862                                    0, 16);
   8863         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstVxlanGport,
   8864                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7,
   8865                                    _bcmFieldSliceSelEgrClassF7, 4,
   8866                                    0, 16);
   8867     }
   8868     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification,
   8869                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 173, 2);
   8870     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop,
   8871                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY7, 175, 1);
   8872 
   8873     /* EFP_KEY8(Bytes After L2 Key) Qualifiers */
   8874     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyL2PayLoad,
   8875                     _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8876                     _bcmFieldSliceSelDisable, 0, 59, 144);
   8877 
   8878 
   8879     /* DVP_VALID + DVP + SPARE_DVP */
   8880     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   8881         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMplsGport,
   8882                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8883                                    _bcmFieldSliceSelEgrDvpKey8, 0,
   8884                                    0, 16);
   8885         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstMimGport,
   8886                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8887                                    _bcmFieldSliceSelEgrDvpKey8, 0,
   8888                                    0, 16);
   8889         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstVxlanGport,
   8890                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8891                                    _bcmFieldSliceSelEgrDvpKey8, 0,
   8892                                    0, 16);
   8893         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8894                                    bcmFieldQualifyDestVirtualPortValid,
   8895                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8896                                    _bcmFieldSliceSelEgrDvpKey8, 0,
   8897                                    0, 1);
   8898 
   8899         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassTrill,
   8900                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8901                                    _bcmFieldSliceSelEgrDvpKey8, 3,
   8902                                    1, 12);
   8903         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassL2Gre,
   8904                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8905                                    _bcmFieldSliceSelEgrDvpKey8, 3,
   8906                                    1, 12);
   8907         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClassVxlan,
   8908                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8909                                    _bcmFieldSliceSelEgrDvpKey8, 3,
   8910                                    1, 12);
   8911     }
   8912 
   8913     if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   8914         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   8915                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8916                                    _bcmFieldSliceSelEgrClassKey8, 1,
   8917                                    1, 12);
   8918         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8919                                    bcmFieldQualifyEgressClassL3Interface,
   8920                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8921                                    _bcmFieldSliceSelEgrClassKey8, 2,
   8922                                    1, 12);
   8923     } else {
   8924         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyEgressClass,
   8925                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8926                                    _bcmFieldSliceSelEgrDvpKey8, 1,
   8927                                    1, 12);
   8928         _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   8929                                    bcmFieldQualifyEgressClassL3Interface,
   8930                                    _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8931                                    _bcmFieldSliceSelEgrDvpKey8, 2,
   8932                                    1, 12);
   8933     }
   8934 
   8935     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntPriority,
   8936                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 17, 4);
   8937     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyColor,
   8938                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 21, 2);
   8939     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyEtherType,
   8940                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 23, 16);
   8941 
   8942 
   8943     if (soc_feature(unit, soc_feature_higig_lookup)) {
   8944         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGigProxy,
   8945                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 39, 1);
   8946         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyHiGig,
   8947                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 40, 1);
   8948     }
   8949 
   8950 
   8951     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInPort,
   8952                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 41, 8);
   8953     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyMirrorCopy,
   8954                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 49, 1);
   8955 
   8956     if (soc_feature(unit, soc_feature_higig_lookup)) {
   8957         _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDstHiGig,
   8958                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 50, 1);
   8959     }
   8960 
   8961     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassPort,
   8962                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 51, 8);
   8963     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyOutPort,
   8964                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8965                                _bcmFieldSliceSelEgrClassF8, 1,
   8966                                203, 8);
   8967     _FP_QUAL_EXT_ADD(unit, stage_fc, bcmFieldQualifyCpuQueue,
   8968                      _bcmFieldDevSelDisable, 0,
   8969                      _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8970                      _bcmFieldSliceSelEgrClassF8, 2,
   8971                      0,
   8972                      203, 6, /* CpuCos - 6 bits */
   8973                      0, 0,
   8974                      0, 0,
   8975                      0
   8976                      );
   8977     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL2,
   8978                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8979                                _bcmFieldSliceSelEgrClassF8, 0,
   8980                                203, 13
   8981                                );
   8982     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassL3,
   8983                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8984                                _bcmFieldSliceSelEgrClassF8, 0,
   8985                                203, 13
   8986                                );
   8987     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassField,
   8988                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8989                                _bcmFieldSliceSelEgrClassF8, 0,
   8990                                203, 13
   8991                                );
   8992     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifySrcClassField,
   8993                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8994                                _bcmFieldSliceSelEgrClassF8, 0,
   8995                                203, 13
   8996                                );
   8997     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL2,
   8998                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   8999                                _bcmFieldSliceSelEgrClassF8, 0,
   9000                                203, 13
   9001                                );
   9002     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyDstClassL3,
   9003                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   9004                                _bcmFieldSliceSelEgrClassF8, 0,
   9005                                203, 13
   9006                                );
   9007     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL2,
   9008                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   9009                                _bcmFieldSliceSelEgrClassF8, 0,
   9010                                203, 13
   9011                                );
   9012     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
   9013                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   9014                                _bcmFieldSliceSelEgrClassF8, 0,
   9015                                203, 13
   9016                                );
   9017 
   9018     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   9019                                bcmFieldQualifyIngressInterfaceClassPort,
   9020                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   9021                                _bcmFieldSliceSelEgrClassF8, 0,
   9022                                203, 13
   9023                                );
   9024     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc,
   9025                                bcmFieldQualifyIngressInterfaceClassVPort,
   9026                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   9027                                _bcmFieldSliceSelEgrClassF8, 0,
   9028                                203, 13
   9029                                );
   9030     _FP_QUAL_TWO_SLICE_SEL_ADD(unit, stage_fc, bcmFieldQualifyIngressClassField,
   9031                                _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8,
   9032                                _bcmFieldSliceSelEgrClassF8, 0,
   9033                                203, 13
   9034                                );
   9035 
   9036     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingVlanId,
   9037                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 216, 12);
   9038     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVrf,
   9039                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 216, 14);
   9040     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyVpn,
   9041                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 216, 14);
   9042 
   9043     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyForwardingType,
   9044                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 230, 2);
   9045     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyIntCongestionNotification,
   9046                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 232, 2);
   9047     _FP_QUAL_ADD(unit, stage_fc, bcmFieldQualifyDrop,
   9048                  _bcmFieldSliceSelFpf3, _BCM_FIELD_EFP_KEY8, 234, 1);
   9049 
   9050     return (BCM_E_NONE);
   9051 }
   9052 
   9053 /*
   9054  * Function:
   9055  *     _bcm_field_th_egress_mode_get
   9056  *
   9057  * Purpose:
   9058  *     Helper function to get the mode of a slice in a
   9059  *     register value that is to be used for FP_SLICE_CONFIGr.
   9060  *
   9061  * Parameters:
   9062  *     unit       - (IN) BCM device number.
   9063  *     fg         - (IN) Installed group structure.
   9064  *     slice_mode - (IN/OUT) Slice mode for the group.
   9065  *
   9066  * Returns:
   9067  *     BCM_E_XXX
   9068  */
   9069 
   9070 int
   9071 _bcm_field_th_egress_mode_get(int unit,
   9072                                _field_group_t *fg,
   9073                                uint8 *slice_mode)
   9074 {
   9075     int    inst;
   9076     uint32 reg_value;
   9077     uint32 slice_num;
   9078     _field_stage_t  *stage_fc;
   9079     soc_field_t _th_efp_slice_mode[4] =  {SLICE_0_MODEf, SLICE_1_MODEf,
   9080                                            SLICE_2_MODEf, SLICE_3_MODEf};
   9081     soc_reg_t     efp_slice_control_reg;
   9082 
   9083     /* Input parameters check. */
   9084     if ((NULL == fg) ||  (NULL == slice_mode)) {
   9085         return (BCM_E_PARAM);
   9086     }
   9087 
   9088     if (_BCM_FIELD_STAGE_EGRESS != fg->stage_id) {
   9089         return BCM_E_PARAM;
   9090     }
   9091 
   9092     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id,
   9093                                                  &stage_fc));
   9094 
   9095     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
   9096        inst = _FP_GLOBAL_INST;
   9097     } else {
   9098        inst = fg->instance;
   9099     }
   9100 
   9101     slice_num = fg->slices->slice_number;
   9102 
   9103     if (slice_num >= COUNTOF(_th_efp_slice_mode)) {
   9104         return (BCM_E_PARAM);
   9105     }
   9106 
   9107     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr,
   9108                                                        inst,
   9109                                                        &efp_slice_control_reg));
   9110     BCM_IF_ERROR_RETURN(soc_reg32_get(unit,
   9111                                       efp_slice_control_reg,
   9112                                       REG_PORT_ANY, 0, &reg_value));
   9113 
   9114     *slice_mode = soc_reg_field_get(unit,
   9115                                     efp_slice_control_reg,
   9116                                     reg_value,
   9117                                     _th_efp_slice_mode[slice_num]);
   9118     return BCM_E_NONE;
   9119 }
   9120  /*
   9121   * Function:
   9122   *     _bcm_field_th_egress_mode_set
   9123   *
   9124   * Purpose:
   9125   *     Helper function to _bcm_field_th_mode_install that sets the mode of a
   9126   *     slice in a register value that is to be used for FP_SLICE_CONFIGr.
   9127   *
   9128   * Parameters:
   9129   *     unit       - (IN) BCM device number.
   9130   *     slice_numb - (IN) Slice number to set mode for.
   9131   *     fg         - (IN) Installed group structure.
   9132   *     flags      - (IN) New group/slice mode.
   9133   *
   9134   * Returns:
   9135   *     BCM_E_XXX
   9136   */
   9137 int
   9138 _bcm_field_th_egress_mode_set(int unit, uint8 slice_numb,
   9139                                _field_group_t *fg, uint8 flags)
   9140 {
   9141     int              inst;
   9142     uint32           mode_val[2];
   9143     _field_stage_t  *stage_fc;
   9144     soc_reg_t     efp_slice_control_reg;
   9145 
   9146     /* Input parameters check. */
   9147     if ((NULL == fg) || (slice_numb >= COUNTOF(_th_efp_slice_mode))) {
   9148         return (BCM_E_PARAM);
   9149     }
   9150 
   9151     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id,
   9152                                                  &stage_fc));
   9153 
   9154     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
   9155        inst = _FP_GLOBAL_INST;
   9156     } else {
   9157        inst = fg->instance;
   9158     }
   9159 
   9160     mode_val[1]  = _BCM_FIELD_EGRESS_SLICE_V6_KEY_MODE_SIP6;
   9161 
   9162     if (flags & _FP_GROUP_SPAN_DOUBLE_SLICE) {
   9163 
   9164         /* DstIP6 + SrcIp6 or IPv4 + L2 Double wide key. */
   9165         if (((_BCM_FIELD_EFP_KEY3 == fg->sel_codes[0].fpf3) &&
   9166             (_BCM_FIELD_EFP_KEY2 == fg->sel_codes[1].fpf3))) {
   9167             mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE;
   9168             if (_FP_SELCODE_DONT_CARE != fg->sel_codes[1].ip6_addr_sel) {
   9169                 mode_val[1] =fg->sel_codes[1].ip6_addr_sel;
   9170             }
   9171         }
   9172 
   9173 #if defined(BCM_TRIDENT3_SUPPORT)
   9174         /* FCOE Double wide key. */
   9175         if ((_BCM_FIELD_EFP_KEY5 == fg->sel_codes[0].fpf3) && \
   9176             (_BCM_FIELD_EFP_KEY4 == fg->sel_codes[1].fpf3)) {
   9177             mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_FCOE;
   9178         } else
   9179 #endif
   9180         if (_BCM_FIELD_EFP_KEY4 == fg->sel_codes[1].fpf3) {
   9181             if ((_BCM_FIELD_EFP_KEY1 == fg->sel_codes[0].fpf3) &&
   9182                 (BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp4))) {
   9183                  mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE;
   9184             } else if (_BCM_FIELD_EFP_KEY2 == fg->sel_codes[0].fpf3) {
   9185                  mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6;
   9186                  if (_FP_SELCODE_DONT_CARE != fg->sel_codes[0].ip6_addr_sel) {
   9187                      mode_val[1] =fg->sel_codes[0].ip6_addr_sel;
   9188                  }
   9189             } else if (_BCM_FIELD_EFP_KEY8 == fg->sel_codes[0].fpf3) {
   9190                  mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE;
   9191             } else {
   9192                  mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY;
   9193             }
   9194         }
   9195     } else {
   9196         if (_BCM_FIELD_EFP_KEY4 == fg->sel_codes[0].fpf3) {
   9197             /* L2 - Slice mode. */
   9198             mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2;
   9199 
   9200         } else  if ((_BCM_FIELD_EFP_KEY1 == fg->sel_codes[0].fpf3)  &&
   9201                     BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp4)) {
   9202             /* L3 - IPv4 single wide key. */
   9203             mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3;
   9204 
   9205         } else if ((_BCM_FIELD_EFP_KEY2 == fg->sel_codes[0].fpf3)) {
   9206             /* L3 - IPv6 single wide key. */
   9207             mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3;
   9208             if (_FP_SELCODE_DONT_CARE != fg->sel_codes[0].ip6_addr_sel) {
   9209                 mode_val[1] =fg->sel_codes[0].ip6_addr_sel;
   9210             }
   9211         }
   9212 #if defined(BCM_TRIDENT3_SUPPORT)
   9213         else if ((_BCM_FIELD_EFP_KEY5 == fg->sel_codes[0].fpf3)) {
   9214             /* FCOE single wide key. */
   9215             mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3;
   9216         }
   9217 #endif
   9218         else {
   9219             /* L3 common key. */
   9220             mode_val[0] = _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY;
   9221         }
   9222     }
   9223 
   9224     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr,
   9225                                                  inst, &efp_slice_control_reg));
   9226     BCM_IF_ERROR_RETURN(soc_reg_fields32_modify(unit,
   9227                                efp_slice_control_reg, REG_PORT_ANY, 2,
   9228                                _th_efp_slice_mode[slice_numb], mode_val));
   9229 
   9230     return (BCM_E_NONE);
   9231 }
   9232 
   9233 /*
   9234  * Function:
   9235  *     _field_th_lookup_mode_set
   9236  *
   9237  * Purpose:
   9238  *    Auxiliary routine used to set group pairing mode.
   9239  * Parameters:
   9240  *     unit       - (IN) BCM device number.
   9241  *     slice_numb - (IN) Slice number to set mode for.
   9242  *     fg         - (IN) Installed group structure.
   9243  *     flags      - (IN) New group/slice mode.
   9244  *
   9245  * Returns:
   9246  *     BCM_E_XXX
   9247  */
   9248 STATIC int
   9249 _field_th_lookup_mode_set(int            unit,
   9250                           uint8          slice_num,
   9251                           _field_group_t *fg,
   9252                           uint8          flags)
   9253 {
   9254     int              inst;
   9255     uint64           vfp_key_control_1_buf;
   9256     _field_stage_t  *stage_fc;
   9257     soc_reg_t        vfp_control_1_reg;
   9258 
   9259     /* Input parameters check. */
   9260     if (NULL == fg) {
   9261         return (BCM_E_PARAM);
   9262     }
   9263 
   9264     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id,
   9265                                                  &stage_fc));
   9266 
   9267     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
   9268        inst = _FP_GLOBAL_INST;
   9269     } else {
   9270        inst = fg->instance;
   9271     }
   9272 
   9273     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r,
   9274                                                     inst, &vfp_control_1_reg));
   9275 
   9276     BCM_IF_ERROR_RETURN(soc_reg64_get(unit,
   9277                                       vfp_control_1_reg,
   9278                                       REG_PORT_ANY,
   9279                                       0,
   9280                                       &vfp_key_control_1_buf));
   9281 
   9282     soc_reg64_field32_set(unit,
   9283                           vfp_control_1_reg,
   9284                           &vfp_key_control_1_buf,
   9285                           vfp_slice_pairing_flds[slice_num >> 1],
   9286                           flags & _FP_GROUP_SPAN_DOUBLE_SLICE ? 1 : 0
   9287                           );
   9288     soc_reg64_field32_set(unit,
   9289                           vfp_control_1_reg,
   9290                           &vfp_key_control_1_buf,
   9291                           vfp_slice_wide_mode_flds[slice_num],
   9292                           flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE ? 1 : 0
   9293                           );
   9294 
   9295 
   9296     return (soc_reg64_set(unit,
   9297                           vfp_control_1_reg,
   9298                           REG_PORT_ANY,
   9299                           0,
   9300                           vfp_key_control_1_buf));
   9301 }
   9302 
   9303 
   9304 /*
   9305  * Function:
   9306  *     _field_th_mode_set
   9307  *
   9308  * Purpose:
   9309  *    Auxiliary routine used to set group pairing mode.
   9310  * Parameters:
   9311  *     unit       - (IN) BCM device number.
   9312  *     slice_numb - (IN) Slice number to set mode for.
   9313  *     fg         - (IN) Installed group structure.
   9314  *     flags      - (IN) New group/slice mode.
   9315  *
   9316  * Returns:
   9317  *     BCM_E_XXX
   9318  */
   9319 int
   9320 _bcm_field_th_mode_set(int unit, uint8 slice_numb,
   9321                        _field_group_t *fg, uint8 flags)
   9322 {
   9323     int rv;     /* Operation return status. */
   9324 
   9325     /* Input parameter check. */
   9326     if (NULL == fg) {
   9327         return (BCM_E_PARAM);
   9328     }
   9329 
   9330     switch (fg->stage_id) {
   9331       case _BCM_FIELD_STAGE_INGRESS:
   9332       case _BCM_FIELD_STAGE_EXACTMATCH:
   9333           rv = BCM_E_NONE; /* Mode and select codes programmed together. */
   9334           break;
   9335       case _BCM_FIELD_STAGE_LOOKUP:
   9336           rv  = _field_th_lookup_mode_set(unit, slice_numb, fg, flags);
   9337           break;
   9338       case _BCM_FIELD_STAGE_EGRESS:
   9339           rv = _bcm_field_th_egress_mode_set(unit, slice_numb, fg, flags);
   9340           break;
   9341       case _BCM_FIELD_STAGE_FLOWTRACKER:
   9342           rv = BCM_E_NONE;
   9343           break;
   9344       default:
   9345           rv = BCM_E_PARAM;
   9346     }
   9347     return (rv);
   9348 }
   9349 /*
   9350  * Function:
   9351  *     _field_th_egress_selcodes_install
   9352  *
   9353  * Purpose:
   9354  *     Writes the field egress secondary select codes.
   9355  *
   9356  * Parameters:
   9357  *     unit          - (IN) BCM device number
   9358  *     fg            - (IN) Installed group structure.
   9359  *     slice_numb    - (IN) Slice number to set mode for.
   9360  *     selcode_index - (IN) Index to group slecodes.
   9361  *
   9362  *
   9363  * Returns:
   9364  *     BCM_E_INTERNAL - On read/write errors
   9365  *     BCM_E_NONE     - Success
   9366  *
   9367  * Note:
   9368  *     Unit lock should be held by calling function.
   9369  */
   9370 
   9371 STATIC int
   9372 _field_th_egress_selcodes_install(int            unit,
   9373                                    _field_group_t *fg,
   9374                                    uint8          slice_num,
   9375                                    int            selcode_idx
   9376                                    )
   9377 {
   9378     int             inst;
   9379     uint8           idx; /* Index to EFP keys. */
   9380     _field_sel_t    *sel;
   9381     _field_stage_t  *stage_fc;
   9382     soc_reg_t       efp_classid_sel_reg;
   9383     soc_reg_t       efp_key4_dvp_reg;
   9384     soc_reg_t       efp_key4_mdl_reg;
   9385     soc_reg_t       efp_key8_dvp_reg;
   9386     soc_reg_t       efp_key4_class_reg;
   9387     soc_reg_t       efp_key8_class_reg;
   9388 
   9389 
   9390     if (NULL == fg) {
   9391         return BCM_E_PARAM;
   9392     }
   9393 
   9394     /* Max number of slices on Tomahawk for EFP is 4(slice 0 - slice 3) */
   9395     if (slice_num >= 4)  {
   9396         return BCM_E_INTERNAL;
   9397     }
   9398 
   9399     sel = &fg->sel_codes[selcode_idx];
   9400     if (sel == NULL) {
   9401        return BCM_E_INTERNAL;
   9402     }
   9403 
   9404     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id,
   9405                                                  &stage_fc));
   9406     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
   9407        inst = _FP_GLOBAL_INST;
   9408     } else {
   9409        inst = fg->instance;
   9410     }
   9411     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
   9412                                                        EFP_CLASSID_SELECTORr,
   9413                                                        inst,
   9414                                                        &efp_classid_sel_reg));
   9415     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
   9416                                                        EFP_KEY4_DVP_SELECTORr,
   9417                                                        inst,
   9418                                                        &efp_key4_dvp_reg));
   9419     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
   9420                                                        EFP_KEY4_MDL_SELECTORr,
   9421                                                        inst,
   9422                                                        &efp_key4_mdl_reg));
   9423 
   9424     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
   9425                                                        EFP_KEY8_DVP_SELECTORr,
   9426                                                        inst,
   9427                                                        &efp_key8_dvp_reg));
   9428 
   9429     if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   9430         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
   9431                                                         EFP_KEY4_L3_CLASSID_SELECTORr,
   9432                                                         inst,
   9433                                                         &efp_key4_class_reg));
   9434         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
   9435                                                         EFP_KEY8_L3_CLASSID_SELECTORr,
   9436                                                         inst,
   9437                                                         &efp_key8_class_reg));
   9438     }
   9439 
   9440     idx = 0;
   9441     /* Class Id Selector codes for different EFP keys (KEY1 - KEY8) */
   9442     if (sel->egr_class_f1_sel != _FP_SELCODE_DONT_CARE) {
   9443         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9444                                                    efp_classid_sel_reg,
   9445                                                    REG_PORT_ANY,
   9446                                                    classfldtbl[slice_num][idx],
   9447                                                    sel->egr_class_f1_sel
   9448                                                    ));
   9449     }
   9450 
   9451     idx++;
   9452     if (sel->egr_class_f2_sel != _FP_SELCODE_DONT_CARE) {
   9453         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9454                                                    efp_classid_sel_reg,
   9455                                                    REG_PORT_ANY,
   9456                                                    classfldtbl[slice_num][idx],
   9457                                                    sel->egr_class_f2_sel
   9458                                                    ));
   9459     }
   9460 
   9461     idx++;
   9462     if (sel->egr_class_f3_sel != _FP_SELCODE_DONT_CARE) {
   9463         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9464                                                    efp_classid_sel_reg,
   9465                                                    REG_PORT_ANY,
   9466                                                    classfldtbl[slice_num][idx],
   9467                                                    sel->egr_class_f3_sel
   9468                                                    ));
   9469     }
   9470 
   9471     idx++;
   9472     if (sel->egr_class_f4_sel != _FP_SELCODE_DONT_CARE) {
   9473         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9474                                                    efp_classid_sel_reg,
   9475                                                    REG_PORT_ANY,
   9476                                                    classfldtbl[slice_num][idx],
   9477                                                    sel->egr_class_f4_sel
   9478                                                    ));
   9479     }
   9480 
   9481     idx++;
   9482     if (sel->egr_class_f6_sel != _FP_SELCODE_DONT_CARE) {
   9483         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9484                                                    efp_classid_sel_reg,
   9485                                                    REG_PORT_ANY,
   9486                                                    classfldtbl[slice_num][idx],
   9487                                                    sel->egr_class_f6_sel
   9488                                                    ));
   9489     }
   9490 
   9491     idx++;
   9492     if (sel->egr_class_f7_sel != _FP_SELCODE_DONT_CARE) {
   9493         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9494                                                    efp_classid_sel_reg,
   9495                                                    REG_PORT_ANY,
   9496                                                    classfldtbl[slice_num][idx],
   9497                                                    sel->egr_class_f7_sel
   9498                                                    ));
   9499     }
   9500 
   9501     idx++;
   9502     if (sel->egr_class_f8_sel != _FP_SELCODE_DONT_CARE) {
   9503         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9504                                                    efp_classid_sel_reg,
   9505                                                    REG_PORT_ANY,
   9506                                                    classfldtbl[slice_num][idx],
   9507                                                    sel->egr_class_f8_sel
   9508                                                    ));
   9509     }
   9510 
   9511     /* SELECTOR CODES for EFP_KEY4_DVP_SELECTOR register */
   9512     if (sel->egr_key4_dvp_sel != _FP_SELCODE_DONT_CARE) {
   9513         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9514                                                    efp_key4_dvp_reg,
   9515                                                    REG_PORT_ANY,
   9516                                                    dvpfldtbl[slice_num],
   9517                                                    sel->egr_key4_dvp_sel
   9518                                                   ));
   9519     }
   9520     /* SELECTOR CODES for EFP_KEY8_DVP_SELECTOR register */
   9521     if (sel->egr_key8_dvp_sel != _FP_SELCODE_DONT_CARE) {
   9522         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9523                                                    efp_key8_dvp_reg,
   9524                                                    REG_PORT_ANY,
   9525                                                    dvpfldtbl[slice_num],
   9526                                                    sel->egr_key8_dvp_sel
   9527                                                   ));
   9528     }
   9529 
   9530     /* SELECTOR CODES for EFP_KEY4_MDL_SELECTOR register */
   9531     if (sel->egr_key4_mdl_sel != _FP_SELCODE_DONT_CARE) {
   9532         BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9533                                                    efp_key4_mdl_reg,
   9534                                                    REG_PORT_ANY,
   9535                                                    mdlfldtbl[slice_num],
   9536                                                    sel->egr_key4_mdl_sel
   9537                                                   ));
   9538     }
   9539 
   9540 #if defined (BCM_TOMAHAWK3_SUPPORT)
   9541     if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
   9542         /* SELECTOR CODES for EFP_KEY4_L3_CLASSID_SELECTOR register */
   9543         if (sel->egr_key4_l3_classId_sel != _FP_SELCODE_DONT_CARE) {
   9544             BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9545                                                        efp_key4_class_reg,
   9546                                                        REG_PORT_ANY,
   9547                                                        classIdBfldtbl[slice_num],
   9548                                                        sel->egr_key4_l3_classId_sel
   9549                                                       ));
   9550         }
   9551         /* SELECTOR CODES for EFP_KEY8_L3_CLASSID_SELECTOR register */
   9552         if (sel->egr_key8_l3_classId_sel != _FP_SELCODE_DONT_CARE) {
   9553             BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit,
   9554                                                        efp_key8_class_reg,
   9555                                                        REG_PORT_ANY,
   9556                                                        classIdBfldtbl[slice_num],
   9557                                                        sel->egr_key8_l3_classId_sel
   9558                                                       ));
   9559         }
   9560     }
   9561 #endif
   9562 
   9563     return (BCM_E_NONE);
   9564 }
   9565 
   9566 /*
   9567  * Function:
   9568  *     _bcm_field_th_lookup_selcodes_install
   9569  *
   9570  * Purpose:
   9571  *     Writes the field select codes (ie. FPFx).
   9572  *     for VFP (_BCM_FIELD_STAGE_LOOKUP) lookup stage.
   9573  *
   9574  * Parameters:
   9575  *     unit  - BCM device number
   9576  *     fs    - slice that needs its select codes written
   9577  *
   9578  * Returns:
   9579  *     BCM_E_XXX
   9580  */
   9581 
   9582 int
   9583 _bcm_field_th_lookup_selcodes_install(int             unit,
   9584                                        _field_group_t *fg,
   9585                                        uint8          slice_num,
   9586                                        int            selcode_idx)
   9587 {
   9588     static const soc_field_t s_type_fld_tbl[] = {
   9589         SLICE_0_S_TYPE_SELf,
   9590         SLICE_1_S_TYPE_SELf,
   9591         SLICE_2_S_TYPE_SELf,
   9592         SLICE_3_S_TYPE_SELf
   9593     };
   9594 
   9595     _field_sel_t * const sel = &fg->sel_codes[selcode_idx];
   9596     int           errcode = BCM_E_NONE;
   9597     uint64        regval;
   9598     uint64        val;
   9599     int           inst;
   9600     _field_stage_t  *stage_fc;
   9601     soc_reg_t     vfp_control_1_reg;
   9602     soc_reg_t     vfp_control_2_reg;
   9603 
   9604     /* Input parameters check. */
   9605     if (NULL == fg) {
   9606         return (BCM_E_PARAM);
   9607     }
   9608 
   9609     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id,
   9610                                                  &stage_fc));
   9611 
   9612     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
   9613        inst = _FP_GLOBAL_INST;
   9614     } else {
   9615        inst = fg->instance;
   9616     }
   9617 
   9618     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r,
   9619                                                     inst, &vfp_control_1_reg));
   9620     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_2r,
   9621                                                        inst, &vfp_control_2_reg));
   9622 
   9623     BCM_IF_ERROR_RETURN(soc_reg64_get(unit,
   9624                                       vfp_control_1_reg,
   9625                                       REG_PORT_ANY,
   9626                                       0,
   9627                                       &regval
   9628                                       ));
   9629 
   9630     if ((fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)
   9631         && (selcode_idx & 1)
   9632         ) {
   9633         if (sel->fpf2 != _FP_SELCODE_DONT_CARE) {
   9634             COMPILER_64_SET(val, 0, sel->fpf2);
   9635             soc_reg64_field_set(unit,
   9636                                 vfp_control_1_reg,
   9637                                 &regval,
   9638                                 _bcm_field_trx_vfp_double_wide_sel[slice_num],
   9639                                 val
   9640                                 );
   9641         }
   9642     } else {
   9643         if (sel->fpf2 != _FP_SELCODE_DONT_CARE) {
   9644             COMPILER_64_SET(val, 0, sel->fpf2);
   9645             soc_reg64_field_set(unit,
   9646                                 vfp_control_1_reg,
   9647                                 &regval,
   9648                                 _bcm_field_trx_vfp_field_sel[slice_num][0],
   9649                                 val
   9650                                 );
   9651         }
   9652         if (sel->fpf3 != _FP_SELCODE_DONT_CARE) {
   9653             COMPILER_64_SET(val, 0, sel->fpf3);
   9654             soc_reg64_field_set(unit,
   9655                                 vfp_control_1_reg,
   9656                                 &regval,
   9657                                 _bcm_field_trx_vfp_field_sel[slice_num][1],
   9658                                 val
   9659                                 );
   9660         }
   9661     }
   9662 
   9663 
   9664     if (sel->src_entity_sel != _FP_SELCODE_DONT_CARE) {
   9665         uint32 value;
   9666 
   9667 
   9668         switch (sel->src_entity_sel) {
   9669             case _bcmFieldFwdEntityPortGroupNum:
   9670                 value = 4;
   9671                 break;
   9672             case _bcmFieldFwdEntityMplsGport:
   9673             case _bcmFieldFwdEntityNivGport:
   9674             case _bcmFieldFwdEntityMimGport:
   9675             case _bcmFieldFwdEntityWlanGport:
   9676             case _bcmFieldFwdEntityVxlanGport:
   9677             case _bcmFieldFwdEntityVlanGport:
   9678                 value = 0;
   9679                 break;
   9680             case _bcmFieldFwdEntityModPortGport:
   9681                 value = 2;
   9682                 break;
   9683             case _bcmFieldFwdEntityGlp:
   9684                 value = 1;
   9685                 break;
   9686             default:
   9687                 return (BCM_E_INTERNAL);
   9688         }
   9689         COMPILER_64_SET(val, 0, value);
   9690         soc_reg64_field_set(unit,
   9691                             vfp_control_1_reg,
   9692                             &regval,
   9693                             s_type_fld_tbl[slice_num],
   9694                             val
   9695                             );
   9696     }
   9697 
   9698     BCM_IF_ERROR_RETURN(soc_reg64_set(unit,
   9699                                       vfp_control_1_reg,
   9700                                       REG_PORT_ANY,
   9701                                       0,
   9702                                       regval
   9703                                       )
   9704                         );
   9705 
   9706     /* Set inner/outer ip header selection. */
   9707     /* In TD3, vfp_key_control_2 register is not avaliable.
   9708      * we cannot match on Inner Ip header fields */
   9709     if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support) &&
   9710         sel->ip_header_sel != _FP_SELCODE_DONT_CARE) {
   9711         errcode = soc_reg_field32_modify(
   9712                       unit,
   9713                       vfp_control_2_reg,
   9714                       REG_PORT_ANY,
   9715                       _bcm_field_trx_vfp_ip_header_sel[slice_num],
   9716                       sel->ip_header_sel
   9717                       );
   9718     }
   9719 
   9720     return (errcode);
   9721 }
   9722 
   9723 /*
   9724  * Function:
   9725  *     _field_th_lookup_slice_clear
   9726  *
   9727  * Purpose:
   9728  *     Reset slice configuraton on group deletion event.
   9729  *
   9730  * Parameters:
   9731  *     unit  - BCM device number
   9732  *     fg    - Field group slice belongs to
   9733  *     fs    - Field slice structure.
   9734  *
   9735  * Returns:
   9736  *     BCM_E_NONE     - Success
   9737  *
   9738  * Note:
   9739  *     Unit lock should be held by calling function.
   9740  */
   9741 STATIC int
   9742 _field_th_lookup_slice_clear(int unit, _field_group_t *fg, _field_slice_t *fs)
   9743 {
   9744     uint64           reg_val;
   9745     int              rv;
   9746     int              inst;
   9747     int              slice_num;
   9748     _field_stage_t  *stage_fc;
   9749     soc_reg_t        vfp_control_1_reg;
   9750     soc_reg_t        vfp_control_2_reg;
   9751 
   9752     /* Input parameters check. */
   9753     if (NULL == fg || NULL == fs) {
   9754         return (BCM_E_PARAM);
   9755     }
   9756 
   9757     rv = _field_stage_control_get(unit, fg->stage_id, &stage_fc);
   9758     BCM_IF_ERROR_RETURN(rv);
   9759 
   9760     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
   9761        inst = _FP_GLOBAL_INST;
   9762     } else {
   9763        inst = fg->instance;
   9764     }
   9765 
   9766     slice_num = fs->slice_number;
   9767 
   9768     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r,
   9769                                                     inst, &vfp_control_1_reg));
   9770     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_2r,
   9771                                                        inst, &vfp_control_2_reg));
   9772 
   9773     BCM_IF_ERROR_RETURN(soc_reg64_get(unit,
   9774                                       vfp_control_1_reg,
   9775                                       REG_PORT_ANY,
   9776                                       0,
   9777                                       &reg_val
   9778                                       )
   9779                         );
   9780     soc_reg64_field32_set(unit,
   9781                           vfp_control_1_reg,
   9782                           &reg_val,
   9783                           _bcm_field_trx_vfp_double_wide_sel[slice_num],
   9784                           0
   9785                           );
   9786     soc_reg64_field32_set(unit,
   9787                           vfp_control_1_reg,
   9788                           &reg_val,
   9789                           _bcm_field_trx_vfp_field_sel[slice_num][0],
   9790                           0
   9791                           );
   9792     soc_reg64_field32_set(unit,
   9793                           vfp_control_1_reg,
   9794                           &reg_val,
   9795                           _bcm_field_trx_vfp_field_sel[slice_num][1],
   9796                           0
   9797                           );
   9798     soc_reg64_field32_set(unit,
   9799                           vfp_control_1_reg,
   9800                           &reg_val,
   9801                           _bcm_field_trx_slice_pairing_field[slice_num >> 1],
   9802                           0
   9803                           );
   9804     BCM_IF_ERROR_RETURN(soc_reg64_set(unit,
   9805                                       vfp_control_1_reg,
   9806                                       REG_PORT_ANY,
   9807                                       0,
   9808                                       reg_val
   9809                                       )
   9810                         );
   9811     /* In TD3, vfp_key_control_2 register is not avaliable.
   9812      * we cannot match on Inner Ip header fields */
   9813     if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) {
   9814         rv = soc_reg_field32_modify(unit,
   9815                                    vfp_control_2_reg,
   9816                                    REG_PORT_ANY,
   9817                                    _bcm_field_trx_vfp_ip_header_sel[slice_num],
   9818                                    0
   9819                                    );
   9820     }
   9821     return rv;
   9822 }
   9823 /*
   9824  * Function:
   9825  *     _bcm_field_th_selcodes_install
   9826  *
   9827  * Purpose:
   9828  *     Writes the field select codes (ie. FPFx).
   9829  *
   9830  * Parameters:
   9831  *     unit  - BCM device number
   9832  *     fs    - slice that needs its select codes written
   9833  *
   9834  * Returns:
   9835  *     BCM_E_INTERNAL - On read/write errors
   9836  *     BCM_E_NONE     - Success
   9837  *
   9838  * Note:
   9839  *     Unit lock should be held by calling function.
   9840  */
   9841 int
   9842 _bcm_field_th_selcodes_install(int unit, _field_group_t *fg,
   9843                                 uint8 slice_numb, bcm_pbmp_t pbmp,
   9844                                 int selcode_index)
   9845 {
   9846     int rv;    /* Operation return status. */
   9847 
   9848     /* Input parameters check. */
   9849     if (NULL == fg) {
   9850         return (BCM_E_PARAM);
   9851     }
   9852 
   9853     /* Set slice mode. Single/Double/Triple, Intraslice */
   9854     rv = _bcm_field_th_mode_set(unit, slice_numb, fg, fg->flags);
   9855     BCM_IF_ERROR_RETURN(rv);
   9856     switch (fg->stage_id) {
   9857       case _BCM_FIELD_STAGE_LOOKUP:
   9858           rv = _bcm_field_th_lookup_selcodes_install(unit, fg, slice_numb,
   9859                                                       selcode_index);
   9860           break;
   9861       case _BCM_FIELD_STAGE_EGRESS:
   9862 #if defined(BCM_TRIDENT3_SUPPORT)
   9863             if (soc_feature(unit, soc_feature_td3_style_fp)) {
   9864                 rv = _field_td3_egress_selcodes_install(unit, fg, slice_numb,
   9865                                                          selcode_index);
   9866             } else
   9867 #endif
   9868             {
   9869                 rv = _field_th_egress_selcodes_install(unit, fg, slice_numb,
   9870                                                          selcode_index);
   9871             }
   9872             break;
   9873       case _BCM_FIELD_STAGE_EXTERNAL:
   9874       case _BCM_FIELD_STAGE_INGRESS:
   9875       case _BCM_FIELD_STAGE_EXACTMATCH:
   9876       case _BCM_FIELD_STAGE_FLOWTRACKER:
   9877           rv = (BCM_E_NONE);
   9878           break;
   9879       default:
   9880           rv = (BCM_E_PARAM);
   9881     }
   9882     return (rv);
   9883 }
   9884 
   9885 /*
   9886  * Function:
   9887  *     _bcm_field_action_conf_get
   9888  * Purpose:
   9889  *     Get configuration structure of a field action in the given stage.
   9890  * Parameters:
   9891  *     unit     - (IN)  BCM device number.
   9892  *     stage_fc - (IN)  Stage field control strucutre.
   9893  *     action   - (IN)  Field Action.
   9894  *     ptr      - (OUT) FP action info.
   9895  * Returns:
   9896  *     BCM_E_XXX
   9897  */
   9898 int
   9899 _bcm_field_action_config_get(int unit, _field_stage_t *stage_fc,
   9900                              int action, _bcm_field_action_conf_t **ptr)
   9901 {
   9902 
   9903     /* Input parameters check. */
   9904     if (NULL == stage_fc || NULL == ptr ||
   9905         (action < 0) || (action > _bcmFieldActionCount)) {
   9906         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
   9907         return BCM_E_PARAM;
   9908     }
   9909 
   9910     if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) &&
   9911         (_BCM_FIELD_STAGE_EXACTMATCH != stage_fc->stage_id)) {
   9912         return BCM_E_INTERNAL;
   9913     }
   9914 
   9915     *ptr = stage_fc->f_action_arr[action];
   9916     if (NULL == *ptr) {
   9917         return BCM_E_UNAVAIL;
   9918     }
   9919 
   9920     return BCM_E_NONE;
   9921 }
   9922 /*
   9923  * Function:
   9924  *     _bcm_field_action_offset_get
   9925  * Purpose:
   9926  *     Get offset info of a field action for the given stage and flags.
   9927  * Parameters:
   9928  *     unit     - (IN)  BCM device number.
   9929  *     stage_fc - (IN)  Stage field control strucutre.
   9930  *     action   - (IN)  Field Action.
   9931  *     ptr      - (OUT) FP action offset info.
   9932  *     flags    - (IN)  Field Actions Flags of type _BCM_FIELD_ACTION_XXX.
   9933  * Returns:
   9934  *     BCM_E_XXX
   9935  */
   9936 int
   9937 _bcm_field_action_offset_get(int unit, _field_stage_t *stage_fc,
   9938                             _bcm_field_internal_action_t action,
   9939                                 _bcm_field_action_offset_t *ptr,
   9940                                                    uint32 flags)
   9941 {
   9942     uint32 found; /* Indicates action offset existance.*/
   9943     _bcm_field_action_conf_t   *aconf;  /* Action config structure. */
   9944     _bcm_field_action_offset_t *offset; /* Field Action Offset Iformation. */
   9945 
   9946     /* Input parameters check. */
   9947     if (NULL == stage_fc || NULL == ptr ||
   9948         (action < 0) || (action > _bcmFieldActionCount)) {
   9949         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
   9950         return BCM_E_PARAM;
   9951     }
   9952 
   9953     if ((_BCM_FIELD_STAGE_INGRESS != stage_fc->stage_id) &&
   9954         (_BCM_FIELD_STAGE_EXACTMATCH != stage_fc->stage_id)) {
   9955         return BCM_E_INTERNAL;
   9956     }
   9957 
   9958     aconf = stage_fc->f_action_arr[action];
   9959     if (NULL == aconf) {
   9960         return BCM_E_UNAVAIL;
   9961     }
   9962 
   9963     found = 0;
   9964     offset = aconf->offset;
   9965     do {
   9966         if (flags == (offset->flags & flags)) {
   9967             sal_memset(ptr, 0, sizeof(_bcm_field_action_offset_t));
   9968             sal_memcpy(ptr, offset, sizeof(_bcm_field_action_offset_t));
   9969             found = 1;
   9970             break;
   9971         }
   9972         offset = offset->next;
   9973     } while (NULL != offset);
   9974 
   9975     if (!found) {
   9976         LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
   9977                 "Action offset info for flags %d is not available.\n"), flags));
   9978         return BCM_E_UNAVAIL;
   9979     }
   9980 
   9981     return BCM_E_NONE;
   9982 }
   9983 
   9984 STATIC int
   9985 _field_th_ingress_action_support_check(int unit, unsigned stage,
   9986                                        bcm_field_action_t action)
   9987 {
   9988     int rv;  /* Operation return status. */
   9989     _field_stage_t *stage_fc; /* Field Stage Structure. */
   9990     _bcm_field_action_conf_t *aconf; /* Field Action config structure. */
   9991 
   9992     rv = _field_stage_control_get(unit, stage, &stage_fc);
   9993     BCM_IF_ERROR_RETURN(rv);
   9994 
   9995     return _bcm_field_action_config_get(unit, stage_fc, action, &aconf);
   9996 }
   9997 
   9998 /*
   9999  * Function:
  10000  *     _field_th_stage_action_support_check
  10001  * Purpose:
  10002  *     Check if action is supported by tomahawk for the given stage.
  10003  * Parameters:
  10004  *     unit     - (IN) BCM device number.
  10005  *     stage    - (IN) Field processor stage.
  10006  *     action   - (IN) Action to check(bcmFieldActionXXX)
  10007  *     result   - (OUT)
  10008  *               TRUE   - action is supported by device
  10009  *               FALSE  - action is NOT supported by device
  10010  * Returns:
  10011  *     BCM_E_XXX
  10012  */
  10013 int
  10014 _field_th_stage_action_support_check(int unit,
  10015                                      unsigned stage,
  10016                                      bcm_field_action_t action,
  10017                                      int *result)
  10018 {
  10019 
  10020     if (NULL == result) {
  10021         return BCM_E_PARAM;
  10022     }
  10023 
  10024     if ((_BCM_FIELD_STAGE_INGRESS == stage) ||
  10025         (_BCM_FIELD_STAGE_EXACTMATCH == stage)) {
  10026 
  10027         if (BCM_SUCCESS(_field_th_ingress_action_support_check(unit, stage, action))) {
  10028             *result = TRUE;
  10029         } else {
  10030             *result = FALSE;
  10031         }
  10032 
  10033         return BCM_E_NONE;
  10034     }
  10035 
  10036     switch (action) {
  10037         case bcmFieldActionHiGigDstModuleGportNew:
  10038         case bcmFieldActionHiGigDstPortGportNew:
  10039         case bcmFieldActionHiGigDstGportNew:
  10040         case bcmFieldActionGpHiGigDropPrecedenceNew:
  10041         case bcmFieldActionYpHiGigDropPrecedenceNew:
  10042         case bcmFieldActionRpHiGigDropPrecedenceNew:
  10043         case bcmFieldActionHiGigDropPrecedenceNew:
  10044         case bcmFieldActionGpHiGigIntPriNew:
  10045         case bcmFieldActionYpHiGigIntPriNew:
  10046         case bcmFieldActionRpHiGigIntPriNew:
  10047         case bcmFieldActionHiGigIntPriNew:
  10048         case bcmFieldActionLoopbackSrcModuleGportNew:
  10049         case bcmFieldActionLoopbackSrcPortGportNew:
  10050         case bcmFieldActionLoopbackSrcGportNew:
  10051         case bcmFieldActionLoopbackCpuMasqueradePktProfileNew:
  10052         case bcmFieldActionLoopBackTypeNew:
  10053             *result = (stage == _BCM_FIELD_STAGE_EGRESS);
  10054             return (BCM_E_NONE);
  10055         case bcmFieldActionLoopbackPacketProcessingPortNew:
  10056             *result = ((0 == soc_feature(unit, soc_feature_td3_style_fp)) && (stage == _BCM_FIELD_STAGE_EGRESS));
  10057             return (BCM_E_NONE);
  10058         case bcmFieldActionClassZero:
  10059         case bcmFieldActionClassOne:
  10060             *result = (stage == _BCM_FIELD_STAGE_CLASS);
  10061             return (BCM_E_NONE);
  10062         case bcmFieldActionHashSelect0:
  10063         case bcmFieldActionHashSelect1:
  10064             *result = (stage == _BCM_FIELD_STAGE_LOOKUP);
  10065             return (BCM_E_NONE);
  10066         case bcmFieldActionMplsLabel1ExpNew:
  10067             if (SOC_IS_TOMAHAWK2(unit) ||
  10068                 SOC_IS_TOMAHAWK3(unit) || SOC_IS_TRIDENT3X(unit)) {
  10069                 *result = (stage == _BCM_FIELD_STAGE_EGRESS);
  10070             } else {
  10071                 *result = FALSE;
  10072             }
  10073             return BCM_E_NONE;
  10074 #if defined(BCM_FLOWTRACKER_SUPPORT)
  10075         case bcmFieldActionFlowtrackerGroupId:
  10076         case bcmFieldActionFlowtrackerEnable:
  10077         case bcmFieldActionFlowtrackerNewLearnEnable:
  10078             *result = (stage == _BCM_FIELD_STAGE_FLOWTRACKER);
  10079             return BCM_E_NONE;
  10080 #endif
  10081         default:
  10082         ;
  10083     }
  10084 
  10085     return (_bcm_field_td2_stage_action_support_check(unit, stage,
  10086                                                       action, result));
  10087 }
  10088 
  10089 /*
  10090  * Function:
  10091  *     _bcm_field_th_stage_action_support_check
  10092  * Purpose:
  10093  *     Check if action is supported by tomahawk for the given stage.
  10094  * Parameters:
  10095  *     unit     - (IN) BCM device number.
  10096  *     stage    - (IN) Field processor stage.
  10097  *     action   - (IN) Action to check(bcmFieldActionXXX)
  10098  *     result   - (OUT)
  10099  *               TRUE   - action is supported by device
  10100  *               FALSE  - action is NOT supported by device
  10101  * Returns:
  10102  *     BCM_E_XXX
  10103  */
  10104 int
  10105 _bcm_field_th_stage_action_support_check(int unit,
  10106                                          unsigned stage,
  10107                                          bcm_field_action_t action,
  10108                                          int *result)
  10109 {
  10110 #if defined (BCM_TOMAHAWK3_SUPPORT)
  10111     if (SOC_IS_TOMAHAWK3(unit)) {
  10112         return (_field_th3_stage_action_support_check(unit,
  10113                                                      stage,
  10114                                                      action,
  10115                                                      result));
  10116     }
  10117 #endif
  10118     return _field_th_stage_action_support_check(unit, stage, action, result);
  10119 }
  10120 
  10121 /*
  10122  * Function:
  10123  *     _bcm_field_th_action_support_check
  10124  * Purpose:
  10125  *     Check if action is supported by tomahawk for the given stage.
  10126  * Parameters:
  10127  *     unit     - (IN) BCM device number.
  10128  *     f_ent    - (IN) Field entry structure to get policy info from.
  10129  *     action   - (IN) Action to check(bcmFieldActionXXX)
  10130  *     result   - (OUT)
  10131  *               TRUE   - action is supported by device
  10132  *               FALSE  - action is NOT supported by device
  10133  * Returns:
  10134  *     BCM_E_XXX
  10135  */
  10136 int
  10137 _bcm_field_th_action_support_check(int unit,
  10138                                    _field_entry_t *f_ent,
  10139                                    bcm_field_action_t action,
  10140                                    int *result)
  10141 {
  10142     return _bcm_field_th_stage_action_support_check(unit,
  10143                                                     f_ent->group->stage_id,
  10144                                                     action, result);
  10145 }
  10146 
  10147 /*
  10148  * Function:
  10149  *     _bcm_field_th_mirror_resolve
  10150  * Purpose:
  10151  *     Resolve mirroring destination & enable mirroring for rule matching
  10152  *     packets.
  10153  * Parameters:
  10154  *     unit     - (IN) BCM device number
  10155  *     f_ent    - (IN) Entry structure to get policy info from
  10156  *     fa       - (IN) field action
  10157  *     params   - (OUT) Field Action params structure.
  10158  * Returns:
  10159  *     BCM_E_XXX
  10160  */
  10161 int
  10162 _bcm_field_th_mirror_resolve(int unit,
  10163                              _field_entry_t *f_ent,
  10164                              _field_action_t *fa,
  10165                              _field_action_params_t *params)
  10166 {
  10167     int rv;             /* Operation return status.       */
  10168     int mtp_index;      /* Index to IM_MIRROR_CONTROL.    */
  10169     int mtp_type_index; /* Bit position in MIRROR field.  */
  10170     int flexibleMirror; /* Flag to indicate flexible mirroring status. */
  10171     int directedMirror; /* Flag to indicate directed mirroring status. */
  10172 
  10173     /* Input parameters check. */
  10174     if (NULL == f_ent || NULL == fa || NULL == params) {
  10175         return (BCM_E_PARAM);
  10176     }
  10177 
  10178     mtp_index = fa->hw_index;
  10179     mtp_type_index = mtp_index;
  10180 
  10181     /* shifting the index back since flexible slot shift was done
  10182      * prior to this
  10183      */
  10184     rv = bcm_esw_switch_control_get(unit,bcmSwitchFlexibleMirrorDestinations,
  10185                                                             &flexibleMirror);
  10186     BCM_IF_ERROR_RETURN(rv);
  10187 
  10188     rv = bcm_esw_switch_control_get(unit,bcmSwitchDirectedMirroring,
  10189                                                    &directedMirror);
  10190     BCM_IF_ERROR_RETURN(rv);
  10191 
  10192     if (soc_feature(unit, soc_feature_mirror_flexible)
  10193         && flexibleMirror && directedMirror) {
  10194         mtp_index = (fa->hw_index & BCM_MIRROR_MTP_FLEX_SLOT_MASK);
  10195         mtp_type_index = ((fa->hw_index >> BCM_MIRROR_MTP_FLEX_SLOT_SHIFT)
  10196                            & BCM_MIRROR_MTP_FLEX_SLOT_MASK);
  10197     }
  10198 
  10199     /* For Tomahawk Ingress and Egress Mirror together supports 4 MTP's. */
  10200     if (mtp_type_index >= 4) {
  10201         fa->hw_index = _FP_INVALID_INDEX;
  10202         return (BCM_E_INTERNAL);
  10203     }
  10204 
  10205 
  10206     params->mtp_index = mtp_index;
  10207     params->mtp_type_index = mtp_type_index;
  10208 
  10209     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters: ")));
  10210     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10211                                   "MTP Index = %d, "), params->mtp_index));
  10212     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10213                         "MTP Type Index = %d, "), params->mtp_type_index));
  10214 
  10215     return (BCM_E_NONE);
  10216 }
  10217 /*
  10218  * Function:
  10219  *     _bcm_field_th_cosq_resolve
  10220  * Purpose:
  10221  *     Resolve field action parameters for cosq actions.
  10222  * Parameters:
  10223  *     unit     - (IN) BCM device number
  10224  *     f_ent    - (IN) Field entry structure.
  10225  *     fa       - (IN) Field action structure.
  10226  *     params   - (OUT) Field Action params structure.
  10227  * Returns:
  10228  *     BCM_E_XXX
  10229  */
  10230 int
  10231 _bcm_field_th_cosq_resolve(int unit, _field_entry_t *f_ent,
  10232                                        _field_action_t *fa,
  10233                             _field_action_params_t *params)
  10234 {
  10235     int    rv;         /* Operation return status.   */
  10236     int    cosq_new;   /* New Cosq Value.            */
  10237     uint32 cosq;       /* Cosq Value passed by User. */
  10238 
  10239     if (NULL == f_ent || NULL == fa || NULL == params) {
  10240         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10241         return BCM_E_PARAM;
  10242     }
  10243 
  10244     cosq = fa->param[0];
  10245     cosq_new = -1;
  10246     switch (fa->action) {
  10247         case bcmFieldActionCosQNew:
  10248         case bcmFieldActionGpCosQNew:
  10249         case bcmFieldActionYpCosQNew:
  10250         case bcmFieldActionRpCosQNew:
  10251         case bcmFieldActionUcastCosQNew:
  10252         case bcmFieldActionGpUcastCosQNew:
  10253         case bcmFieldActionYpUcastCosQNew:
  10254         case bcmFieldActionRpUcastCosQNew:
  10255             if (BCM_GPORT_IS_UCAST_QUEUE_GROUP(cosq)) {
  10256                 rv = _bcm_th_cosq_index_resolve(unit, cosq, 0,
  10257                         _BCM_TH_COSQ_INDEX_STYLE_UCAST_QUEUE, NULL,
  10258                         &cosq_new, NULL);
  10259                 BCM_IF_ERROR_RETURN(rv);
  10260             } else {
  10261                 cosq_new = cosq;
  10262             }
  10263             break;
  10264         case bcmFieldActionMcastCosQNew:
  10265         case bcmFieldActionGpMcastCosQNew:
  10266         case bcmFieldActionYpMcastCosQNew:
  10267         case bcmFieldActionRpMcastCosQNew:
  10268             if (BCM_GPORT_IS_MCAST_QUEUE_GROUP(cosq)) {
  10269                 rv = _bcm_th_cosq_index_resolve(unit, cosq, 0,
  10270                          _BCM_TH_COSQ_INDEX_STYLE_MCAST_QUEUE, NULL,
  10271                          &cosq_new, NULL);
  10272                 BCM_IF_ERROR_RETURN(rv);
  10273             } else {
  10274                 cosq_new = cosq;
  10275             }
  10276             break;
  10277         case bcmFieldActionCosMapNew:
  10278         case bcmFieldActionGpCosMapNew:
  10279         case bcmFieldActionYpCosMapNew:
  10280         case bcmFieldActionRpCosMapNew:
  10281             if (_BCM_COSQ_CLASSIFIER_IS_FIELD(cosq)) {
  10282                 cosq_new = _BCM_COSQ_CLASSIFIER_FIELD_GET(cosq);
  10283             }
  10284             break;
  10285         default:
  10286             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10287                         "%s can't be resolved.\n"), action_name[fa->action]));
  10288             return BCM_E_UNAVAIL;
  10289     }
  10290 
  10291     if (-1 == cosq_new) {
  10292         return BCM_E_PARAM;
  10293     }
  10294 
  10295     params->cosq_new = cosq_new;
  10296 
  10297     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10298                 "Resolved Parameters:\n cosq_new = %d \n"), params->cosq_new));
  10299     return BCM_E_NONE;
  10300 }
  10301 /*
  10302  * Function:
  10303  *     _bcm_field_th_fabric_tag_resolve
  10304  * Purpose:
  10305  *     Resolve field action parameters for action bcmFieldActionFabricQueue.
  10306  * Parameters:
  10307  *     unit     - (IN) BCM device number
  10308  *     f_ent    - (IN) Field entry structure.
  10309  *     fa       - (IN) Field action structure.
  10310  *     params   - (OUT) Field Action params structure.
  10311  * Returns:
  10312  *     BCM_E_XXX
  10313  */
  10314 int _bcm_field_th_fabric_tag_resolve(int unit, _field_entry_t *f_ent,
  10315                                                  _field_action_t *fa,
  10316                                       _field_action_params_t *params)
  10317 {
  10318     uint8 fabric_tag_type; /* Fabric Tag Type. */
  10319     uint32 in_flags;       /* Incoming Fabric Queue Flags. */
  10320     uint32 fabric_tag;     /* Fabric Tag Value. */
  10321 
  10322     if (NULL == f_ent || NULL == fa || NULL == params) {
  10323         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10324         return BCM_E_PARAM;
  10325     }
  10326 
  10327     in_flags = fa->param[0];
  10328 
  10329     if ((in_flags & BCM_FABRIC_QUEUE_QOS_BASE)  &&
  10330         (in_flags & BCM_FABRIC_QUEUE_DEST_OFFSET)) {
  10331         return (BCM_E_PARAM);
  10332     }
  10333 
  10334     if (in_flags &
  10335          ~(BCM_FABRIC_QUEUE_CUSTOMER |
  10336            BCM_FABRIC_QUEUE_QOS_BASE |
  10337            BCM_FABRIC_QUEUE_DEST_OFFSET |
  10338            0xffff)) {
  10339         return (BCM_E_PARAM);
  10340     }
  10341 
  10342     /* Tag type resolution. */
  10343     if (in_flags & BCM_FABRIC_QUEUE_QOS_BASE) {
  10344         fabric_tag_type = 0x3;  /* Offset to base queue number from the
  10345                                    QUEUE_MAP Table. Index into QUEUE_MAP
  10346                                    Table is {DST_MODID, DST_PID} */
  10347     } else if (in_flags & BCM_FABRIC_QUEUE_DEST_OFFSET) {
  10348         fabric_tag_type = 0x2;  /* Index into QUEUE_MAP Table used
  10349                                    for lookup.*/
  10350     } else {
  10351         fabric_tag_type = 0x1;  /* Explicit queue number. */
  10352     }
  10353 
  10354     fabric_tag = in_flags & 0xffff;
  10355 
  10356     params->fabric_tag_type = fabric_tag_type;
  10357     params->fabric_tag = fabric_tag;
  10358 
  10359     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n")));
  10360     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10361                                "fabric_tag_type = %d \n fabric_tag = %d\n"),
  10362                                params->fabric_tag_type, params->fabric_tag));
  10363     return BCM_E_NONE;
  10364 }
  10365 /*
  10366  * Function:
  10367  *     _bcm_field_th_i2e_class_resolve
  10368  * Purpose:
  10369  *     Resolve field action parameters for action
  10370  *     bcmFieldActionEgressClassSelect.
  10371  * Parameters:
  10372  *     unit     - (IN) BCM device number
  10373  *     f_ent    - (IN) Field entry structure.
  10374  *     fa       - (IN) Field action structure.
  10375  *     params   - (OUT) Field Action params structure.
  10376  * Returns:
  10377  *     BCM_E_XXX
  10378  */
  10379 int
  10380 _bcm_field_th_i2e_class_resolve(int unit, _field_entry_t *f_ent,
  10381                                             _field_action_t *fa,
  10382                                  _field_action_params_t *params)
  10383 {
  10384     uint32 i2e_cl_sel; /* Ingress to Egress Class Selector. */
  10385 
  10386     if (NULL == f_ent || NULL == fa || NULL == params) {
  10387         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10388         return BCM_E_PARAM;
  10389     }
  10390 
  10391     switch (fa->param[0]) {
  10392         case BCM_FIELD_EGRESS_CLASS_SELECT_PORT:
  10393             i2e_cl_sel = 0x1;
  10394             break;
  10395         case BCM_FIELD_EGRESS_CLASS_SELECT_SVP:
  10396             i2e_cl_sel = 0x2;
  10397             break;
  10398         case BCM_FIELD_EGRESS_CLASS_SELECT_L3_IIF:
  10399             i2e_cl_sel = 0x3;
  10400             break;
  10401         case BCM_FIELD_EGRESS_CLASS_SELECT_FIELD_SRC:
  10402             i2e_cl_sel = 0x4; /* VFP hi */
  10403             break;
  10404         case BCM_FIELD_EGRESS_CLASS_SELECT_FIELD_DST:
  10405             i2e_cl_sel = 0x5; /* VFP lo */
  10406             break;
  10407         case BCM_FIELD_EGRESS_CLASS_SELECT_L2_SRC:
  10408             i2e_cl_sel = 0x6;
  10409             break;
  10410         case BCM_FIELD_EGRESS_CLASS_SELECT_L2_DST:
  10411             i2e_cl_sel = 0x7;
  10412             break;
  10413         case BCM_FIELD_EGRESS_CLASS_SELECT_L3_SRC:
  10414             i2e_cl_sel = 0x8;
  10415             break;
  10416         case BCM_FIELD_EGRESS_CLASS_SELECT_L3_DST:
  10417             i2e_cl_sel = 0x9;
  10418             break;
  10419         case BCM_FIELD_EGRESS_CLASS_SELECT_VLAN:
  10420             i2e_cl_sel = 0xa;
  10421             break;
  10422         case BCM_FIELD_EGRESS_CLASS_SELECT_VRF:
  10423             i2e_cl_sel = 0xb;
  10424             break;
  10425         case BCM_FIELD_EGRESS_CLASS_SELECT_NEW:
  10426             i2e_cl_sel = 0xf;
  10427             break;
  10428         default:
  10429             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10430                         "Invalid i2e class selector: %d.\n"), fa->param[0]));
  10431             return (BCM_E_PARAM);
  10432     }
  10433 
  10434     params->i2e_cl_sel = i2e_cl_sel;
  10435     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10436              "Resolved Parameters:\n i2e_cl_sel = %d \n"), params->i2e_cl_sel));
  10437     return BCM_E_NONE;
  10438 }
  10439 /*
  10440  * Function:
  10441  *     _bcm_field_th_i2e_hg_class_resolve
  10442  * Purpose:
  10443  *     Resolve field action parameters for action bcmFieldActionHiGigClassSelect
  10444  * Parameters:
  10445  *     unit     - (IN) BCM device number
  10446  *     f_ent    - (IN) Field entry structure.
  10447  *     fa       - (IN) Field action structure.
  10448  *     params   - (OUT) Field Action params structure.
  10449  * Returns:
  10450  *     BCM_E_XXX
  10451  */
  10452 int
  10453 _bcm_field_th_i2e_hg_class_resolve(int unit, _field_entry_t *f_ent,
  10454                                                _field_action_t *fa,
  10455                                     _field_action_params_t *params)
  10456 {
  10457     uint32 i2e_hg_cl_sel; /* Ingress to Egress HiGiG Class selector. */
  10458 
  10459     if (NULL == f_ent || NULL == fa || NULL == params) {
  10460         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10461         return BCM_E_PARAM;
  10462     }
  10463 
  10464     switch (fa->param[0]) {
  10465         case BCM_FIELD_HIGIG_CLASS_SELECT_EGRESS:
  10466             i2e_hg_cl_sel = 1;
  10467             break;
  10468         case BCM_FIELD_HIGIG_CLASS_SELECT_PORT:
  10469             i2e_hg_cl_sel = 4;
  10470             break;
  10471         default:
  10472             /* Invalid parameter should have been caught earlier */
  10473             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10474                      "Invalid i2e higig class selector: %d.\n"), fa->param[0]));
  10475             return (BCM_E_PARAM);
  10476     }
  10477 
  10478     params->i2e_hg_cl_sel = i2e_hg_cl_sel;
  10479     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n")));
  10480     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10481                               "i2e_hg_cl_sel = %d \n"), params->i2e_hg_cl_sel));
  10482     return BCM_E_NONE;
  10483 }
  10484 #ifdef INCLUDE_L3
  10485 /*
  10486  * Function:
  10487  *     _bcm_field_th_nat_resolve
  10488  * Purpose:
  10489  *     Resolve field action parameters for actions in IFP_NAT_SET.
  10490  * Parameters:
  10491  *     unit     - (IN) BCM device number
  10492  *     f_ent    - (IN) Field entry structure.
  10493  *     fa       - (IN) Field action structure.
  10494  *     params   - (OUT) Field Action params structure.
  10495  * Returns:
  10496  *     BCM_E_XXX
  10497  */
  10498 int
  10499 _bcm_field_th_nat_resolve(int unit, _field_entry_t *f_ent,
  10500                                       _field_action_t *fa,
  10501                            _field_action_params_t *params)
  10502 {
  10503     int32 hw_idx;
  10504     int32 hw_half;
  10505 
  10506     if (NULL == f_ent || NULL == fa || NULL == params) {
  10507         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10508         return BCM_E_PARAM;
  10509     }
  10510 
  10511     hw_idx = hw_half = 0;
  10512     BCM_L3_NAT_EGRESS_HW_IDX_GET(fa->param[0], hw_idx, hw_half);
  10513     if ((hw_idx < 0) || (hw_idx > soc_mem_index_max(unit,
  10514                                   EGR_NAT_PACKET_EDIT_INFOm))) {
  10515        LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Invalid Parameters.\n")));
  10516        return BCM_E_PARAM;
  10517     }
  10518 
  10519     params->hw_idx = hw_idx;
  10520     params->hw_half = hw_half;
  10521 
  10522     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n")));
  10523     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10524                                           "hw_idx = %d \n hw_half = %d \n"),
  10525                                            params->hw_idx, params->hw_half));
  10526     return BCM_E_NONE;
  10527 
  10528 }
  10529 #endif
  10530 /*
  10531  * Function:
  10532  *     _bcm_field_th_redirect_resolve
  10533  * Purpose:
  10534  *     Resolve field action parameters for actions in IFP_REDIRECT_SET.
  10535  * Parameters:
  10536  *     unit     - (IN) BCM device number
  10537  *     f_ent    - (IN) Field entry structure.
  10538  *     fa       - (IN) Field action structure.
  10539  *     params   - (OUT) Field Action params structure.
  10540  * Returns:
  10541  *     BCM_E_XXX
  10542  */
  10543 int
  10544 _bcm_field_th_redirect_resolve(int unit, _field_entry_t *f_ent,
  10545                                            _field_action_t *fa,
  10546                                 _field_action_params_t *params)
  10547 {
  10548     int    nh_ecmp_id;   /* Next Hop or ECMP Id. */
  10549     uint8  is_dvp;       /* Redirect to DVP. */
  10550     uint8  is_trunk;     /* Redirect to Trunk. */
  10551     uint8  eh_tag_mask_index;      /* Pointer to the EH_MASK_PROFILE_TABLE. */
  10552     uint8  ucast_redirect_control; /* Unicast Redirection Control. */
  10553     uint8  mcast_redirect_control; /* Multicast Redirection Control. */
  10554     uint32 flags;                  /* Field Action Flags. */
  10555     uint32 redir_field;            /* Dest object to redirect the packet. */
  10556     uint32 eh_tag;                 /* HiGiG extended header. */
  10557 #ifdef INCLUDE_L3
  10558     int    ifp_type = 0;           /* Egress object entry type. */
  10559 #endif
  10560 
  10561     if (NULL == fa || NULL == f_ent || NULL == params) {
  10562         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10563         return (BCM_E_PARAM);
  10564     }
  10565 
  10566     nh_ecmp_id = -1;
  10567     is_dvp = 0;
  10568     is_trunk = 0;
  10569     ucast_redirect_control = 0;
  10570     mcast_redirect_control = 0;
  10571     flags = 0;
  10572     redir_field = 0;
  10573     eh_tag = 0;
  10574     eh_tag_mask_index = 0;
  10575 
  10576     switch (fa->action) {
  10577         case bcmFieldActionRedirect: /* param0 = modid, param1 = port*/
  10578             ucast_redirect_control = 0x6;
  10579             if (BCM_GPORT_IS_MPLS_PORT(fa->param[1])) {
  10580                 redir_field = BCM_GPORT_MPLS_PORT_ID_GET((int)fa->param[1]);
  10581                 is_dvp = 1;
  10582             } else if (BCM_GPORT_IS_MIM_PORT(fa->param[1])) {
  10583                 redir_field = BCM_GPORT_MIM_PORT_ID_GET((int)fa->param[1]);
  10584                 is_dvp = 1;
  10585             } else if (BCM_GPORT_IS_VXLAN_PORT(fa->param[1])) {
  10586                 redir_field = BCM_GPORT_VXLAN_PORT_ID_GET((int)fa->param[1]);
  10587                 is_dvp = 1;
  10588             } else if (BCM_GPORT_IS_FLOW_PORT(fa->param[1])) {
  10589                 redir_field = BCM_GPORT_FLOW_PORT_ID_GET((int)fa->param[1]);
  10590                 is_dvp = 1;
  10591             } else if (BCM_GPORT_IS_TRILL_PORT(fa->param[1])) {
  10592                 redir_field = BCM_GPORT_TRILL_PORT_ID_GET((int)fa->param[1]);
  10593                 is_dvp = 1;
  10594             } else if (BCM_GPORT_IS_L2GRE_PORT(fa->param[1])) {
  10595                 redir_field = BCM_GPORT_L2GRE_PORT_ID_GET((int)fa->param[1]);
  10596                 is_dvp = 1;
  10597             } else if (BCM_GPORT_IS_NIV_PORT(fa->param[1])) {
  10598                 redir_field = BCM_GPORT_NIV_PORT_ID_GET((int)fa->param[1]);
  10599                 is_dvp = 1;
  10600             } else {
  10601                 redir_field = ((fa->param[0] & 0xff) << 8);
  10602                 redir_field |= (fa->param[1] & 0xff);
  10603                 ucast_redirect_control = 0x0;
  10604                 is_trunk = 0;
  10605             }
  10606             break;
  10607         case bcmFieldActionRedirectTrunk: /* param0 = trunk ID */
  10608 #if defined(BCM_TRIDENT2_SUPPORT) && defined(INCLUDE_L3)
  10609             if (soc_feature(unit, soc_feature_vp_lag)) {
  10610                 int tid_is_vp_lag = 0;
  10611                 int vp = -1;
  10612                 int vp_id_min = -1;
  10613                 int rv = BCM_E_NONE;
  10614                 rv = _bcm_esw_trunk_id_is_vp_lag(unit, fa->param[0],
  10615                                                  &tid_is_vp_lag);
  10616                 BCM_IF_ERROR_RETURN(rv);
  10617 
  10618                 if (tid_is_vp_lag) {
  10619 
  10620                     rv = _bcm_esw_trunk_tid_to_vp_lag_vp(unit,
  10621                                                          fa->param[0], &vp);
  10622                     BCM_IF_ERROR_RETURN(rv);
  10623 
  10624                     if (_bcm_vp_used_get(unit, vp, _bcmVpTypeVpLag)) {
  10625                         rv =_bcm_esw_trunk_chip_info_vp_resource_get(unit,
  10626                                                                  &vp_id_min,
  10627                                                                  NULL, NULL);
  10628                         BCM_IF_ERROR_RETURN(rv);
  10629                         redir_field = fa->param[0] - vp_id_min;
  10630                         is_dvp = 1;
  10631                     } else {
  10632                         return BCM_E_PARAM;
  10633                     }
  10634                 } else {
  10635                     redir_field = fa->param[0];
  10636                 }
  10637             } else
  10638 #endif
  10639             {
  10640                 redir_field = fa->param[0];
  10641             }
  10642             ucast_redirect_control = 0;
  10643             is_trunk = 1;
  10644             break;
  10645         case bcmFieldActionRedirectCancel:
  10646             break;
  10647         case bcmFieldActionRedirectPbmp:
  10648             redir_field = fa->hw_index;
  10649             mcast_redirect_control = 0x0;
  10650             break;
  10651         case bcmFieldActionEgressMask:
  10652             redir_field = fa->hw_index;
  10653             break;
  10654         case bcmFieldActionEgressPortsAdd:
  10655             redir_field = fa->hw_index;
  10656             break;
  10657         case bcmFieldActionFabricEHAddOrUpdate:
  10658             eh_tag = fa->param[0];
  10659             eh_tag_mask_index = fa->hw_index;
  10660             break;
  10661 #ifdef INCLUDE_L3
  10662         case bcmFieldActionRedirectIpmc:
  10663             if (soc_feature(unit, soc_feature_field_action_redirect_ipmc)) {
  10664                 if (_BCM_MULTICAST_IS_SET(fa->param[0])) {
  10665                     redir_field = _BCM_MULTICAST_ID_GET(fa->param[0]);
  10666                 } else {
  10667                     redir_field = fa->param[0];
  10668                 }
  10669             } else {
  10670                 redir_field = fa->hw_index;
  10671             }
  10672             mcast_redirect_control = 0x3;
  10673             break;
  10674         case bcmFieldActionRedirectEgrNextHop:
  10675             if ((!soc_feature(unit, soc_feature_nh_for_ifp_actions)) &&
  10676                 (fa->param[1] == bcmFieldRedirectTypeAll)) {
  10677                return BCM_E_UNAVAIL;
  10678             }
  10679 
  10680             /* Get next hop info from Egress Object ID param */
  10681             BCM_IF_ERROR_RETURN
  10682               (_bcm_field_l3_egr_object_ifp_type_index_get(unit, fa->param[0],
  10683                                          &ifp_type, &flags, &nh_ecmp_id));
  10684             /* Valid redirect type param */
  10685             if (!(((fa->param[1] == bcmFieldRedirectTypeAll) &&
  10686                  (ifp_type == TRUE)) ||
  10687                 ((fa->param[1] == bcmFieldRedirectTypeL3) &&
  10688                  (ifp_type == FALSE)))) {
  10689                return BCM_E_PARAM;
  10690             }
  10691 
  10692             if (flags & BCM_L3_MULTIPATH) {
  10693                 /* Param0 - ECMP next hop */
  10694                 if (0 == soc_feature(unit,
  10695                                    soc_feature_field_action_redirect_ecmp)) {
  10696                     return (BCM_E_PARAM);
  10697                 }
  10698                 ucast_redirect_control = 0x3;
  10699             } else {
  10700                 ucast_redirect_control = 0x2;
  10701             }
  10702             break;
  10703 #endif /* INCLUDE_L3 */
  10704         case bcmFieldActionRedirectMcast:
  10705             if (soc_feature(unit, soc_feature_field_action_redirect_ipmc)) {
  10706                 if (_BCM_MULTICAST_IS_SET(fa->param[0])) {
  10707                     if (0 == _BCM_MULTICAST_IS_L2(fa->param[0])) {
  10708                         return (BCM_E_PARAM);
  10709                     }
  10710                     redir_field = _BCM_MULTICAST_ID_GET(fa->param[0]);
  10711                 } else {
  10712                     redir_field = fa->param[0];
  10713                 }
  10714             } else {
  10715                 redir_field = fa->hw_index;
  10716             }
  10717             mcast_redirect_control = 0x2;
  10718             break;
  10719         case bcmFieldActionRedirectVlan:
  10720             mcast_redirect_control = 0x1;
  10721             break;
  10722         case bcmFieldActionRedirectBcastPbmp:
  10723             redir_field = fa->hw_index;
  10724             mcast_redirect_control = 0x1;
  10725             break;
  10726         case bcmFieldActionUnmodifiedPacketRedirectPort:
  10727             if (BCM_GPORT_IS_MODPORT(fa->param[0])) {
  10728                 redir_field = ((BCM_GPORT_MODPORT_MODID_GET(
  10729                                                     fa->param[0]) & 0xff) << 8);
  10730                 redir_field |= (BCM_GPORT_MODPORT_PORT_GET(
  10731                                                           fa->param[0]) & 0xff);
  10732                 is_trunk = 0;
  10733             } else if (BCM_GPORT_IS_TRUNK(fa->param[0])) {
  10734                 redir_field = 0x1 << 17;
  10735                 redir_field |= BCM_GPORT_TRUNK_GET(fa->param[0]);
  10736                 is_trunk = 1;
  10737             } else {
  10738                 redir_field = ((fa->param[0] & 0xff) << 8);
  10739                 redir_field |= (fa->param[1] & 0xff);
  10740                 is_trunk = 0;
  10741             }
  10742             ucast_redirect_control = 0x1;
  10743             break;
  10744         default:
  10745             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10746                         "%s can't be resolved.\n"), action_name[fa->action]));
  10747             return (BCM_E_UNAVAIL);
  10748     }
  10749 
  10750     params->flags |= flags;
  10751     params->is_dvp = is_dvp;
  10752     params->is_trunk = is_trunk;
  10753     params->nh_ecmp_id = nh_ecmp_id;
  10754     params->redirect_value = redir_field;
  10755     params->ucast_redirect_control = ucast_redirect_control;
  10756     params->mcast_redirect_control = mcast_redirect_control;
  10757     params->eh_tag = eh_tag;
  10758     params->eh_tag_mask_index = eh_tag_mask_index;
  10759 
  10760     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n")));
  10761     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10762                                          "is_dvp = %d \n"), params->is_dvp));
  10763     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10764                                       "is_trunk = %d \n"), params->is_trunk));
  10765     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10766                                   "nh_ecmp_id = %d \n"), params->nh_ecmp_id));
  10767     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10768                           "redirect_value = %d \n"), params->redirect_value));
  10769     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10770                                             "ucast_redirect_control = %d \n"),
  10771                                              params->ucast_redirect_control));
  10772     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10773                                             "mcast_redirect_control = %d \n"),
  10774                                              params->mcast_redirect_control));
  10775     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10776                                             "HiGiG Extended Header  = %d \n"),
  10777                                              params->eh_tag));
  10778     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10779                                    "HiGiG Extended Header Mask Index = %d \n"),
  10780                                           params->eh_tag_mask_index));
  10781 
  10782     return (BCM_E_NONE);
  10783 }
  10784 /*
  10785  * Function:
  10786  *     _bcm_field_th_l3swl2change_resolve
  10787  * Purpose:
  10788  *     Resolve field action parameters for actions in IFP_L3SW_L2_CHANGE_SET.
  10789  * Parameters:
  10790  *     unit     - (IN) BCM device number
  10791  *     f_ent    - (IN) Field entry structure.
  10792  *     fa       - (IN) Field action structure.
  10793  *     params   - (OUT) Field Action params structure.
  10794  * Returns:
  10795  *     BCM_E_XXX
  10796  */
  10797 int
  10798 _bcm_field_th_l3swl2change_resolve(int unit,
  10799                                    _field_entry_t *f_ent,
  10800                                    _field_action_t *fa,
  10801                                    _field_action_params_t *params)
  10802 {
  10803     int rv;         /* Operation return status. */
  10804     int nh_ecmp_id; /* Next Hop or ECMP Id. */
  10805     uint32 flags;   /* Multippath Flags. */
  10806 #if defined INCLUDE_L3
  10807     int ifp_type = 0; /* Egress object entry type. */
  10808 #endif
  10809 
  10810     if (NULL == fa || NULL == f_ent || NULL == params) {
  10811         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10812         return (BCM_E_PARAM);
  10813     }
  10814 
  10815 #if defined INCLUDE_L3
  10816     rv = _bcm_field_l3_egr_object_ifp_type_index_get(unit, fa->param[0],
  10817                                                 &ifp_type, &flags, &nh_ecmp_id);
  10818     BCM_IF_ERROR_RETURN(rv);
  10819 #endif /* INCLUDE_L3 */
  10820 
  10821     switch (fa->action)  {
  10822         case bcmFieldActionL3Switch:
  10823 #if defined INCLUDE_L3
  10824             if (ifp_type == TRUE) {
  10825                return BCM_E_PARAM;
  10826             }
  10827 #else
  10828            return BCM_E_UNAVAIL;
  10829 #endif
  10830            break;
  10831         case bcmFieldActionChangeL2Fields:
  10832 #if defined INCLUDE_L3
  10833            if (ifp_type == FALSE) {
  10834               return BCM_E_PARAM;
  10835            }
  10836            fa->hw_index = nh_ecmp_id;
  10837 #else
  10838            return BCM_E_UNAVAIL;
  10839 #endif
  10840            break;
  10841         default:
  10842            LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10843                         "%s can't be resolved.\n"), action_name[fa->action]));
  10844            return BCM_E_UNAVAIL;
  10845     }
  10846 
  10847     params->flags |= flags;
  10848     params->nh_ecmp_id = nh_ecmp_id;
  10849 
  10850     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit, "Resolved Parameters:\n")));
  10851     LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10852                                           "flags = %d \n  nh_ecmp_id = %d \n"),
  10853                                            params->flags, params->nh_ecmp_id));
  10854     return rv;
  10855 }
  10856 /*
  10857  * Function:
  10858  *     _bcm_field_th_action_resolve
  10859  * Purpose:
  10860  *     Resolve field action parameters.
  10861  * Parameters:
  10862  *     unit     - (IN) BCM device number
  10863  *     f_ent    - (IN) Field entry structure.
  10864  *     fa       - (IN) Field action structure.
  10865  *     params   - (OUT) Field Action params structure.
  10866  * Returns:
  10867  *     BCM_E_XXX
  10868  */
  10869 int
  10870 _bcm_field_action_resolve(int unit, _field_entry_t *f_ent,
  10871                           _field_action_t *fa, _field_action_params_t *params)
  10872 {
  10873     if (NULL == f_ent || NULL == fa || NULL == params) {
  10874         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10875         return BCM_E_PARAM;
  10876     }
  10877 
  10878     switch (fa->action) {
  10879         /* Actions from PROFILE_SET_1 */
  10880         case bcmFieldActionCosQNew:
  10881         case bcmFieldActionGpCosQNew:
  10882         case bcmFieldActionYpCosQNew:
  10883         case bcmFieldActionRpCosQNew:
  10884         case bcmFieldActionUcastCosQNew:
  10885         case bcmFieldActionGpUcastCosQNew:
  10886         case bcmFieldActionYpUcastCosQNew:
  10887         case bcmFieldActionRpUcastCosQNew:
  10888         case bcmFieldActionMcastCosQNew:
  10889         case bcmFieldActionGpMcastCosQNew:
  10890         case bcmFieldActionYpMcastCosQNew:
  10891         case bcmFieldActionRpMcastCosQNew:
  10892         case bcmFieldActionCosMapNew:
  10893         case bcmFieldActionGpCosMapNew:
  10894         case bcmFieldActionYpCosMapNew:
  10895         case bcmFieldActionRpCosMapNew:
  10896             return _bcm_field_th_cosq_resolve(unit, f_ent, fa, params);
  10897         case bcmFieldActionEgressClassSelect:
  10898             return _bcm_field_th_i2e_class_resolve(unit, f_ent, fa, params);
  10899         case bcmFieldActionHiGigClassSelect:
  10900             return _bcm_field_th_i2e_hg_class_resolve(unit, f_ent, fa, params);
  10901         case bcmFieldActionFabricQueue:
  10902             return _bcm_field_th_fabric_tag_resolve(unit, f_ent, fa, params);
  10903 #ifdef INCLUDE_L3
  10904         case bcmFieldActionL3Switch:
  10905         case bcmFieldActionChangeL2Fields:
  10906             return _bcm_field_th_l3swl2change_resolve(unit, f_ent, fa, params);
  10907         case bcmFieldActionNatEgressOverride:
  10908             return _bcm_field_th_nat_resolve(unit, f_ent, fa, params);
  10909 #endif
  10910         case bcmFieldActionRedirect:
  10911         case bcmFieldActionRedirectTrunk:
  10912         case bcmFieldActionUnmodifiedPacketRedirectPort:
  10913         case bcmFieldActionRedirectMcast:
  10914 #ifdef INCLUDE_L3
  10915         case bcmFieldActionRedirectEgrNextHop:
  10916         case bcmFieldActionRedirectIpmc:
  10917 #endif
  10918         case bcmFieldActionRedirectCancel:
  10919         case bcmFieldActionRedirectPbmp:
  10920         case bcmFieldActionRedirectVlan:
  10921         case bcmFieldActionRedirectBcastPbmp:
  10922         case bcmFieldActionEgressMask:
  10923         case bcmFieldActionEgressPortsAdd:
  10924         case bcmFieldActionFabricEHAddOrUpdate:
  10925             return _bcm_field_th_redirect_resolve(unit, f_ent, fa, params);
  10926         case bcmFieldActionMirrorIngress:
  10927         case bcmFieldActionMirrorEgress:
  10928             return _bcm_field_th_mirror_resolve(unit, f_ent, fa, params);
  10929         default:
  10930             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  10931                         "%s can't be resolved.\n"), action_name[fa->action]));
  10932             return BCM_E_UNAVAIL;
  10933    }
  10934 
  10935    return BCM_E_NONE;
  10936 }
  10937 /*
  10938  * Function:
  10939  *     _bcm_field_th_ingress_action_params_check
  10940  * Purpose:
  10941  *     Check field action parameters.
  10942  * Parameters:
  10943  *     unit     - (IN) BCM device number
  10944  *     f_ent    - (IN) Field entry structure.
  10945  *     fa       - (IN) Field action structure.
  10946  *     action   - (IN) Field Action of type bcmFieldActionXXX.
  10947  * Returns:
  10948  *     BCM_E_XXX
  10949  */
  10950 int
  10951 _bcm_field_th_ingress_action_params_check(int unit,
  10952                                          _field_entry_t *f_ent,
  10953                                          _field_action_t *fa)
  10954 {
  10955     int rv; /* Operation return status. */
  10956     _field_stage_t *stage_fc; /* Field Stage Structure. */
  10957     _field_action_params_t params; /* Field Params Structutre. */
  10958     _bcm_field_action_offset_t a_offset; /* Field Offset Structure. */
  10959     bcm_field_action_t action;  /* Field Action of Type bcmFieldActionXXX. */
  10960 #ifdef INCLUDE_L3
  10961     int                redir_field = -1;
  10962 #endif
  10963 #if defined (BCM_TOMAHAWK3_SUPPORT)
  10964     int ref_count = -1;  /* For Mirror Zeroing */
  10965 #endif
  10966 
  10967     if (NULL == f_ent ||
  10968         NULL == fa) {
  10969         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  10970         return BCM_E_PARAM;
  10971     }
  10972 
  10973     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  10974     BCM_IF_ERROR_RETURN(rv);
  10975 
  10976     sal_memset(&params , 0, sizeof(params));
  10977 
  10978     action = fa->action;
  10979     switch (action) {
  10980         /* Actions from PROFILE_SET_1 */
  10981         case bcmFieldActionCosQNew:
  10982         case bcmFieldActionGpCosQNew:
  10983         case bcmFieldActionYpCosQNew:
  10984         case bcmFieldActionRpCosQNew:
  10985             /* For the xxcosQNew action, the param received is a 4 bit ucosq.
  10986              * This value is set for both ucosq (lower 4 bits) and
  10987              * mcosq(higher 4 bits) of G/Y/R_COS_INT_PRI.
  10988              * Since, param received is only ucosq (4 bit value), it is
  10989              * validated against bcmFieldActionGpUcastCosQNew.
  10990              */
  10991 
  10992             action = bcmFieldActionGpUcastCosQNew;
  10993             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  10994             ACTION_RESOLVE(unit, f_ent, fa, &params);
  10995             ACTION_CHECK(a_offset.width[0], params.cosq_new);
  10996             break;
  10997         case bcmFieldActionUcastCosQNew:
  10998         case bcmFieldActionGpUcastCosQNew:
  10999         case bcmFieldActionYpUcastCosQNew:
  11000         case bcmFieldActionRpUcastCosQNew:
  11001             action = bcmFieldActionGpUcastCosQNew;
  11002             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11003             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11004             ACTION_CHECK(a_offset.width[0], params.cosq_new);
  11005             break;
  11006         case bcmFieldActionMcastCosQNew:
  11007         case bcmFieldActionGpMcastCosQNew:
  11008         case bcmFieldActionYpMcastCosQNew:
  11009         case bcmFieldActionRpMcastCosQNew:
  11010             action = bcmFieldActionGpMcastCosQNew;
  11011             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11012             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11013             ACTION_CHECK(a_offset.width[0], params.cosq_new);
  11014             break;
  11015         case bcmFieldActionPrioIntNew:
  11016         case bcmFieldActionGpPrioIntNew:
  11017         case bcmFieldActionYpPrioIntNew:
  11018         case bcmFieldActionRpPrioIntNew:
  11019         case bcmFieldActionPrioPktAndIntNew:
  11020         case bcmFieldActionRpPrioPktAndIntNew:
  11021         case bcmFieldActionGpPrioPktAndIntNew:
  11022         case bcmFieldActionYpPrioPktAndIntNew:
  11023             action = bcmFieldActionGpPrioIntNew;
  11024             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11025             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11026             break;
  11027         case bcmFieldActionGpIntCongestionNotificationNew:
  11028         case bcmFieldActionYpIntCongestionNotificationNew:
  11029         case bcmFieldActionRpIntCongestionNotificationNew:
  11030         case bcmFieldActionPfcClassNew:
  11031             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11032             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11033             break;
  11034         case bcmFieldActionDropPrecedence:
  11035         case bcmFieldActionGpDropPrecedence:
  11036         case bcmFieldActionYpDropPrecedence:
  11037         case bcmFieldActionRpDropPrecedence:
  11038             action = bcmFieldActionGpDropPrecedence;
  11039             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11040             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11041             if ((BCM_FIELD_COLOR_GREEN != fa->param[0]) && (BCM_FIELD_COLOR_RED != fa->param[0]) &&
  11042                 (BCM_FIELD_COLOR_YELLOW != fa->param[0])) {
  11043                 LOG_ERROR(BSL_LS_BCM_FP,
  11044                         (BSL_META_U(unit,
  11045                                     "FP: Error: param0 "
  11046                                     "is not a valid Color.\n")));
  11047                 return BCM_E_PARAM;
  11048             }
  11049             break;
  11050         case bcmFieldActionUntaggedPacketPriorityNew:
  11051              ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11052              ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11053              break;
  11054         case bcmFieldActionCosMapNew:
  11055         case bcmFieldActionGpCosMapNew:
  11056         case bcmFieldActionYpCosMapNew:
  11057         case bcmFieldActionRpCosMapNew:
  11058             action = bcmFieldActionGpCosMapNew;
  11059             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11060             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11061             ACTION_CHECK(a_offset.width[0], params.cosq_new);
  11062             break;
  11063         case bcmFieldActionPrioIntCopy:
  11064         case bcmFieldActionPrioIntTos:
  11065         case bcmFieldActionPrioIntCancel:
  11066         case bcmFieldActionGpPrioIntCopy:
  11067         case bcmFieldActionGpPrioIntTos:
  11068         case bcmFieldActionGpPrioIntCancel:
  11069         case bcmFieldActionYpPrioIntCopy:
  11070         case bcmFieldActionYpPrioIntTos:
  11071         case bcmFieldActionYpPrioIntCancel:
  11072         case bcmFieldActionRpPrioIntCopy:
  11073         case bcmFieldActionRpPrioIntTos:
  11074         case bcmFieldActionRpPrioIntCancel:
  11075             break;
  11076         /* Actions from PROFILE_SET_2 */
  11077         case bcmFieldActionEcnNew:
  11078         case bcmFieldActionGpEcnNew:
  11079         case bcmFieldActionYpEcnNew:
  11080         case bcmFieldActionRpEcnNew:
  11081             action = bcmFieldActionGpEcnNew;
  11082             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11083             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11084             break;
  11085         case bcmFieldActionPrioPktNew:
  11086         case bcmFieldActionGpPrioPktNew:
  11087         case bcmFieldActionYpPrioPktNew:
  11088         case bcmFieldActionRpPrioPktNew:
  11089             action = bcmFieldActionGpPrioPktNew;
  11090             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11091             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11092             break;
  11093         case bcmFieldActionGpTosPrecedenceNew:
  11094             action = bcmFieldActionGpTosPrecedenceNew;
  11095             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11096             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11097             break;
  11098         case bcmFieldActionDscpNew:
  11099         case bcmFieldActionGpDscpNew:
  11100         case bcmFieldActionYpDscpNew:
  11101         case bcmFieldActionRpDscpNew:
  11102             action = bcmFieldActionGpDscpNew;
  11103             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11104             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11105             break;
  11106         case bcmFieldActionPrioPktCopy:
  11107         case bcmFieldActionGpPrioPktCopy:
  11108         case bcmFieldActionYpPrioPktCopy:
  11109         case bcmFieldActionRpPrioPktCopy:
  11110         case bcmFieldActionPrioPktTos:
  11111         case bcmFieldActionGpPrioPktTos:
  11112         case bcmFieldActionYpPrioPktTos:
  11113         case bcmFieldActionRpPrioPktTos:
  11114         case bcmFieldActionPrioPktCancel:
  11115         case bcmFieldActionGpPrioPktCancel:
  11116         case bcmFieldActionYpPrioPktCancel:
  11117         case bcmFieldActionRpPrioPktCancel:
  11118         case bcmFieldActionDot1pPreserve:
  11119         case bcmFieldActionGpDot1pPreserve:
  11120         case bcmFieldActionYpDot1pPreserve:
  11121         case bcmFieldActionRpDot1pPreserve:
  11122         case bcmFieldActionDscpCancel:
  11123         case bcmFieldActionGpDscpCancel:
  11124         case bcmFieldActionYpDscpCancel:
  11125         case bcmFieldActionRpDscpCancel:
  11126         case bcmFieldActionDscpPreserve:
  11127         case bcmFieldActionGpDscpPreserve:
  11128         case bcmFieldActionYpDscpPreserve:
  11129         case bcmFieldActionRpDscpPreserve:
  11130         case bcmFieldActionGpTosPrecedenceCopy:
  11131         case bcmFieldActionPrioPktAndIntCopy:
  11132         case bcmFieldActionPrioPktAndIntTos:
  11133         case bcmFieldActionPrioPktAndIntCancel:
  11134         case bcmFieldActionRpPrioPktAndIntCopy:
  11135         case bcmFieldActionRpPrioPktAndIntTos:
  11136         case bcmFieldActionRpPrioPktAndIntCancel:
  11137         case bcmFieldActionGpPrioPktAndIntCopy:
  11138         case bcmFieldActionGpPrioPktAndIntTos:
  11139         case bcmFieldActionGpPrioPktAndIntCancel:
  11140         case bcmFieldActionYpPrioPktAndIntCopy:
  11141         case bcmFieldActionYpPrioPktAndIntTos:
  11142         case bcmFieldActionYpPrioPktAndIntCancel:
  11143             break;
  11144         /* Actions from L3SW_CHANGE_L2_SWT */
  11145         case bcmFieldActionEgressClassSelect:
  11146             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11147             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11148             ACTION_CHECK(a_offset.width[0], params.i2e_cl_sel);
  11149             break;
  11150         case bcmFieldActionHiGigClassSelect:
  11151             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11152             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11153             ACTION_CHECK(a_offset.width[0], params.i2e_hg_cl_sel);
  11154             break;
  11155         case bcmFieldActionNewClassId:
  11156         case bcmFieldActionMultipathHash:
  11157         case bcmFieldActionAddClassTag:
  11158             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11159             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11160             break;
  11161         case bcmFieldActionFabricQueue:
  11162             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11163             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11164             ACTION_CHECK(a_offset.width[0], params.fabric_tag_type);
  11165             ACTION_CHECK(a_offset.width[1], params.fabric_tag);
  11166             break;
  11167         case bcmFieldActionL3Switch:
  11168 #if defined INCLUDE_L3
  11169             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11170             if (params.flags & BCM_L3_MULTIPATH) {
  11171                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset,
  11172                                  _BCM_FIELD_ACTION_L3SWITCH_ECMP);
  11173                 ACTION_CHECK(a_offset.width[0], params.nh_ecmp_id);
  11174             } else {
  11175                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset,
  11176                              _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP);
  11177                 ACTION_CHECK(a_offset.width[0], params.nh_ecmp_id);
  11178             }
  11179             break;
  11180 #else
  11181          return BCM_E_UNAVAIL;
  11182 #endif /* INCLUDE_L3 */
  11183         case bcmFieldActionDstMacNew:
  11184         case bcmFieldActionSrcMacNew:
  11185         case bcmFieldActionOuterVlanNew:
  11186         case bcmFieldActionVnTagNew:
  11187         case bcmFieldActionVnTagDelete:
  11188         case bcmFieldActionEtagNew:
  11189         case bcmFieldActionEtagDelete:
  11190         case bcmFieldActionL3SwitchCancel:
  11191         case bcmFieldActionChangeL2FieldsCancel:
  11192             break;
  11193         case bcmFieldActionBFDSessionIdNew:
  11194             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11195             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11196             break;
  11197         /* Actions from IFP_LB_CONTROLS_SET */
  11198         case bcmFieldActionHgTrunkRandomRoundRobinHashCancel:
  11199         case bcmFieldActionTrunkRandomRoundRobinHashCancel:
  11200         case bcmFieldActionEcmpRandomRoundRobinHashCancel:
  11201             break;
  11202         /* Actions from IFP_NAT_OVERRIDE_SET */
  11203         case bcmFieldActionNatCancel:
  11204             break;
  11205         /* Actions from IFP_COPY_TO_CPU_SET */
  11206         case bcmFieldActionCopyToCpu:
  11207         case bcmFieldActionGpCopyToCpu:
  11208         case bcmFieldActionYpCopyToCpu:
  11209         case bcmFieldActionRpCopyToCpu:
  11210         case bcmFieldActionOamCopyToCpu:
  11211         case bcmFieldActionGpOamCopyToCpu:
  11212         case bcmFieldActionYpOamCopyToCpu:
  11213         case bcmFieldActionRpOamCopyToCpu:
  11214             if (0 != fa->param[0]) {
  11215                 action = bcmFieldActionGpCopyToCpu;
  11216                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11217                 ACTION_CHECK(a_offset.width[0], fa->param[1]);
  11218             }
  11219             break;
  11220         case bcmFieldActionTimeStampToCpu:
  11221         case bcmFieldActionGpTimeStampToCpu:
  11222         case bcmFieldActionYpTimeStampToCpu:
  11223         case bcmFieldActionRpTimeStampToCpu:
  11224             if (0 != fa->param[0]) {
  11225                 action = bcmFieldActionGpTimeStampToCpu;
  11226                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11227                 ACTION_CHECK(a_offset.width[0], fa->param[1]);
  11228             }
  11229             break;
  11230         case bcmFieldActionCopyToCpuCancel:
  11231         case bcmFieldActionGpCopyToCpuCancel:
  11232         case bcmFieldActionYpCopyToCpuCancel:
  11233         case bcmFieldActionRpCopyToCpuCancel:
  11234         case bcmFieldActionSwitchToCpuCancel:
  11235         case bcmFieldActionGpSwitchToCpuCancel:
  11236         case bcmFieldActionYpSwitchToCpuCancel:
  11237         case bcmFieldActionRpSwitchToCpuCancel:
  11238         case bcmFieldActionSwitchToCpuReinstate:
  11239         case bcmFieldActionGpSwitchToCpuReinstate:
  11240         case bcmFieldActionYpSwitchToCpuReinstate:
  11241         case bcmFieldActionRpSwitchToCpuReinstate:
  11242         case bcmFieldActionTimeStampToCpuCancel:
  11243         case bcmFieldActionGpTimeStampToCpuCancel:
  11244         case bcmFieldActionYpTimeStampToCpuCancel:
  11245         case bcmFieldActionRpTimeStampToCpuCancel:
  11246 
  11247             break;
  11248         /* Actions from IFP_XXX_OVERRIDE_SET */
  11249         case bcmFieldActionDoNotCheckUrpf:
  11250         case bcmFieldActionDoNotChangeTtl:
  11251         case bcmFieldActionMirrorOverride:
  11252         case bcmFieldActionDoNotCutThrough:
  11253             break;
  11254         /* Actions from IFP_INSTRUMENTATION_TRIGGERS_ENABLE_SET */
  11255         case bcmFieldActionPacketTraceEnable:
  11256            break;
  11257         /* Actions from IFP_CHANGE_CPU_COS_SET */
  11258         case bcmFieldActionCosQCpuNew:
  11259         case bcmFieldActionServicePoolIdNew:
  11260             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11261             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11262             break;
  11263         case bcmFieldActionServicePoolIdPrecedenceNew:
  11264             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11265             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11266             ACTION_CHECK(a_offset.width[1], fa->param[1]);
  11267             if (!fa->param[1]) {
  11268                return BCM_E_PARAM;
  11269             }
  11270             break;
  11271         /* Actions from IFP_DROP_SET */
  11272         case bcmFieldActionDrop:
  11273         case bcmFieldActionGpDrop:
  11274         case bcmFieldActionYpDrop:
  11275         case bcmFieldActionRpDrop:
  11276         case bcmFieldActionDropCancel:
  11277         case bcmFieldActionGpDropCancel:
  11278         case bcmFieldActionYpDropCancel:
  11279         case bcmFieldActionRpDropCancel:
  11280             break;
  11281         /* Actions from IFP_SFLOW_SET */
  11282         case bcmFieldActionIngSampleEnable:
  11283             break;
  11284         /* Actions from IFP_NAT_SET */
  11285 #ifdef INCLUDE_L3
  11286         case bcmFieldActionNatEgressOverride:
  11287             if (soc_feature(unit, soc_feature_nat)) {
  11288                 bcm_l3_nat_egress_t nat_info;
  11289                 nat_info.nat_id = fa->param[0];
  11290 
  11291                 rv = bcm_esw_l3_nat_egress_get(unit, &nat_info);
  11292                 if(BCM_FAILURE(rv)){
  11293                     return BCM_E_PARAM;
  11294                 }
  11295             }
  11296             else {
  11297                 return BCM_E_UNAVAIL;
  11298             }
  11299             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11300             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11301             ACTION_CHECK(a_offset.width[0], params.hw_idx);
  11302             ACTION_CHECK(a_offset.width[1], params.hw_half);
  11303             break;
  11304 #endif
  11305         case bcmFieldActionNat:
  11306             break;
  11307         /* Actions from REDIRECT_SET */
  11308         case bcmFieldActionRedirectTrunk:
  11309             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11310             if (params.is_dvp) {
  11311                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset,
  11312                                   _BCM_FIELD_ACTION_REDIRECT_DVP);
  11313             } else {
  11314                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset,
  11315                                   _BCM_FIELD_ACTION_REDIRECT_TRUNK);
  11316             }
  11317             ACTION_CHECK(a_offset.width[0], params.redirect_value);
  11318             break;
  11319         case bcmFieldActionRedirect:
  11320             rv = _bcm_field_action_dest_check(unit, fa);
  11321             BCM_IF_ERROR_RETURN(rv);
  11322             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11323             if (params.is_dvp) {
  11324                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset,
  11325                                   _BCM_FIELD_ACTION_REDIRECT_DVP);
  11326             } else if (params.is_trunk) {
  11327                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset,
  11328                                  _BCM_FIELD_ACTION_REDIRECT_TRUNK);
  11329             } else {
  11330                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset,
  11331                                  _BCM_FIELD_ACTION_REDIRECT_DGLP);
  11332             }
  11333             ACTION_CHECK(a_offset.width[0], params.redirect_value);
  11334             break;
  11335         case bcmFieldActionUnmodifiedPacketRedirectPort:
  11336             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset,
  11337                              _BCM_FIELD_ACTION_REDIRECT_DGLP);
  11338             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11339             ACTION_CHECK(a_offset.width[0], params.redirect_value);
  11340             break;
  11341 #ifdef INCLUDE_L3
  11342         case bcmFieldActionRedirectEgrNextHop:
  11343             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11344             if (params.flags & BCM_L3_MULTIPATH) {
  11345                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  11346                                       _BCM_FIELD_ACTION_REDIRECT_ECMP);
  11347             } else {
  11348                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  11349                                   _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP);
  11350             }
  11351             ACTION_CHECK(a_offset.width[0], params.nh_ecmp_id);
  11352             break;
  11353 #endif
  11354         case bcmFieldActionFabricEHAddOrUpdate:
  11355             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11356             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11357             break;
  11358         case bcmFieldActionRedirectCancel:
  11359         case bcmFieldActionRedirectPbmp:
  11360         case bcmFieldActionRedirectVlan:
  11361         case bcmFieldActionRedirectBcastPbmp:
  11362         case bcmFieldActionRedirectMcast:
  11363         case bcmFieldActionEgressMask:
  11364         case bcmFieldActionEgressPortsAdd:
  11365         case bcmFieldActionColorIndependent:
  11366             break;
  11367         case bcmFieldActionRedirectIpmc:
  11368 #ifdef INCLUDE_L3
  11369             redir_field = fa->param[0];
  11370             if (soc_feature(unit, soc_feature_field_action_redirect_ipmc)) {
  11371                 if (_BCM_MULTICAST_IS_SET(fa->param[0])) {
  11372                     if ((0 == _BCM_MULTICAST_IS_L3(fa->param[0])) &&
  11373                             (0 == _BCM_MULTICAST_IS_WLAN(fa->param[0])) &&
  11374                             (0 == _BCM_MULTICAST_IS_VXLAN(fa->param[0])) &&
  11375                             (0 == _BCM_MULTICAST_IS_VLAN(fa->param[0])) &&
  11376                             (0 == _BCM_MULTICAST_IS_FLOW(fa->param[0])) &&
  11377                             (0 == _BCM_MULTICAST_IS_VPLS(fa->param[0]))) {
  11378                         return (BCM_E_PARAM);
  11379                     }
  11380                     redir_field = _BCM_MULTICAST_ID_GET(fa->param[0]);
  11381                 }
  11382             }
  11383             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11384             ACTION_CHECK(a_offset.width[0], redir_field);
  11385 #endif
  11386             break;
  11387         case bcmFieldActionMirrorIngress:
  11388         case bcmFieldActionMirrorEgress:
  11389             if((_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id) &&
  11390                     (0 == BCM_GPORT_IS_MIRROR(fa->param[1]))) {
  11391                 LOG_ERROR(BSL_LS_BCM_FP,
  11392                         (BSL_META_U(unit,
  11393                                     "FP(unit %d) Error: param1=0x%x "
  11394                                     "is not a valid Mirror Destination ID.\n"),
  11395                          unit, fa->param[1]));
  11396                 return BCM_E_PARAM;
  11397             }
  11398 
  11399             rv = _bcm_field_action_dest_check(unit, fa);
  11400             BCM_IF_ERROR_RETURN(rv);
  11401             break;
  11402         case bcmFieldActionChangeL2Fields:
  11403             ACTION_RESOLVE(unit, f_ent, fa, &params);
  11404             break;
  11405         case bcmFieldActionExactMatchClassId:
  11406             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11407             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11408             break;
  11409         /*Actions from TIMESTAMP_SET*/
  11410         case bcmFieldActionEgressTimeStampInsert:
  11411         case bcmFieldActionIngressTimeStampInsert:
  11412         case bcmFieldActionIngressTimeStampInsertCancel:
  11413         case bcmFieldActionEgressTimeStampInsertCancel:
  11414             break;
  11415         /*Actions from DLB_HGT_LAG_SET*/
  11416         case bcmFieldActionDynamicTrunkEnable:
  11417         case bcmFieldActionDynamicTrunkCancel:
  11418         case bcmFieldActionDynamicHgTrunkEnable:
  11419         case bcmFieldActionDynamicHgTrunkCancel:
  11420             break;
  11421 #if defined(INCLUDE_L3)
  11422         /*Actions from DLB_ECMP_SET*/
  11423         case bcmFieldActionDynamicEcmpEnable:
  11424         case bcmFieldActionDynamicEcmpCancel:
  11425             break;
  11426         /*Actions from DLB_ALTERNATE_PATH_CONTROL_SET*/
  11427         case bcmFieldActionDgm:
  11428             break;
  11429         case bcmFieldActionDgmThreshold:
  11430         case bcmFieldActionDgmBias:
  11431         case bcmFieldActionDgmCost:
  11432             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11433             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11434             break;
  11435         /*Actions from PROTECTION_SWITCHING_SET*/
  11436         case bcmFieldActionRecoverableDropCancel:
  11437             break;
  11438 #endif /* INCLUDE_L3 */
  11439         /* ECMP1_RH_ACTION_SET */
  11440         case bcmFieldActionEcmpResilientHashEnable:
  11441         case bcmFieldActionEcmpResilientHashDisable:
  11442         /* LAG_TH_ACTION_SET */
  11443         case bcmFieldActionTrunkResilientHashEnable:
  11444         case bcmFieldActionTrunkResilientHashDisable:
  11445         /* HGT_RH_ACTION_SET */
  11446         case bcmFieldActionHiGigTrunkResilientHashEnable:
  11447         case bcmFieldActionHiGigTrunkResilientHashDisable:
  11448         /* IGNORE_FCOE_ZONE_CHECK_SET */
  11449         case bcmFieldActionFibreChanZoneCheckActionCancel:
  11450             break;
  11451         /* LOOPBACK_PROFILE_ACTION_SET */
  11452         case bcmFieldActionLoopbackType:
  11453             if ((bcmFieldLoopbackTypeMasquerade != fa->param[0]) &&
  11454                 (bcmFieldLoopbackTypeRedirect != fa->param[0])){
  11455                 return BCM_E_PARAM;
  11456             }
  11457             break;
  11458         case bcmFieldActionFibreChanVsanId:
  11459             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11460             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11461             break;
  11462         case bcmFieldActionFibreChanIntVsanPri:
  11463             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11464             ACTION_CHECK(a_offset.width[1], fa->param[0]);
  11465             break;
  11466         case bcmFieldActionAssignExtractionCtrlId:
  11467         case bcmFieldActionAssignEditCtrlId:
  11468             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11469             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11470             ACTION_CHECK(a_offset.width[1], fa->param[1]);
  11471             break;
  11472         case bcmFieldActionAssignOpaqueObject4:
  11473         case bcmFieldActionAssignOpaqueObject3:
  11474         case bcmFieldActionAssignOpaqueObject2:
  11475         case bcmFieldActionAssignOpaqueObject1:
  11476             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11477             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11478             break;
  11479         case bcmFieldActionLoopbackSubtype:
  11480             if (bcmFieldLoopbackSubtypeCount <= fa->param[0]) {
  11481                 return BCM_E_PARAM;
  11482             }
  11483             break;
  11484         case bcmFieldActionEgressFlowControlEnable:
  11485             if (bcmFieldEgressFlowControlCount <= fa->param[0]) {
  11486                 return BCM_E_PARAM;
  11487             }
  11488             break;
  11489         case bcmFieldActionEgressFlowEncapEnable:
  11490             if (bcmFieldEgressFlowEncapCount <= fa->param[0]) {
  11491                 return BCM_E_PARAM;
  11492             }
  11493             break;
  11494         case bcmFieldActionIntEncapEnable:
  11495         case bcmFieldActionIntEncapUpdate:
  11496         case bcmFieldActionIntTurnAround:
  11497         case bcmFieldActionAddIngOuterVlanToEgrOuterVlan:
  11498         case bcmFieldActionErspan3HdrVlanCosPktCopy:
  11499         case bcmFieldActionGbpClassifierAdd:
  11500         case bcmFieldActionGbpSrcMacMcastBitSet:
  11501         case bcmFieldActionNshEncapEnable:
  11502             break;
  11503         case bcmFieldActionErspan3HdrGbpSrcIdAdd:
  11504         case bcmFieldActionErspan3HdrUdf2Add:
  11505         case bcmFieldActionAssignChangeL2FieldsClassId:
  11506             ACTION_OFFSET_GET(unit, stage_fc, _bcmFieldActionOpaque3, &a_offset, 0);
  11507             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11508             break;
  11509         case bcmFieldActionAssignNatClassId:
  11510         case bcmFieldActionGbpSrcIdNew:
  11511             ACTION_OFFSET_GET(unit, stage_fc, _bcmFieldActionOpaque1, &a_offset, 0);
  11512             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11513             break;
  11514         case bcmFieldActionGbpDstIdNew:
  11515             ACTION_OFFSET_GET(unit, stage_fc, _bcmFieldActionOpaque2, &a_offset, 0);
  11516             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11517             break;
  11518         case bcmFieldActionIntEncapDisable:
  11519         case bcmFieldActionElephantColorEnable:
  11520         case bcmFieldActionElephantColorDisable:
  11521         case bcmFieldActionElephantQueueEnable:
  11522         case bcmFieldActionElephantQueueDisable:
  11523         case bcmFieldActionElephantLookupEnable:
  11524         case bcmFieldActionElephantLookupDisable:
  11525         case bcmFieldActionMatchPbmpDrop:
  11526             break;
  11527         case bcmFieldActionMatchPbmpRedirect:
  11528             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11529             ACTION_CHECK(a_offset.width[1], fa->param[0]);
  11530             break;
  11531         case bcmFieldActionDlbEcmpMonitorEnable:
  11532             if ((fa->param[0] != BCM_FIELD_DLB_ECMP_MON_ENABLE) &&
  11533                 (fa->param[0] != BCM_FIELD_DLB_ECMP_MON_DISABLE)) {
  11534                 return BCM_E_PARAM;
  11535             }
  11536             break;
  11537 #if defined (BCM_TOMAHAWK3_SUPPORT)
  11538         case bcmFieldActionMirrorZeroingEnable:
  11539             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11540             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11541             /* Profile 0 is not supposed to be used */
  11542             if (fa->param[0] == 0) {
  11543                 return (BCM_E_PARAM);
  11544             }
  11545             BCM_IF_ERROR_RETURN(
  11546                _bcm_esw_mirror_zero_profile_ref_count_get(unit,
  11547                                             fa->param[0], &ref_count));
  11548             if (ref_count < 1) {
  11549                 return (BCM_E_PARAM);
  11550             }
  11551 #endif
  11552             break;
  11553         case bcmFieldActionNshServiceIndex:
  11554             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11555             ACTION_CHECK(a_offset.width[0], fa->param[0]);
  11556             break;
  11557         case bcmFieldActionNshServicePathId:
  11558             ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  11559             ACTION_CHECK((a_offset.width[0] + a_offset.width[1]), fa->param[0]);
  11560             break;
  11561         default:
  11562             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  11563                 "Unsupported Action %s.\n"), action_name[fa->action]));
  11564             return BCM_E_UNAVAIL;
  11565    }
  11566    return BCM_E_NONE;
  11567 }
  11568 /*
  11569  * Function:
  11570  *     _bcm_field_th_action_params_check
  11571  * Purpose:
  11572  *     Check field action parameters.
  11573  * Parameters:
  11574  *     unit     - BCM device number
  11575  *     f_ent    - Field entry structure.
  11576  *     fa       - field action
  11577  * Returns:
  11578  *     BCM_E_XXX
  11579  */
  11580 int
  11581 _bcm_field_th_action_params_check(int unit,
  11582                               _field_entry_t  *f_ent,
  11583                               _field_action_t *fa)
  11584 {
  11585     uint8    mod_id;     /* Module Id.              */
  11586     uint8    port_id;    /* Port Id.                */
  11587     soc_mem_t mem;       /* Policy table memory id. */
  11588     soc_mem_t tcam_mem;  /* Tcam memory id.         */
  11589 
  11590     if (NULL == f_ent ||
  11591         NULL == fa) {
  11592         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  11593         return BCM_E_PARAM;
  11594     }
  11595 
  11596     if (_BCM_FIELD_STAGE_EXTERNAL == f_ent->group->stage_id) {
  11597         return BCM_E_INTERNAL;
  11598     }
  11599 
  11600     BCM_IF_ERROR_RETURN
  11601          (_bcm_field_th_tcam_policy_mem_get(unit, f_ent, &tcam_mem, &mem));
  11602 
  11603     switch (f_ent->group->stage_id) {
  11604 #if defined(BCM_TOMAHAWK3_SUPPORT)
  11605         case _BCM_FIELD_STAGE_LOOKUP:
  11606             switch (fa->action) {
  11607                 case bcmFieldActionMplsLookupEnable:
  11608                      if ((fa->param[0] != BCM_FIELD_MPLS_ENABLE) &&
  11609                          (fa->param[0] != BCM_FIELD_MPLS_DISABLE)) {
  11610                          return BCM_E_PARAM;
  11611                      }
  11612                      return (BCM_E_NONE);
  11613                 case bcmFieldActionTerminationAllowed:
  11614                      if (fa->param[0] > BCM_FIELD_ARP_RARP_TERM_ALLOWED) {
  11615                          return BCM_E_PARAM;
  11616                      }
  11617                      return (BCM_E_NONE);
  11618                 default:
  11619                     ;
  11620             }
  11621             break;
  11622 #endif
  11623         case _BCM_FIELD_STAGE_EGRESS:
  11624             switch (fa->action) {
  11625                 case bcmFieldActionHiGigDstModuleGportNew:
  11626                     if (BCM_GPORT_IS_MODPORT(fa->param[0])) {
  11627                         mod_id = BCM_GPORT_MODPORT_MODID_GET(fa->param[0]);
  11628                     } else {
  11629                         return BCM_E_PARAM;
  11630                     }
  11631                     PolicyCheck(unit, mem, HG_DST_MODID_NEWf, mod_id);
  11632                     return (BCM_E_NONE);
  11633                 case bcmFieldActionHiGigDstPortGportNew:
  11634                     if (BCM_GPORT_IS_MODPORT(fa->param[0])) {
  11635                         port_id = BCM_GPORT_MODPORT_PORT_GET(fa->param[0]);
  11636                     } else {
  11637                         return BCM_E_PARAM;
  11638                     }
  11639                     PolicyCheck(unit, mem, HG_DST_PORT_NEWf, port_id);
  11640                     return (BCM_E_NONE);
  11641                 case bcmFieldActionHiGigDstGportNew:
  11642                     if (BCM_GPORT_IS_MODPORT(fa->param[0])) {
  11643                         mod_id = BCM_GPORT_MODPORT_MODID_GET(fa->param[0]);
  11644                         port_id = BCM_GPORT_MODPORT_PORT_GET(fa->param[0]);
  11645                     } else {
  11646                         return BCM_E_PARAM;
  11647                     }
  11648                     PolicyCheck(unit, mem, HG_DST_MODID_NEWf, mod_id);
  11649                     PolicyCheck(unit, mem, HG_DST_PORT_NEWf, port_id);
  11650                     return (BCM_E_NONE);
  11651                 case bcmFieldActionGpHiGigDropPrecedenceNew:
  11652                     PolicyCheck(unit, mem, G_HG_DP_NEWf, fa->param[0]);
  11653                     return (BCM_E_NONE);
  11654                 case bcmFieldActionYpHiGigDropPrecedenceNew:
  11655                     PolicyCheck(unit, mem, Y_HG_DP_NEWf, fa->param[0]);
  11656                     return (BCM_E_NONE);
  11657                 case bcmFieldActionRpHiGigDropPrecedenceNew:
  11658                     PolicyCheck(unit, mem, R_HG_DP_NEWf, fa->param[0]);
  11659                     return (BCM_E_NONE);
  11660                 case bcmFieldActionHiGigDropPrecedenceNew:
  11661                     PolicyCheck(unit, mem, G_HG_DP_NEWf, fa->param[0]);
  11662                     PolicyCheck(unit, mem, Y_HG_DP_NEWf, fa->param[0]);
  11663                     PolicyCheck(unit, mem, R_HG_DP_NEWf, fa->param[0]);
  11664                     return (BCM_E_NONE);
  11665                 case bcmFieldActionGpHiGigIntPriNew:
  11666                     PolicyCheck(unit, mem, G_HG_INT_PRI_NEWf , fa->param[0]);
  11667                     return (BCM_E_NONE);
  11668                 case bcmFieldActionYpHiGigIntPriNew:
  11669                     PolicyCheck(unit, mem, Y_HG_INT_PRI_NEWf , fa->param[0]);
  11670                     return (BCM_E_NONE);
  11671                 case bcmFieldActionRpHiGigIntPriNew:
  11672                     PolicyCheck(unit, mem, R_HG_INT_PRI_NEWf , fa->param[0]);
  11673                     return (BCM_E_NONE);
  11674                 case bcmFieldActionHiGigIntPriNew:
  11675                     PolicyCheck(unit, mem, G_HG_INT_PRI_NEWf , fa->param[0]);
  11676                     PolicyCheck(unit, mem, Y_HG_INT_PRI_NEWf , fa->param[0]);
  11677                     PolicyCheck(unit, mem, R_HG_INT_PRI_NEWf , fa->param[0]);
  11678                     return (BCM_E_NONE);
  11679                 case bcmFieldActionLoopbackSrcModuleGportNew:
  11680                     if (BCM_GPORT_IS_MODPORT(fa->param[0])) {
  11681                         mod_id = BCM_GPORT_MODPORT_MODID_GET(fa->param[0]);
  11682                     } else {
  11683                         return BCM_E_PARAM;
  11684                     }
  11685                     PolicyCheck(unit, mem, LB_SRC_MODID_NEWf, mod_id);
  11686                     return (BCM_E_NONE);
  11687                 case bcmFieldActionLoopbackSrcPortGportNew:
  11688                     if (BCM_GPORT_IS_MODPORT(fa->param[0])) {
  11689                         port_id = BCM_GPORT_MODPORT_PORT_GET(fa->param[0]);
  11690                     } else {
  11691                         return BCM_E_PARAM;
  11692                     }
  11693                     PolicyCheck(unit, mem, LB_SRC_PORT_NEWf, port_id);
  11694                     return (BCM_E_NONE);
  11695                 case bcmFieldActionLoopbackSrcGportNew:
  11696                     if (BCM_GPORT_IS_MODPORT(fa->param[0])) {
  11697                         mod_id = BCM_GPORT_MODPORT_MODID_GET(fa->param[0]);
  11698                         port_id = BCM_GPORT_MODPORT_PORT_GET(fa->param[0]);
  11699                     } else {
  11700                         return BCM_E_PARAM;
  11701                     }
  11702                     PolicyCheck(unit, mem, LB_SRC_MODID_NEWf, mod_id);
  11703                     PolicyCheck(unit, mem, LB_SRC_PORT_NEWf, port_id);
  11704                     return (BCM_E_NONE);
  11705                 case bcmFieldActionLoopbackCpuMasqueradePktProfileNew:
  11706                     PolicyCheck(unit, mem,
  11707                                 LB_PACKET_PROFILE_NEWf,
  11708                                 fa->param[0]);
  11709                     return (BCM_E_NONE);
  11710                 case bcmFieldActionLoopbackPacketProcessingPortNew:
  11711                     PolicyCheck(unit, mem, LB_PP_PORT_NEWf , fa->param[0]);
  11712                     return (BCM_E_NONE);
  11713                 case bcmFieldActionLoopBackTypeNew:
  11714                     PolicyCheck(unit, mem, LB_TYPE_NEWf , fa->param[0]);
  11715                     return (BCM_E_NONE);
  11716                 case bcmFieldActionMplsLabel1ExpNew:
  11717                     PolicyCheck(unit, mem, EXPf, fa->param[0]);
  11718                     return (BCM_E_NONE);
  11719                 case bcmFieldActionLatencyMonitorEnable:
  11720                     PolicyCheck(unit, mem, LAT_MON_ENf, fa->param[0]);
  11721                     return (BCM_E_NONE);
  11722                 case bcmFieldActionLatencyMonitorDisable:
  11723                     PolicyCheck(unit, mem, LAT_MON_DISf, fa->param[0]);
  11724                     return (BCM_E_NONE);
  11725                 default:
  11726                     ;
  11727             }
  11728             break;
  11729         case _BCM_FIELD_STAGE_INGRESS:
  11730         case _BCM_FIELD_STAGE_EXACTMATCH:
  11731             return _bcm_field_th_ingress_action_params_check(unit, f_ent, fa);
  11732 #if defined(BCM_FLOWTRACKER_SUPPORT)
  11733         case _BCM_FIELD_STAGE_FLOWTRACKER:
  11734             return _bcm_field_hx5_ft_action_params_check(unit, f_ent, fa);
  11735 #endif
  11736         default:
  11737             ;
  11738     }
  11739 
  11740     return _bcm_field_td2_action_params_check(unit, f_ent, fa);
  11741 }
  11742 /*
  11743  * Function:
  11744  *     _bcm_field_th_val_set
  11745  * Purpose:
  11746  *     Write the width size of data from p_data to p_fn_data at offset.
  11747  * Parameters:
  11748  *     p_fn_data      - (OUT) Field Policy table entry
  11749  *     p_data         - (IN) Data to be written into p_fn_data
  11750  *     offset         - (IN) Offset at which data has to be copied to p_fn_data
  11751  *     width          - (IN) Size of the data to be written into p_fn_data
  11752  * Returns:
  11753  *     BCM_E_XXX
  11754  */
  11755 int
  11756 _bcm_field_th_val_set(uint32 *p_fn_data, uint32 *p_data,
  11757                             uint32 offset, uint32 width)
  11758 {
  11759     uint32 u32_mask;
  11760     int idx, wp, bp, len;
  11761 
  11762     if (NULL == p_fn_data || NULL == p_data) {
  11763         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  11764         return BCM_E_PARAM;
  11765     }
  11766 
  11767     wp = offset / 32;
  11768     bp = offset & (32 - 1);
  11769     idx = 0;
  11770 
  11771     for (len = width; len > 0; len -= 32) {
  11772         if (bp) {
  11773             if (len < 32) {
  11774                 u32_mask = (1 << len) - 1;
  11775                 if ((p_data[idx] & ~u32_mask) != 0) {
  11776                     return (BCM_E_PARAM);
  11777                 }
  11778             } else {
  11779                 u32_mask = 0xffffffff;
  11780             }
  11781 
  11782             p_fn_data[wp] &= ~(u32_mask << bp);
  11783             p_fn_data[wp] |= p_data[idx] << bp;
  11784             if (len > (32-bp)) {
  11785                 wp++;
  11786                 p_fn_data[wp] &= ~(u32_mask >> (32 - bp));
  11787                 p_fn_data[wp] |= p_data[idx] >> (32 - bp) & ((1 << bp) - 1);
  11788             }
  11789         } else {
  11790             if (len < 32) {
  11791                 u32_mask = (1 << len) - 1;
  11792                 if ((p_data[idx] & ~u32_mask) != 0) {
  11793                     return (BCM_E_PARAM);
  11794                 }
  11795                 p_fn_data[wp] &= ~u32_mask;
  11796                 p_fn_data[wp++] |= p_data[idx];
  11797             } else {
  11798                 p_fn_data[wp++] = p_data[idx];
  11799             }
  11800         }
  11801 
  11802         idx++;
  11803     }
  11804 
  11805     return BCM_E_NONE;
  11806 }
  11807 /*
  11808  * Function:
  11809  *     _bcm_field_th_val_get
  11810  * Purpose:
  11811  *     Write the width size of data to p_data from p_fn_data at offset.
  11812  * Parameters:
  11813  *     p_fn_data      - (IN)  Field Policy table entry
  11814  *     p_data         - (OUT) Data to be from p_fn_data
  11815  *     offset         - (IN)  Offset at which data has to be
  11816  *                            copied from p_fn_data
  11817  *     width          - (IN)  Size of the data to be written into p_data
  11818  * Returns:
  11819  *     BCM_E_XXX
  11820  */
  11821 int
  11822 _bcm_field_th_val_get(uint32 *p_fn_data, uint32 *p_data,
  11823                             uint32 offset, uint32 width)
  11824 {
  11825     int                 idx, wp, bp, len;
  11826 
  11827     /* Input parameters check. */
  11828     if (NULL == p_fn_data || NULL == p_data) {
  11829         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  11830         return (BCM_E_PARAM);
  11831     }
  11832 
  11833     wp = offset / 32;
  11834     bp = offset & (32 - 1);
  11835     idx = 0;
  11836 
  11837     for (len = width; len > 0; len -= 32) {
  11838         if (bp) {
  11839             p_data[idx] = (p_fn_data[wp++] >> bp) & ((1 << (32 - bp)) - 1);
  11840             p_data[idx] |= p_fn_data[wp] << (32 - bp);
  11841         } else {
  11842             p_data[idx] = p_fn_data[wp++];
  11843         }
  11844 
  11845         if (len < 32) {
  11846             p_data[idx] &= ((1 << len) - 1);
  11847         }
  11848 
  11849         idx++;
  11850     }
  11851 
  11852     return (BCM_E_NONE);
  11853 }
  11854 /*
  11855  * Function:
  11856  *     _bcm_field_action_val_set
  11857  * Purpose:
  11858  *     Get the actions to be written
  11859  * Parameters:
  11860  *     unit     - BCM device number
  11861  *     mem      - Policy table memory
  11862  *     fa       - field action
  11863  *     buf      - (OUT) Field Policy table entry
  11864  * Returns:
  11865  *     BCM_E_NONE
  11866  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  11867  */
  11868 int
  11869 _bcm_field_action_val_set(int unit, _field_entry_t *f_ent, uint32 *entbuf,
  11870                                      _bcm_field_action_offset_t *a_offset)
  11871 {
  11872     int rv;
  11873     uint32 idx;
  11874     uint32 offset;
  11875     uint32 width;
  11876     uint32 value;
  11877 
  11878     if (NULL == entbuf || NULL == f_ent || NULL == a_offset) {
  11879         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  11880         return (BCM_E_PARAM);
  11881     }
  11882 
  11883     for (idx = 0; idx < _FP_ACTION_PARAM_SZ; idx++) {
  11884         if (a_offset->width[idx] > 0 ) {
  11885             offset = a_offset->offset[idx];
  11886             width  = a_offset->width[idx];
  11887             value  = a_offset->value[idx];
  11888             /*
  11889              * COVERITY
  11890              *
  11891              * This flow takes care of the  Out-of-bounds access issue
  11892              * for data and mask.
  11893              */
  11894             /* coverity[callee_ptr_arith : FALSE] */
  11895             rv = _bcm_field_th_val_set(entbuf, &value, offset, width);
  11896             BCM_IF_ERROR_RETURN(rv);
  11897         }
  11898     }
  11899 
  11900     return BCM_E_NONE;
  11901 }
  11902 /*
  11903  * Function:
  11904  *     _bcm_field_action_val_get
  11905  * Purpose:
  11906  *     Get the actions written into buffer
  11907  * Parameters:
  11908  *     unit     - (IN) BCM device number
  11909  *     f_ent    - (IN) Field Entry
  11910  *     buf      - (IN) Field Policy table entry
  11911  *     action   - (IN) Field Action of type bcmFieldActionXXX
  11912  *     flags    - (IN) flags to inform offset configuration
  11913  *     a_offset - (OUT) Action offset information
  11914  * Returns:
  11915  *     BCM_E_NONE
  11916  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  11917  */
  11918 int
  11919 _bcm_field_action_val_get(int unit,
  11920                           _field_entry_t *f_ent,
  11921                           uint32 *entbuf,
  11922                           _bcm_field_internal_action_t action,
  11923                           uint32 flags,
  11924                           _bcm_field_action_offset_t *a_offset)
  11925 {
  11926     int rv;
  11927     uint32 idx;
  11928     uint32 value;
  11929     _field_stage_t *stage_fc;
  11930 
  11931     if (NULL == entbuf || NULL == a_offset || NULL == f_ent) {
  11932         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  11933         return (BCM_E_PARAM);
  11934     }
  11935 
  11936     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  11937     BCM_IF_ERROR_RETURN(rv);
  11938 
  11939     rv = _bcm_field_action_offset_get(unit, stage_fc, action, a_offset, flags);
  11940     BCM_IF_ERROR_RETURN(rv);
  11941 
  11942 
  11943     for (idx = 0; idx < _FP_ACTION_PARAM_SZ; idx++) {
  11944         if (a_offset->width[idx] > 0 ) {
  11945             value = 0;
  11946             rv = _bcm_field_th_val_get(entbuf, &value,
  11947                                        a_offset->offset[idx],
  11948                                        a_offset->width[idx]);
  11949             BCM_IF_ERROR_RETURN(rv);
  11950             a_offset->value[idx]  = value;
  11951         }
  11952     }
  11953 
  11954     return BCM_E_NONE;
  11955 }
  11956 /*
  11957  * Function:
  11958  *     _bcm_field_th_profile1_cd_action_set
  11959  * Purpose:
  11960  *     Set the color dependent actions of IFP_PROFILE_ONE_SET
  11961  *     in entbuf which is to be written into POLICY table.
  11962  * Parameters:
  11963  *     unit     - BCM device number
  11964  *     action   - Field Action of type bcmFieldActionXXX
  11965  *     f_ent    - entry structure to get policy info from
  11966  *     fa       - field action
  11967  *     entbuf   - (OUT) Field Policy table entry
  11968  * Returns:
  11969  *     BCM_E_NONE
  11970  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  11971  * Notes:
  11972  *     This is a simple read/modify/write pattern.
  11973  *     FP unit lock should be held by calling function.
  11974  */
  11975 int
  11976 _bcm_field_th_profile1_cd_action_set(int unit,
  11977                                      bcm_field_action_t action,
  11978                                      _field_entry_t *f_ent,
  11979                                      _field_action_t *fa, uint32 *entbuf)
  11980 
  11981 {
  11982     int rv;
  11983     int ucosq = BCM_COS_INVALID;            /* Current unicast queue value */
  11984     int mcosq = BCM_COS_INVALID;            /* Current mcast queue value */
  11985     uint8 mcast_mode_set = 0;               /* Multicast action is set */
  11986     uint8 ucast_mode_set = 0;               /* Unicast action is set */
  11987     _field_stage_t *stage_fc;
  11988     _field_action_t *f_ent_act;
  11989     _field_action_params_t params;
  11990     _bcm_field_action_offset_t a_offset;
  11991 
  11992     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  11993         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  11994         return BCM_E_PARAM;
  11995     }
  11996 
  11997     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  11998     BCM_IF_ERROR_RETURN(rv);
  11999 
  12000     rv = _bcm_field_action_offset_get(unit, stage_fc, action, &a_offset, 0);
  12001     BCM_IF_ERROR_RETURN(rv);
  12002 
  12003     sal_memset(&params, 0, sizeof(params));
  12004 
  12005     switch (action) {
  12006         case bcmFieldActionGpCosQNew:
  12007         case bcmFieldActionYpCosQNew:
  12008         case bcmFieldActionRpCosQNew:
  12009             /* For the cosQNew action, the param received has to be set
  12010              * for both ucast and mcast.
  12011              * The lower 4 bits of G/Y/R_COS_INT_PRI should be set with ucosq
  12012              * and the upper 4 bits should be set with mcosq.
  12013              * For Helix5 Lower 5 bits is UcosQ and upper 5 mcosq.
  12014              */
  12015             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12016             if (SOC_IS_HELIX5(unit)) {
  12017                 ucosq =  (params.cosq_new) & (0x1f);
  12018                 mcosq =  (((params.cosq_new) & 0x1f) << 5);
  12019             } else {
  12020                 ucosq =  (params.cosq_new) & (0xf);
  12021                 mcosq =  (((params.cosq_new) & 0xf) << 4);
  12022             }
  12023             params.cosq_new = ucosq | mcosq;
  12024             a_offset.value[0] = params.cosq_new;
  12025             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12026             break;
  12027         case bcmFieldActionGpCosMapNew:
  12028         case bcmFieldActionYpCosMapNew:
  12029         case bcmFieldActionRpCosMapNew:
  12030             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12031             a_offset.value[0] = params.cosq_new;
  12032             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12033             break;
  12034         case bcmFieldActionGpPrioIntCopy:
  12035         case bcmFieldActionYpPrioIntCopy:
  12036         case bcmFieldActionRpPrioIntCopy:
  12037         case bcmFieldActionGpPrioIntTos:
  12038         case bcmFieldActionYpPrioIntTos:
  12039         case bcmFieldActionRpPrioIntTos:
  12040         case bcmFieldActionGpPrioIntCancel:
  12041         case bcmFieldActionYpPrioIntCancel:
  12042         case bcmFieldActionRpPrioIntCancel:
  12043             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12044             break;
  12045         case bcmFieldActionGpPrioIntNew:
  12046         case bcmFieldActionYpPrioIntNew:
  12047         case bcmFieldActionRpPrioIntNew:
  12048             a_offset.value[0] = fa->param[0];
  12049             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12050             break;
  12051         case bcmFieldActionGpIntCongestionNotificationNew:
  12052         case bcmFieldActionYpIntCongestionNotificationNew:
  12053         case bcmFieldActionRpIntCongestionNotificationNew:
  12054         case bcmFieldActionPfcClassNew:
  12055             a_offset.value[0] = fa->param[0];
  12056             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12057             break;
  12058         case bcmFieldActionGpUcastCosQNew:
  12059             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12060             ucosq = params.cosq_new;
  12061             mcast_mode_set = 0;
  12062             /* Check if corresponding multicast action is set for this entry */
  12063             for (f_ent_act = f_ent->actions;
  12064                  f_ent_act != NULL;
  12065                  f_ent_act = f_ent_act->next) {
  12066                 if (bcmFieldActionGpMcastCosQNew == f_ent_act->action ||
  12067                     bcmFieldActionMcastCosQNew == f_ent_act->action) {
  12068                     sal_memset(&params, 0, sizeof(params));
  12069                     /* Get current Mcast queue value */
  12070                     mcast_mode_set = 1;
  12071                     ACTION_RESOLVE(unit, f_ent, f_ent_act, &params);
  12072                     mcosq = params.cosq_new;
  12073                     break;
  12074                 }
  12075             }
  12076             if (0 == mcast_mode_set) {
  12077                 a_offset.value[0] = ucosq;
  12078                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12079             } else {
  12080                 /* Since both ucast and mcast queue modes are to be set,
  12081                  * the offset info of action bcmFieldActionGpCosQNew is used
  12082                  * ie 8 bits of G_COS_INT_PRI and
  12083                  *  value 1 for G_CHANGE_COS_OR_INT_PRI
  12084                  */
  12085                 action = bcmFieldActionGpCosQNew;
  12086                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  12087                 if (SOC_IS_HELIX5(unit)) {
  12088                     a_offset.value[0] = ucosq | (mcosq << 5);
  12089                 } else {
  12090                     a_offset.value[0] = ucosq | (mcosq << 4);
  12091                 }
  12092                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12093             }
  12094             break;
  12095         case bcmFieldActionYpUcastCosQNew:
  12096             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12097             ucosq = params.cosq_new;
  12098             mcast_mode_set = 0;
  12099             /* Check if corresponding multicast action is set for this entry */
  12100             for (f_ent_act = f_ent->actions;
  12101                  f_ent_act != NULL;
  12102                  f_ent_act = f_ent_act->next) {
  12103                 if (bcmFieldActionYpMcastCosQNew == f_ent_act->action ||
  12104                     bcmFieldActionMcastCosQNew == f_ent_act->action) {
  12105                     sal_memset(&params, 0, sizeof(params));
  12106                     /* Get current Mcast queue value */
  12107                     mcast_mode_set = 1;
  12108                     ACTION_RESOLVE(unit, f_ent, f_ent_act, &params);
  12109                     mcosq = params.cosq_new;
  12110                     break;
  12111                 }
  12112             }
  12113             if (0 == mcast_mode_set) {
  12114                 a_offset.value[0] = ucosq;
  12115                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12116             } else {
  12117                 /* Since both ucast and mcast queue modes are to be set,
  12118                  * the offset info of action bcmFieldActionYpCosQNew is used
  12119                  * ie 8 bits of Y_COS_INT_PRI and
  12120                  *  value 1 for Y_CHANGE_COS_OR_INT_PRI
  12121                  */
  12122                 action = bcmFieldActionYpCosQNew;
  12123                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  12124 
  12125                 if (SOC_IS_HELIX5(unit)) {
  12126                     a_offset.value[0] = ucosq | (mcosq << 5);
  12127                 } else {
  12128                     a_offset.value[0] = ucosq | (mcosq << 4);
  12129                 }
  12130                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12131             }
  12132             break;
  12133         case bcmFieldActionRpUcastCosQNew:
  12134             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12135             ucosq = params.cosq_new;
  12136             mcast_mode_set = 0;
  12137             /* Check if corresponding multicast action is set for this entry */
  12138             for (f_ent_act = f_ent->actions;
  12139                  f_ent_act != NULL;
  12140                  f_ent_act = f_ent_act->next) {
  12141                 if (bcmFieldActionRpMcastCosQNew == f_ent_act->action ||
  12142                     bcmFieldActionMcastCosQNew == f_ent_act->action) {
  12143                     sal_memset(&params, 0, sizeof(params));
  12144                     /* Get current Mcast queue value */
  12145                     mcast_mode_set = 1;
  12146                     ACTION_RESOLVE(unit, f_ent, f_ent_act, &params);
  12147                     mcosq = params.cosq_new;
  12148                     break;
  12149                 }
  12150             }
  12151             if (0 == mcast_mode_set) {
  12152                 a_offset.value[0] = ucosq;
  12153                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12154             } else {
  12155                 /* Since both ucast and mcast queue modes are to be set,
  12156                  * the offset info of action bcmFieldActionRpCosQNew is used
  12157                  * ie 8 bits of R_COS_INT_PRI and
  12158                  *  value 1 for R_CHANGE_COS_OR_INT_PRI
  12159                  */
  12160 
  12161                 action = bcmFieldActionRpCosQNew;
  12162                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  12163 
  12164                 if (SOC_IS_HELIX5(unit)) {
  12165                     a_offset.value[0] = ucosq | (mcosq << 5);
  12166                 } else {
  12167                     a_offset.value[0] = ucosq | (mcosq << 4);
  12168                 }
  12169                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12170             }
  12171             break;
  12172         case bcmFieldActionGpMcastCosQNew:
  12173             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12174             mcosq = params.cosq_new;
  12175             ucast_mode_set = 0;
  12176             /* Check if corresponding multicast action is set for this entry */
  12177             for (f_ent_act = f_ent->actions;
  12178                  f_ent_act != NULL;
  12179                  f_ent_act = f_ent_act->next) {
  12180                 if (bcmFieldActionGpUcastCosQNew == f_ent_act->action ||
  12181                     bcmFieldActionUcastCosQNew == f_ent_act->action) {
  12182                     sal_memset(&params, 0, sizeof(params));
  12183                     /* Get current Mcast queue value */
  12184                     ucast_mode_set = 1;
  12185                     ACTION_RESOLVE(unit, f_ent, f_ent_act, &params);
  12186                     ucosq = params.cosq_new;
  12187                     break;
  12188                 }
  12189             }
  12190             if (0 == ucast_mode_set) {
  12191                 a_offset.value[0] = mcosq;
  12192                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12193             } else {
  12194                 /* Since both ucast and mcast queue modes are to be set,
  12195                  * the offset info of action bcmFieldActionGpCosQNew is used
  12196                  * ie 8 bits of G_COS_INT_PRI and
  12197                  *  value 1 for G_CHANGE_COS_OR_INT_PRI
  12198                  */
  12199                 action = bcmFieldActionGpCosQNew;
  12200                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  12201 
  12202                 if (SOC_IS_HELIX5(unit)) {
  12203                     a_offset.value[0] = ucosq | (mcosq << 5);
  12204                 } else {
  12205                     a_offset.value[0] = ucosq | (mcosq << 4);
  12206                 }
  12207                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12208             }
  12209             break;
  12210         case bcmFieldActionYpMcastCosQNew:
  12211             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12212             mcosq = params.cosq_new;
  12213             ucast_mode_set = 0;
  12214             /* Check if corresponding multicast action is set for this entry */
  12215             for (f_ent_act = f_ent->actions;
  12216                  f_ent_act != NULL;
  12217                  f_ent_act = f_ent_act->next) {
  12218                 if (bcmFieldActionYpUcastCosQNew == f_ent_act->action ||
  12219                     bcmFieldActionUcastCosQNew == f_ent_act->action) {
  12220                     sal_memset(&params, 0, sizeof(params));
  12221                     /* Get current Mcast queue value */
  12222                     ucast_mode_set = 1;
  12223                     ACTION_RESOLVE(unit, f_ent, f_ent_act, &params);
  12224                     ucosq = params.cosq_new;
  12225                     break;
  12226                 }
  12227             }
  12228 
  12229             if (0 == ucast_mode_set) {
  12230                 a_offset.value[0] = mcosq;
  12231                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12232             } else {
  12233                 /* Since both ucast and mcast queue modes are to be set,
  12234                  * the offset info of action bcmFieldActionYpCosQNew is used
  12235                  * ie 8 bits of Y_COS_INT_PRI and
  12236                  *  value 1 for Y_CHANGE_COS_OR_INT_PRI
  12237                  */
  12238                 action = bcmFieldActionYpCosQNew;
  12239                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  12240 
  12241                 if (SOC_IS_HELIX5(unit)) {
  12242                     a_offset.value[0] = ucosq | (mcosq << 5);
  12243                 } else {
  12244                     a_offset.value[0] = ucosq | (mcosq << 4);
  12245                 }
  12246                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12247             }
  12248 
  12249             break;
  12250         case bcmFieldActionRpMcastCosQNew:
  12251             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12252             mcosq = params.cosq_new;
  12253             ucast_mode_set = 0;
  12254             /* Check if corresponding multicast action is set for this entry */
  12255             for (f_ent_act = f_ent->actions;
  12256                  f_ent_act != NULL;
  12257                  f_ent_act = f_ent_act->next) {
  12258                 if (bcmFieldActionRpUcastCosQNew == f_ent_act->action ||
  12259                     bcmFieldActionUcastCosQNew == f_ent_act->action) {
  12260                     sal_memset(&params, 0, sizeof(params));
  12261                     /* Get current Mcast queue value */
  12262                     ucast_mode_set = 1;
  12263                     ACTION_RESOLVE(unit, f_ent, f_ent_act, &params);
  12264                     ucosq = params.cosq_new;
  12265                     break;
  12266                 }
  12267             }
  12268 
  12269             if (0 == ucast_mode_set) {
  12270                 a_offset.value[0] = mcosq;
  12271                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12272             } else {
  12273                 /* Since both ucast and mcast queue modes are to be set,
  12274                  * the offset info of action bcmFieldActionRpCosQNew is used
  12275                  * ie 8 bits of R_COS_INT_PRI and
  12276                  *  value 1 for R_CHANGE_COS_OR_INT_PRI
  12277                  */
  12278                 action = bcmFieldActionRpCosQNew;
  12279                 ACTION_OFFSET_GET(unit, stage_fc, action, &a_offset, 0);
  12280 
  12281                 if (SOC_IS_HELIX5(unit)) {
  12282                     a_offset.value[0] = ucosq | (mcosq << 5);
  12283                 } else {
  12284                     a_offset.value[0] = ucosq | (mcosq << 4);
  12285                 }
  12286                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12287             }
  12288             break;
  12289         case bcmFieldActionGpDropPrecedence:
  12290         case bcmFieldActionYpDropPrecedence:
  12291         case bcmFieldActionRpDropPrecedence:
  12292             a_offset.value[0] = fa->param[0];
  12293             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12294             break;
  12295         case bcmFieldActionUntaggedPacketPriorityNew:
  12296             a_offset.value[0] = fa->param[0];
  12297             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12298             break;
  12299         default:
  12300             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  12301                         "%s is not found.\n"), action_name[action]));
  12302             return BCM_E_UNAVAIL;
  12303     }
  12304 
  12305     return BCM_E_NONE;
  12306 }
  12307 /*
  12308  * Function:
  12309  *     _bcm_field_th_profile1_action_set
  12310  * Purpose:
  12311  *     Set the color independent actions of IFP_PROFILE_ONE_SET
  12312  *     in entbuf which is to be written into POLICY table.
  12313  * Parameters:
  12314  *     unit     - BCM device number
  12315  *     action   - Field Action of type bcmFieldActionXXX
  12316  *     f_ent    - entry structure to get policy info from
  12317  *     fa       - field action
  12318  *     entbuf   - (OUT) Field Policy table entry
  12319  * Returns:
  12320  *     BCM_E_NONE
  12321  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  12322  * Notes:
  12323  *     This is a simple read/modify/write pattern.
  12324  *     FP unit lock should be held by calling function.
  12325  */
  12326 int
  12327 _bcm_field_th_profile1_action_set(int unit, _field_entry_t *f_ent,
  12328                                   _field_action_t *fa, uint32 *entbuf)
  12329 
  12330 {
  12331     int rv;
  12332 
  12333     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  12334         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  12335         return BCM_E_PARAM;
  12336     }
  12337 
  12338     switch (fa->action) {
  12339         case bcmFieldActionCosQNew:
  12340             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12341                                                       bcmFieldActionGpCosQNew,
  12342                                                       f_ent, fa, entbuf);
  12343             BCM_IF_ERROR_RETURN(rv);
  12344 
  12345             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12346                                                       bcmFieldActionYpCosQNew,
  12347                                                       f_ent, fa, entbuf);
  12348             BCM_IF_ERROR_RETURN(rv);
  12349 
  12350             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12351                                                       bcmFieldActionRpCosQNew,
  12352                                                       f_ent, fa, entbuf);
  12353             BCM_IF_ERROR_RETURN(rv);
  12354             break;
  12355         case bcmFieldActionCosMapNew:
  12356             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12357                                                       bcmFieldActionGpCosMapNew,
  12358                                                       f_ent, fa, entbuf);
  12359             BCM_IF_ERROR_RETURN(rv);
  12360 
  12361             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12362                                                       bcmFieldActionYpCosMapNew,
  12363                                                       f_ent, fa, entbuf);
  12364             BCM_IF_ERROR_RETURN(rv);
  12365 
  12366             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12367                                                       bcmFieldActionRpCosMapNew,
  12368                                                       f_ent, fa, entbuf);
  12369             BCM_IF_ERROR_RETURN(rv);
  12370             break;
  12371         case bcmFieldActionPrioIntCopy:
  12372         case bcmFieldActionPrioPktAndIntCopy:
  12373             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12374                                                     bcmFieldActionGpPrioIntCopy,
  12375                                                     f_ent, fa, entbuf);
  12376             BCM_IF_ERROR_RETURN(rv);
  12377 
  12378             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12379                                                     bcmFieldActionYpPrioIntCopy,
  12380                                                     f_ent, fa, entbuf);
  12381             BCM_IF_ERROR_RETURN(rv);
  12382 
  12383             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12384                                                     bcmFieldActionRpPrioIntCopy,
  12385                                                     f_ent, fa, entbuf);
  12386             BCM_IF_ERROR_RETURN(rv);
  12387             break;
  12388         case bcmFieldActionRpPrioPktAndIntCopy:
  12389             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12390                                                     bcmFieldActionRpPrioIntCopy,
  12391                                                     f_ent, fa, entbuf);
  12392             BCM_IF_ERROR_RETURN(rv);
  12393             break;
  12394         case bcmFieldActionYpPrioPktAndIntCopy:
  12395             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12396                                                     bcmFieldActionYpPrioIntCopy,
  12397                                                     f_ent, fa, entbuf);
  12398             BCM_IF_ERROR_RETURN(rv);
  12399             break;
  12400         case bcmFieldActionGpPrioPktAndIntCopy:
  12401             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12402                                                     bcmFieldActionGpPrioIntCopy,
  12403                                                     f_ent, fa, entbuf);
  12404             BCM_IF_ERROR_RETURN(rv);
  12405             break;
  12406         case bcmFieldActionPrioIntNew:
  12407         case bcmFieldActionPrioPktAndIntNew:
  12408             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12409                                                      bcmFieldActionGpPrioIntNew,
  12410                                                      f_ent, fa, entbuf);
  12411             BCM_IF_ERROR_RETURN(rv);
  12412 
  12413             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12414                                                      bcmFieldActionYpPrioIntNew,
  12415                                                      f_ent, fa, entbuf);
  12416             BCM_IF_ERROR_RETURN(rv);
  12417 
  12418             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12419                                                      bcmFieldActionRpPrioIntNew,
  12420                                                      f_ent, fa, entbuf);
  12421             BCM_IF_ERROR_RETURN(rv);
  12422             break;
  12423         case bcmFieldActionRpPrioPktAndIntNew:
  12424             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12425                                                      bcmFieldActionRpPrioIntNew,
  12426                                                      f_ent, fa, entbuf);
  12427             BCM_IF_ERROR_RETURN(rv);
  12428             break;
  12429         case bcmFieldActionYpPrioPktAndIntNew:
  12430             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12431                                                      bcmFieldActionYpPrioIntNew,
  12432                                                      f_ent, fa, entbuf);
  12433             BCM_IF_ERROR_RETURN(rv);
  12434             break;
  12435         case bcmFieldActionGpPrioPktAndIntNew:
  12436             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12437                                                      bcmFieldActionGpPrioIntNew,
  12438                                                      f_ent, fa, entbuf);
  12439             BCM_IF_ERROR_RETURN(rv);
  12440             break;
  12441         case bcmFieldActionPrioIntTos:
  12442         case bcmFieldActionPrioPktAndIntTos:
  12443             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12444                                                      bcmFieldActionGpPrioIntTos,
  12445                                                      f_ent, fa, entbuf);
  12446             BCM_IF_ERROR_RETURN(rv);
  12447 
  12448             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12449                                                      bcmFieldActionYpPrioIntTos,
  12450                                                      f_ent, fa, entbuf);
  12451             BCM_IF_ERROR_RETURN(rv);
  12452 
  12453             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12454                                                      bcmFieldActionRpPrioIntTos,
  12455                                                      f_ent, fa, entbuf);
  12456             BCM_IF_ERROR_RETURN(rv);
  12457             break;
  12458         case bcmFieldActionRpPrioPktAndIntTos:
  12459             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12460                                                      bcmFieldActionRpPrioIntTos,
  12461                                                      f_ent, fa, entbuf);
  12462             BCM_IF_ERROR_RETURN(rv);
  12463             break;
  12464         case bcmFieldActionYpPrioPktAndIntTos:
  12465             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12466                                                      bcmFieldActionYpPrioIntTos,
  12467                                                      f_ent, fa, entbuf);
  12468             BCM_IF_ERROR_RETURN(rv);
  12469             break;
  12470         case bcmFieldActionGpPrioPktAndIntTos:
  12471             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12472                                                      bcmFieldActionGpPrioIntTos,
  12473                                                      f_ent, fa, entbuf);
  12474             BCM_IF_ERROR_RETURN(rv);
  12475             break;
  12476         case bcmFieldActionPrioIntCancel:
  12477         case bcmFieldActionPrioPktAndIntCancel:
  12478             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12479                                                   bcmFieldActionGpPrioIntCancel,
  12480                                                   f_ent, fa, entbuf);
  12481             BCM_IF_ERROR_RETURN(rv);
  12482 
  12483             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12484                                                   bcmFieldActionYpPrioIntCancel,
  12485                                                   f_ent, fa, entbuf);
  12486             BCM_IF_ERROR_RETURN(rv);
  12487 
  12488             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12489                                                   bcmFieldActionRpPrioIntCancel,
  12490                                                   f_ent, fa, entbuf);
  12491             BCM_IF_ERROR_RETURN(rv);
  12492             break;
  12493         case bcmFieldActionRpPrioPktAndIntCancel:
  12494             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12495                                                   bcmFieldActionRpPrioIntCancel,
  12496                                                   f_ent, fa, entbuf);
  12497             BCM_IF_ERROR_RETURN(rv);
  12498             break;
  12499         case bcmFieldActionYpPrioPktAndIntCancel:
  12500             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12501                                                   bcmFieldActionYpPrioIntCancel,
  12502                                                   f_ent, fa, entbuf);
  12503             BCM_IF_ERROR_RETURN(rv);
  12504             break;
  12505         case bcmFieldActionGpPrioPktAndIntCancel:
  12506             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12507                                                   bcmFieldActionGpPrioIntCancel,
  12508                                                   f_ent, fa, entbuf);
  12509             BCM_IF_ERROR_RETURN(rv);
  12510             break;
  12511         case bcmFieldActionUcastCosQNew:
  12512             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12513                                                    bcmFieldActionGpUcastCosQNew,
  12514                                                    f_ent, fa, entbuf);
  12515             BCM_IF_ERROR_RETURN(rv);
  12516 
  12517             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12518                                                    bcmFieldActionYpUcastCosQNew,
  12519                                                    f_ent, fa, entbuf);
  12520             BCM_IF_ERROR_RETURN(rv);
  12521 
  12522             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12523                                                    bcmFieldActionRpUcastCosQNew,
  12524                                                    f_ent, fa, entbuf);
  12525             BCM_IF_ERROR_RETURN(rv);
  12526             break;
  12527         case bcmFieldActionMcastCosQNew:
  12528             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12529                                                    bcmFieldActionGpMcastCosQNew,
  12530                                                    f_ent, fa, entbuf);
  12531             BCM_IF_ERROR_RETURN(rv);
  12532 
  12533             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12534                                                    bcmFieldActionYpMcastCosQNew,
  12535                                                    f_ent, fa, entbuf);
  12536             BCM_IF_ERROR_RETURN(rv);
  12537 
  12538             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12539                                                    bcmFieldActionRpMcastCosQNew,
  12540                                                    f_ent, fa, entbuf);
  12541             BCM_IF_ERROR_RETURN(rv);
  12542             break;
  12543         case bcmFieldActionDropPrecedence:
  12544             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12545                                                  bcmFieldActionGpDropPrecedence,
  12546                                                  f_ent, fa, entbuf);
  12547             BCM_IF_ERROR_RETURN(rv);
  12548 
  12549             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12550                                                  bcmFieldActionYpDropPrecedence,
  12551                                                  f_ent, fa, entbuf);
  12552             BCM_IF_ERROR_RETURN(rv);
  12553 
  12554             rv = _bcm_field_th_profile1_cd_action_set(unit,
  12555                                                  bcmFieldActionRpDropPrecedence,
  12556                                                  f_ent, fa, entbuf);
  12557             BCM_IF_ERROR_RETURN(rv);
  12558             break;
  12559         default:
  12560             return _bcm_field_th_profile1_cd_action_set(unit, fa->action,
  12561                                                         f_ent, fa, entbuf);
  12562     }
  12563 
  12564     return BCM_E_NONE;
  12565 }
  12566 /*
  12567  * Function:
  12568  *     _bcm_field_th_profile2_cd_action_set
  12569  * Purpose:
  12570  *     Set the color dependent actions of IFP_PROFILE_TWO_SET
  12571  *     in entbuf which is to be written into POLICY table.
  12572  * Parameters:
  12573  *     unit     - BCM device number
  12574  *     action   - Field Action of type bcmFieldActionXXX
  12575  *     f_ent    - entry structure to get policy info from
  12576  *     fa       - field action
  12577  *     entbuf   - (OUT) Field Policy table entry
  12578  * Returns:
  12579  *     BCM_E_NONE
  12580  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  12581  * Notes:
  12582  *     This is a simple read/modify/write pattern.
  12583  *     FP unit lock should be held by calling function.
  12584  */
  12585 int
  12586 _bcm_field_th_profile2_cd_action_set(int unit,
  12587                                      bcm_field_action_t action,
  12588                                      _field_entry_t *f_ent,
  12589                                      _field_action_t *fa, uint32 *entbuf)
  12590 
  12591 {
  12592     int rv;
  12593     _field_stage_t *stage_fc;
  12594     _bcm_field_action_offset_t a_offset;
  12595 
  12596 
  12597     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  12598         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  12599         return BCM_E_PARAM;
  12600     }
  12601 
  12602     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  12603     BCM_IF_ERROR_RETURN(rv);
  12604 
  12605     rv = _bcm_field_action_offset_get(unit, stage_fc, action, &a_offset, 0);
  12606     BCM_IF_ERROR_RETURN(rv);
  12607 
  12608     switch (action) {
  12609         case bcmFieldActionGpPrioPktNew:
  12610         case bcmFieldActionYpPrioPktNew:
  12611         case bcmFieldActionRpPrioPktNew:
  12612         case bcmFieldActionGpTosPrecedenceNew:
  12613         case bcmFieldActionGpDscpNew:
  12614         case bcmFieldActionYpDscpNew:
  12615         case bcmFieldActionRpDscpNew:
  12616         case bcmFieldActionGpEcnNew:
  12617         case bcmFieldActionYpEcnNew:
  12618         case bcmFieldActionRpEcnNew:
  12619             a_offset.value[0] = fa->param[0];
  12620             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12621             break;
  12622         case bcmFieldActionGpPrioPktCopy:
  12623         case bcmFieldActionGpPrioPktTos:
  12624         case bcmFieldActionGpPrioPktCancel:
  12625         case bcmFieldActionGpDot1pPreserve:
  12626         case bcmFieldActionGpTosPrecedenceCopy:
  12627         case bcmFieldActionGpDscpCancel:
  12628         case bcmFieldActionGpDscpPreserve:
  12629         case bcmFieldActionYpPrioPktCopy:
  12630         case bcmFieldActionYpPrioPktTos:
  12631         case bcmFieldActionYpPrioPktCancel:
  12632         case bcmFieldActionYpDot1pPreserve:
  12633         case bcmFieldActionYpDscpCancel:
  12634         case bcmFieldActionYpDscpPreserve:
  12635         case bcmFieldActionRpPrioPktCopy:
  12636         case bcmFieldActionRpPrioPktTos:
  12637         case bcmFieldActionRpPrioPktCancel:
  12638         case bcmFieldActionRpDot1pPreserve:
  12639         case bcmFieldActionRpDscpCancel:
  12640         case bcmFieldActionRpDscpPreserve:
  12641             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12642             break;
  12643         default:
  12644             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  12645                         "%s is not found.\n"), action_name[action]));
  12646             return BCM_E_UNAVAIL;
  12647     }
  12648 
  12649     return BCM_E_NONE;
  12650 }
  12651 /*
  12652  * Function:
  12653  *     _bcm_field_th_profile2_action_set
  12654  * Purpose:
  12655  *     Set the color independent actions of IFP_PROFILE_TWO_SET
  12656  *     in entbuf which is to be written into POLICY table.
  12657  * Parameters:
  12658  *     unit     - BCM device number
  12659  *     action   - Field Action of type bcmFieldActionXXX
  12660  *     f_ent    - entry structure to get policy info from
  12661  *     fa       - field action
  12662  *     entbuf   - (OUT) Field Policy table entry
  12663  * Returns:
  12664  *     BCM_E_NONE
  12665  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  12666  * Notes:
  12667  *     This is a simple read/modify/write pattern.
  12668  *     FP unit lock should be held by calling function.
  12669  */
  12670 int
  12671 _bcm_field_th_profile2_action_set(int unit, _field_entry_t *f_ent,
  12672                                   _field_action_t *fa, uint32 *entbuf)
  12673 
  12674 {
  12675     int rv;
  12676 
  12677     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  12678         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  12679         return BCM_E_PARAM;
  12680     }
  12681 
  12682     switch (fa->action) {
  12683         case bcmFieldActionEcnNew:
  12684             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12685                                                       bcmFieldActionGpEcnNew,
  12686                                                       f_ent, fa, entbuf);
  12687             BCM_IF_ERROR_RETURN(rv);
  12688 
  12689             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12690                                                       bcmFieldActionYpEcnNew,
  12691                                                       f_ent, fa, entbuf);
  12692             BCM_IF_ERROR_RETURN(rv);
  12693 
  12694             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12695                                                       bcmFieldActionRpEcnNew,
  12696                                                       f_ent, fa, entbuf);
  12697             BCM_IF_ERROR_RETURN(rv);
  12698             break;
  12699         case bcmFieldActionPrioPktNew:
  12700         case bcmFieldActionPrioPktAndIntNew:
  12701             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12702                                                       bcmFieldActionGpPrioPktNew,
  12703                                                       f_ent, fa, entbuf);
  12704             BCM_IF_ERROR_RETURN(rv);
  12705 
  12706             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12707                                                       bcmFieldActionYpPrioPktNew,
  12708                                                       f_ent, fa, entbuf);
  12709             BCM_IF_ERROR_RETURN(rv);
  12710 
  12711             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12712                                                       bcmFieldActionRpPrioPktNew,
  12713                                                       f_ent, fa, entbuf);
  12714             BCM_IF_ERROR_RETURN(rv);
  12715             break;
  12716         case bcmFieldActionDscpNew:
  12717             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12718                                                       bcmFieldActionGpDscpNew,
  12719                                                       f_ent, fa, entbuf);
  12720             BCM_IF_ERROR_RETURN(rv);
  12721 
  12722             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12723                                                       bcmFieldActionYpDscpNew,
  12724                                                       f_ent, fa, entbuf);
  12725             BCM_IF_ERROR_RETURN(rv);
  12726 
  12727             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12728                                                       bcmFieldActionRpDscpNew,
  12729                                                       f_ent, fa, entbuf);
  12730             BCM_IF_ERROR_RETURN(rv);
  12731             break;
  12732         case bcmFieldActionDscpCancel:
  12733             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12734                                                       bcmFieldActionGpDscpCancel,
  12735                                                       f_ent, fa, entbuf);
  12736             BCM_IF_ERROR_RETURN(rv);
  12737 
  12738             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12739                                                       bcmFieldActionYpDscpCancel,
  12740                                                       f_ent, fa, entbuf);
  12741             BCM_IF_ERROR_RETURN(rv);
  12742 
  12743             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12744                                                       bcmFieldActionRpDscpCancel,
  12745                                                       f_ent, fa, entbuf);
  12746             BCM_IF_ERROR_RETURN(rv);
  12747             break;
  12748         case bcmFieldActionDscpPreserve:
  12749             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12750                                                       bcmFieldActionGpDscpPreserve,
  12751                                                       f_ent, fa, entbuf);
  12752             BCM_IF_ERROR_RETURN(rv);
  12753 
  12754             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12755                                                       bcmFieldActionYpDscpPreserve,
  12756                                                       f_ent, fa, entbuf);
  12757             BCM_IF_ERROR_RETURN(rv);
  12758 
  12759             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12760                                                       bcmFieldActionRpDscpPreserve,
  12761                                                       f_ent, fa, entbuf);
  12762             BCM_IF_ERROR_RETURN(rv);
  12763             break;
  12764         case bcmFieldActionPrioPktCopy:
  12765         case bcmFieldActionPrioPktAndIntCopy:
  12766             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12767                                                       bcmFieldActionGpPrioPktCopy,
  12768                                                       f_ent, fa, entbuf);
  12769             BCM_IF_ERROR_RETURN(rv);
  12770 
  12771             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12772                                                       bcmFieldActionYpPrioPktCopy,
  12773                                                       f_ent, fa, entbuf);
  12774             BCM_IF_ERROR_RETURN(rv);
  12775 
  12776             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12777                                                       bcmFieldActionRpPrioPktCopy,
  12778                                                       f_ent, fa, entbuf);
  12779             BCM_IF_ERROR_RETURN(rv);
  12780             break;
  12781         case bcmFieldActionPrioPktTos:
  12782         case bcmFieldActionPrioPktAndIntTos:
  12783             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12784                                                       bcmFieldActionGpPrioPktTos,
  12785                                                       f_ent, fa, entbuf);
  12786             BCM_IF_ERROR_RETURN(rv);
  12787 
  12788             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12789                                                       bcmFieldActionYpPrioPktTos,
  12790                                                       f_ent, fa, entbuf);
  12791             BCM_IF_ERROR_RETURN(rv);
  12792 
  12793             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12794                                                       bcmFieldActionRpPrioPktTos,
  12795                                                       f_ent, fa, entbuf);
  12796             BCM_IF_ERROR_RETURN(rv);
  12797             break;
  12798         case bcmFieldActionPrioPktCancel:
  12799         case bcmFieldActionPrioPktAndIntCancel:
  12800             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12801                                                       bcmFieldActionGpPrioPktCancel,
  12802                                                       f_ent, fa, entbuf);
  12803             BCM_IF_ERROR_RETURN(rv);
  12804 
  12805             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12806                                                       bcmFieldActionYpPrioPktCancel,
  12807                                                       f_ent, fa, entbuf);
  12808             BCM_IF_ERROR_RETURN(rv);
  12809 
  12810             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12811                                                       bcmFieldActionRpPrioPktCancel,
  12812                                                       f_ent, fa, entbuf);
  12813             BCM_IF_ERROR_RETURN(rv);
  12814             break;
  12815         case bcmFieldActionDot1pPreserve:
  12816             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12817                                                       bcmFieldActionGpDot1pPreserve,
  12818                                                       f_ent, fa, entbuf);
  12819             BCM_IF_ERROR_RETURN(rv);
  12820 
  12821             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12822                                                       bcmFieldActionYpDot1pPreserve,
  12823                                                       f_ent, fa, entbuf);
  12824             BCM_IF_ERROR_RETURN(rv);
  12825 
  12826             rv = _bcm_field_th_profile2_cd_action_set(unit,
  12827                                                       bcmFieldActionRpDot1pPreserve,
  12828                                                       f_ent, fa, entbuf);
  12829             BCM_IF_ERROR_RETURN(rv);
  12830             break;
  12831         default:
  12832             return _bcm_field_th_profile2_cd_action_set(unit, fa->action,
  12833                                                         f_ent, fa, entbuf);
  12834     }
  12835 
  12836     return BCM_E_NONE;
  12837 }
  12838 /*
  12839  * Function:
  12840  *     _bcm_field_th_redirect_action_set
  12841  * Purpose:
  12842  *     Set the actions of IFP_REDIRECT_SET in entbuf
  12843  *     which is to be written into POLICY table.
  12844  * Parameters:
  12845  *     unit     - BCM device number
  12846  *     action   - Field Action of type bcmFieldActionXXX
  12847  *     f_ent    - entry structure to get policy info from
  12848  *     fa       - field action
  12849  *     entbuf   - (OUT) Field Policy table entry
  12850  * Returns:
  12851  *     BCM_E_NONE
  12852  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  12853  * Notes:
  12854  *     This is a simple read/modify/write pattern.
  12855  *     FP unit lock should be held by calling function.
  12856  */
  12857 int
  12858 _bcm_field_th_redirect_action_set(int unit,
  12859                                   _field_entry_t *f_ent,
  12860                                   _field_action_t *fa, uint32 *entbuf)
  12861 
  12862 {
  12863     int rv;
  12864     _field_stage_t *stage_fc;
  12865     _field_action_params_t params;
  12866     _bcm_field_action_offset_t a_offset;
  12867 
  12868 
  12869     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  12870         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  12871         return BCM_E_PARAM;
  12872     }
  12873 
  12874     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  12875     BCM_IF_ERROR_RETURN(rv);
  12876 
  12877     sal_memset(&params, 0, sizeof(params));
  12878 
  12879     switch(fa->action) {
  12880         case bcmFieldActionRedirectTrunk:
  12881             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12882             if (params.is_dvp) {
  12883                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  12884                                   _BCM_FIELD_ACTION_REDIRECT_DVP);
  12885             } else {
  12886                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  12887                                   _BCM_FIELD_ACTION_REDIRECT_TRUNK);
  12888             }
  12889             a_offset.value[0] = params.redirect_value;
  12890             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12891             break;
  12892         case bcmFieldActionRedirect:
  12893         case bcmFieldActionUnmodifiedPacketRedirectPort:
  12894             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12895             if (params.is_dvp) {
  12896                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  12897                                       _BCM_FIELD_ACTION_REDIRECT_DVP);
  12898             } else if (params.is_trunk) {
  12899                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  12900                                       _BCM_FIELD_ACTION_REDIRECT_TRUNK);
  12901             } else {
  12902                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  12903                                        _BCM_FIELD_ACTION_REDIRECT_DGLP);
  12904             }
  12905             a_offset.value[0] = params.redirect_value;
  12906             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12907             break;
  12908 #ifdef INCLUDE_L3
  12909         case bcmFieldActionRedirectEgrNextHop:
  12910             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12911             if (params.flags & BCM_L3_MULTIPATH) {
  12912                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  12913                                       _BCM_FIELD_ACTION_REDIRECT_ECMP);
  12914             } else {
  12915                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  12916                                       _BCM_FIELD_ACTION_REDIRECT_NEXT_HOP);
  12917             }
  12918             a_offset.value[0] = params.nh_ecmp_id;
  12919             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12920             break;
  12921 #endif
  12922         case bcmFieldActionRedirectCancel:
  12923             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  12924             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12925             break;
  12926         case bcmFieldActionRedirectPbmp:
  12927         case bcmFieldActionRedirectVlan:
  12928         case bcmFieldActionRedirectBcastPbmp:
  12929         case bcmFieldActionRedirectMcast:
  12930 #ifdef INCLUDE_L3
  12931         case bcmFieldActionRedirectIpmc:
  12932 #endif
  12933             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  12934             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12935             a_offset.value[0] = params.redirect_value;
  12936             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12937             break;
  12938         case bcmFieldActionEgressMask:
  12939             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  12940             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12941             a_offset.value[0] = params.redirect_value;
  12942             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12943             break;
  12944         case bcmFieldActionEgressPortsAdd:
  12945             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  12946             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12947             a_offset.value[0] = params.redirect_value;
  12948             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12949             break;
  12950         case bcmFieldActionFabricEHAddOrUpdate:
  12951             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  12952             ACTION_RESOLVE(unit, f_ent, fa, &params);
  12953             a_offset.value[0] = params.eh_tag;
  12954             a_offset.value[1] = params.eh_tag_mask_index;
  12955             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  12956             break;
  12957         default:
  12958             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  12959                         "%s is not found.\n"), action_name[fa->action]));
  12960             return BCM_E_UNAVAIL;
  12961     }
  12962 
  12963     return BCM_E_NONE;
  12964 }
  12965 /*
  12966  * Function:
  12967  *     _bcm_field_th_l3swl2change_action_set
  12968  * Purpose:
  12969  *     Set the actions of IFP_REDIRECT_SET in entbuf
  12970  *     which is to be written into POLICY table.
  12971  * Parameters:
  12972  *     unit     - BCM device number
  12973  *     action   - Field Action of type bcmFieldActionXXX
  12974  *     f_ent    - entry structure to get policy info from
  12975  *     fa       - field action
  12976  *     entbuf   - (OUT) Field Policy table entry
  12977  * Returns:
  12978  *     BCM_E_NONE
  12979  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  12980  * Notes:
  12981  *     This is a simple read/modify/write pattern.
  12982  *     FP unit lock should be held by calling function.
  12983  */
  12984 int
  12985 _bcm_field_th_l3swl2change_action_set(int unit,
  12986                                       _field_entry_t *f_ent,
  12987                                       _field_action_t *fa, uint32 *entbuf)
  12988 {
  12989     int rv;
  12990     _field_stage_t *stage_fc;
  12991     _field_action_params_t params;
  12992     _bcm_field_action_offset_t a_offset;
  12993 
  12994     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  12995         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  12996         return BCM_E_PARAM;
  12997     }
  12998 
  12999     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  13000     BCM_IF_ERROR_RETURN(rv);
  13001 
  13002     sal_memset(&params, 0, sizeof(params));
  13003 
  13004     switch (fa->action) {
  13005         case bcmFieldActionEgressClassSelect:
  13006             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  13007             ACTION_RESOLVE(unit, f_ent, fa, &params);
  13008             a_offset.value[0] = params.i2e_cl_sel;
  13009             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13010             break;
  13011         case bcmFieldActionHiGigClassSelect:
  13012             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  13013             ACTION_RESOLVE(unit, f_ent, fa, &params);
  13014             a_offset.value[0] = params.i2e_hg_cl_sel;
  13015             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13016             break;
  13017         case bcmFieldActionNewClassId:
  13018         case bcmFieldActionAddClassTag:
  13019         case bcmFieldActionMultipathHash:
  13020             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  13021             a_offset.value[0] = fa->param[0];
  13022             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13023             break;
  13024         case bcmFieldActionDstMacNew:
  13025         case bcmFieldActionSrcMacNew:
  13026         case bcmFieldActionOuterVlanNew:
  13027         case bcmFieldActionVnTagNew:
  13028         case bcmFieldActionVnTagDelete:
  13029         case bcmFieldActionEtagNew:
  13030         case bcmFieldActionEtagDelete:
  13031         case bcmFieldActionChangeL2Fields:
  13032             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  13033             a_offset.value[0] = fa->hw_index;
  13034             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13035             break;
  13036         case bcmFieldActionFabricQueue:
  13037             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  13038             ACTION_RESOLVE(unit, f_ent, fa, &params);
  13039             a_offset.value[0] = params.fabric_tag_type;
  13040             a_offset.value[1] = params.fabric_tag;
  13041             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13042             break;
  13043         case bcmFieldActionL3Switch:
  13044 #ifdef INCLUDE_L3
  13045             ACTION_RESOLVE(unit, f_ent, fa, &params);
  13046             if (params.flags & BCM_L3_MULTIPATH) {
  13047                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  13048                                      _BCM_FIELD_ACTION_L3SWITCH_ECMP);
  13049                 a_offset.value[0]  = params.nh_ecmp_id;
  13050                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13051             } else {
  13052                 ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset,
  13053                                  _BCM_FIELD_ACTION_L3SWITCH_NEXT_HOP);
  13054                 a_offset.value[0] = params.nh_ecmp_id;
  13055                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13056             }
  13057 #else
  13058             return BCM_E_UNAVAIL;
  13059 #endif
  13060             break;
  13061         case bcmFieldActionL3SwitchCancel:
  13062         case bcmFieldActionChangeL2FieldsCancel:
  13063             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  13064             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13065             break;
  13066         case bcmFieldActionBFDSessionIdNew:
  13067             ACTION_OFFSET_GET(unit, stage_fc, fa->action, &a_offset, 0);
  13068             a_offset.value[0] = fa->param[0];
  13069             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13070             break;
  13071         default:
  13072             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  13073                         "%s is not found.\n"), action_name[fa->action]));
  13074             return BCM_E_UNAVAIL;
  13075     }
  13076 
  13077     return BCM_E_NONE;
  13078 }
  13079 /*
  13080  * Function:
  13081  *     _bcm_field_th_misc_cd_action_set
  13082  * Purpose:
  13083  *     Set the miscellaneous color dependent actions in entbuf which is to be
  13084  *     written into POLICY table.
  13085  * Parameters:
  13086  *     unit     - BCM device number
  13087  *     action   - Field Action of type bcmFieldActionXXX
  13088  *     f_ent    - entry structure to get policy info from
  13089  *     fa       - field action
  13090  *     entbuf   - (OUT) Field Policy table entry
  13091  * Returns:
  13092  *     BCM_E_NONE
  13093  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  13094  * Notes:
  13095  *     This is a simple read/modify/write pattern.
  13096  *     FP unit lock should be held by calling function.
  13097  */
  13098 int
  13099 _bcm_field_th_misc_cd_action_set(int unit,
  13100                                  bcm_field_action_t action,
  13101                                  _field_entry_t *f_ent,
  13102                                  _field_action_t *fa, uint32 *entbuf)
  13103 {
  13104     int rv;
  13105     _field_stage_t *stage_fc;
  13106     _field_action_params_t params;
  13107     _bcm_field_action_offset_t a_offset;
  13108 
  13109     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  13110         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  13111         return BCM_E_PARAM;
  13112     }
  13113 
  13114     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  13115     BCM_IF_ERROR_RETURN(rv);
  13116 
  13117     rv = _bcm_field_action_offset_get(unit, stage_fc, action, &a_offset, 0);
  13118     BCM_IF_ERROR_RETURN(rv);
  13119 
  13120     sal_memset(&params, 0, sizeof(params));
  13121 
  13122     switch (action) {
  13123         case bcmFieldActionGpSwitchToCpuReinstate:
  13124         case bcmFieldActionYpSwitchToCpuReinstate:
  13125         case bcmFieldActionRpSwitchToCpuReinstate:
  13126         case bcmFieldActionGpDrop:
  13127         case bcmFieldActionYpDrop:
  13128         case bcmFieldActionRpDrop:
  13129         case bcmFieldActionGpDropCancel:
  13130         case bcmFieldActionYpDropCancel:
  13131         case bcmFieldActionRpDropCancel:
  13132             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13133             break;
  13134         case bcmFieldActionGpTimeStampToCpu:
  13135         case bcmFieldActionYpTimeStampToCpu:
  13136         case bcmFieldActionRpTimeStampToCpu:
  13137         case bcmFieldActionGpCopyToCpu:
  13138         case bcmFieldActionYpCopyToCpu:
  13139         case bcmFieldActionRpCopyToCpu:
  13140         case bcmFieldActionGpOamCopyToCpu:
  13141         case bcmFieldActionYpOamCopyToCpu:
  13142         case bcmFieldActionRpOamCopyToCpu:
  13143             if (fa->param[0]) {
  13144                 a_offset.value[0] = fa->param[1];
  13145             } else {
  13146                 a_offset.value[0] = 0;
  13147             }
  13148             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13149             break;
  13150         case bcmFieldActionGpCopyToCpuCancel:
  13151             sal_memset(&a_offset, 0 , sizeof(a_offset));
  13152             action = bcmFieldActionGpSwitchToCpuCancel;
  13153             ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset);
  13154             if (a_offset.value[0] == 0x3) {
  13155                 a_offset.value[0] = 0x6;
  13156             } else {
  13157                 a_offset.value[0] = 0x2;
  13158             }
  13159             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13160             break;
  13161         case bcmFieldActionYpCopyToCpuCancel:
  13162             sal_memset(&a_offset, 0 , sizeof(a_offset));
  13163             action = bcmFieldActionYpSwitchToCpuCancel;
  13164             ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset);
  13165             if (a_offset.value[0] == 0x3) {
  13166                 a_offset.value[0] = 0x6;
  13167             } else {
  13168                 a_offset.value[0] = 0x2;
  13169             }
  13170             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13171             break;
  13172         case bcmFieldActionRpCopyToCpuCancel:
  13173             sal_memset(&a_offset, 0 , sizeof(a_offset));
  13174             action = bcmFieldActionRpSwitchToCpuCancel;
  13175             ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset);
  13176             if (a_offset.value[0] == 0x3) {
  13177                 a_offset.value[0] = 0x6;
  13178             } else {
  13179                 a_offset.value[0] = 0x2;
  13180             }
  13181             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13182             break;
  13183         case bcmFieldActionGpSwitchToCpuCancel:
  13184             sal_memset(&a_offset, 0 , sizeof(a_offset));
  13185             action = bcmFieldActionGpCopyToCpuCancel;
  13186             ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset);
  13187             if (a_offset.value[0] == 0x2) {
  13188                 a_offset.value[0] = 0x6;
  13189             } else {
  13190                 a_offset.value[0] = 0x3;
  13191             }
  13192             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13193             break;
  13194         case bcmFieldActionYpSwitchToCpuCancel:
  13195             sal_memset(&a_offset, 0 , sizeof(a_offset));
  13196             action = bcmFieldActionYpCopyToCpuCancel;
  13197             ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset);
  13198             if (a_offset.value[0] == 0x2) {
  13199                 a_offset.value[0] = 0x6;
  13200             } else {
  13201                 a_offset.value[0] = 0x3;
  13202             }
  13203             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13204             break;
  13205         case bcmFieldActionRpSwitchToCpuCancel:
  13206             sal_memset(&a_offset, 0 , sizeof(a_offset));
  13207             action = bcmFieldActionRpCopyToCpuCancel;
  13208             ACTION_GET(unit, f_ent, entbuf, action, 0, &a_offset);
  13209             if (a_offset.value[0] == 0x2) {
  13210                 a_offset.value[0] = 0x6;
  13211             } else {
  13212                 a_offset.value[0] = 0x3;
  13213             }
  13214             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13215             break;
  13216         case bcmFieldActionRpPrioPktAndIntCopy:
  13217             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13218                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13219                                                     bcmFieldActionRpPrioIntCopy,
  13220                                                     f_ent, fa, entbuf);
  13221                 BCM_IF_ERROR_RETURN(rv);
  13222             }
  13223             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13224                                                     bcmFieldActionRpPrioPktCopy,
  13225                                                     f_ent, fa, entbuf);
  13226             BCM_IF_ERROR_RETURN(rv);
  13227             break;
  13228         case bcmFieldActionRpPrioPktAndIntNew:
  13229             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13230                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13231                                                     bcmFieldActionRpPrioIntNew,
  13232                                                     f_ent, fa, entbuf);
  13233                 BCM_IF_ERROR_RETURN(rv);
  13234             }
  13235             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13236                                                     bcmFieldActionRpPrioPktNew,
  13237                                                     f_ent, fa, entbuf);
  13238             BCM_IF_ERROR_RETURN(rv);
  13239             break;
  13240         case bcmFieldActionRpPrioPktAndIntTos:
  13241             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13242                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13243                                                     bcmFieldActionRpPrioIntTos,
  13244                                                     f_ent, fa, entbuf);
  13245                 BCM_IF_ERROR_RETURN(rv);
  13246             }
  13247             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13248                                                     bcmFieldActionRpPrioPktTos,
  13249                                                     f_ent, fa, entbuf);
  13250             BCM_IF_ERROR_RETURN(rv);
  13251             break;
  13252         case bcmFieldActionRpPrioPktAndIntCancel:
  13253             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13254                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13255                                                     bcmFieldActionRpPrioIntCancel,
  13256                                                     f_ent, fa, entbuf);
  13257                 BCM_IF_ERROR_RETURN(rv);
  13258             }
  13259             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13260                                                     bcmFieldActionRpPrioPktCancel,
  13261                                                     f_ent, fa, entbuf);
  13262             BCM_IF_ERROR_RETURN(rv);
  13263             break;
  13264         case bcmFieldActionGpPrioPktAndIntCopy:
  13265             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13266                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13267                                                     bcmFieldActionGpPrioIntCopy,
  13268                                                     f_ent, fa, entbuf);
  13269                 BCM_IF_ERROR_RETURN(rv);
  13270             }
  13271             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13272                                                     bcmFieldActionGpPrioPktCopy,
  13273                                                     f_ent, fa, entbuf);
  13274             BCM_IF_ERROR_RETURN(rv);
  13275             break;
  13276         case bcmFieldActionGpPrioPktAndIntNew:
  13277             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13278                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13279                                                     bcmFieldActionGpPrioIntNew,
  13280                                                     f_ent, fa, entbuf);
  13281                 BCM_IF_ERROR_RETURN(rv);
  13282             }
  13283             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13284                                                     bcmFieldActionGpPrioPktNew,
  13285                                                     f_ent, fa, entbuf);
  13286             BCM_IF_ERROR_RETURN(rv);
  13287             break;
  13288         case bcmFieldActionGpPrioPktAndIntTos:
  13289             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13290                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13291                                                     bcmFieldActionGpPrioIntTos,
  13292                                                     f_ent, fa, entbuf);
  13293                 BCM_IF_ERROR_RETURN(rv);
  13294             }
  13295             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13296                                                     bcmFieldActionGpPrioPktTos,
  13297                                                     f_ent, fa, entbuf);
  13298             BCM_IF_ERROR_RETURN(rv);
  13299             break;
  13300         case bcmFieldActionGpPrioPktAndIntCancel:
  13301             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13302                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13303                                                     bcmFieldActionGpPrioIntCancel,
  13304                                                     f_ent, fa, entbuf);
  13305                 BCM_IF_ERROR_RETURN(rv);
  13306             }
  13307             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13308                                                     bcmFieldActionGpPrioPktCancel,
  13309                                                     f_ent, fa, entbuf);
  13310             BCM_IF_ERROR_RETURN(rv);
  13311             break;
  13312         case bcmFieldActionYpPrioPktAndIntCopy:
  13313             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13314                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13315                                                     bcmFieldActionYpPrioIntCopy,
  13316                                                     f_ent, fa, entbuf);
  13317                 BCM_IF_ERROR_RETURN(rv);
  13318             }
  13319             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13320                                                     bcmFieldActionYpPrioPktCopy,
  13321                                                     f_ent, fa, entbuf);
  13322             BCM_IF_ERROR_RETURN(rv);
  13323             break;
  13324         case bcmFieldActionYpPrioPktAndIntNew:
  13325             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13326                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13327                                                     bcmFieldActionYpPrioIntNew,
  13328                                                     f_ent, fa, entbuf);
  13329                 BCM_IF_ERROR_RETURN(rv);
  13330             }
  13331             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13332                                                     bcmFieldActionYpPrioPktNew,
  13333                                                     f_ent, fa, entbuf);
  13334             BCM_IF_ERROR_RETURN(rv);
  13335             break;
  13336         case bcmFieldActionYpPrioPktAndIntTos:
  13337             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13338                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13339                                                     bcmFieldActionYpPrioIntTos,
  13340                                                     f_ent, fa, entbuf);
  13341                 BCM_IF_ERROR_RETURN(rv);
  13342             }
  13343             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13344                                                     bcmFieldActionYpPrioPktTos,
  13345                                                     f_ent, fa, entbuf);
  13346             BCM_IF_ERROR_RETURN(rv);
  13347             break;
  13348         case bcmFieldActionYpPrioPktAndIntCancel:
  13349             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13350                 rv = _bcm_field_th_profile1_cd_action_set(unit,
  13351                                                     bcmFieldActionYpPrioIntCancel,
  13352                                                     f_ent, fa, entbuf);
  13353                 BCM_IF_ERROR_RETURN(rv);
  13354             }
  13355             rv = _bcm_field_th_profile2_cd_action_set(unit,
  13356                                                     bcmFieldActionYpPrioPktCancel,
  13357                                                     f_ent, fa, entbuf);
  13358             BCM_IF_ERROR_RETURN(rv);
  13359             break;
  13360 
  13361         default:
  13362             LOG_VERBOSE(BSL_LS_BCM_FP,(BSL_META_U(unit,
  13363                         "%s is not found.\n"), action_name[action]));
  13364             return BCM_E_UNAVAIL;
  13365     }
  13366 
  13367     return BCM_E_NONE;
  13368 
  13369 }
  13370 
  13371 /*
  13372  * Function:
  13373  *     _bcm_field_th_misc_action_set
  13374  * Purpose:
  13375  *     Set the miscellaneous actions in entbuf which is to be
  13376  *     written into POLICY table.
  13377  * Parameters:
  13378  *     unit     - BCM device number
  13379  *     action   - Field Action of type bcmFieldActionXXX
  13380  *     f_ent    - entry structure to get policy info from
  13381  *     fa       - field action
  13382  *     entbuf   - (OUT) Field Policy table entry
  13383  * Returns:
  13384  *     BCM_E_NONE
  13385  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  13386  * Notes:
  13387  *     This is a simple read/modify/write pattern.
  13388  *     FP unit lock should be held by calling function.
  13389  */
  13390 int
  13391 _bcm_field_th_misc_action_set(int unit,
  13392                               _field_entry_t *f_ent,
  13393                               _field_action_t *fa, uint32 *entbuf)
  13394 {
  13395     int rv;
  13396     _field_stage_t *stage_fc;
  13397     _field_action_params_t params;
  13398     _bcm_field_action_offset_t a_offset;
  13399 
  13400 
  13401     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  13402         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  13403         return BCM_E_PARAM;
  13404     }
  13405 
  13406     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  13407     BCM_IF_ERROR_RETURN(rv);
  13408 
  13409     rv = _bcm_field_action_offset_get(unit, stage_fc, fa->action, &a_offset, 0);
  13410     BCM_IF_ERROR_RETURN(rv);
  13411 
  13412     sal_memset(&params, 0, sizeof(params));
  13413 
  13414     switch (fa->action) {
  13415         case bcmFieldActionHgTrunkRandomRoundRobinHashCancel:
  13416         case bcmFieldActionTrunkRandomRoundRobinHashCancel:
  13417         case bcmFieldActionEcmpRandomRoundRobinHashCancel:
  13418         case bcmFieldActionNatCancel:
  13419         case bcmFieldActionDoNotCheckUrpf:
  13420         case bcmFieldActionDoNotChangeTtl:
  13421         case bcmFieldActionMirrorOverride:
  13422         case bcmFieldActionIngSampleEnable:
  13423         case bcmFieldActionNat:
  13424         case bcmFieldActionPacketTraceEnable:
  13425         case bcmFieldActionDoNotCutThrough:
  13426         case bcmFieldActionEgressTimeStampInsert:
  13427         case bcmFieldActionIngressTimeStampInsert:
  13428         case bcmFieldActionIngressTimeStampInsertCancel:
  13429         case bcmFieldActionEgressTimeStampInsertCancel:
  13430         case bcmFieldActionDynamicTrunkEnable:
  13431         case bcmFieldActionDynamicTrunkCancel:
  13432         case bcmFieldActionDynamicHgTrunkEnable:
  13433         case bcmFieldActionDynamicHgTrunkCancel:
  13434 #if defined(INCLUDE_L3)
  13435         case bcmFieldActionDynamicEcmpEnable:
  13436         case bcmFieldActionDynamicEcmpCancel:
  13437         case bcmFieldActionRecoverableDropCancel:
  13438 #endif /* INCLUDE_L3 */
  13439             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13440             break;
  13441 #ifdef INCLUDE_L3
  13442         case bcmFieldActionNatEgressOverride:
  13443             ACTION_RESOLVE(unit, f_ent, fa, &params);
  13444             a_offset.value[0] = params.hw_idx;
  13445             a_offset.value[1] = params.hw_half;
  13446             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13447             break;
  13448 #endif
  13449         case bcmFieldActionCosQCpuNew:
  13450         case bcmFieldActionServicePoolIdNew:
  13451             a_offset.value[0] = fa->param[0];
  13452             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13453             break;
  13454         case bcmFieldActionServicePoolIdPrecedenceNew:
  13455             a_offset.value[0] = fa->param[0];
  13456             a_offset.value[1] = ((BCM_FIELD_COLOR_GREEN == fa->param[1]) ? 0 : \
  13457                                   ((BCM_FIELD_COLOR_YELLOW == fa->param[1]) ? 3 : 1));
  13458             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13459             break;
  13460         case bcmFieldActionMirrorIngress:
  13461         case bcmFieldActionMirrorEgress:
  13462             sal_memset(&a_offset, 0 , sizeof(a_offset));
  13463             ACTION_GET(unit, f_ent, entbuf, fa->action, 0, &a_offset);
  13464             ACTION_RESOLVE(unit, f_ent, fa, &params);
  13465             a_offset.value[0] |= (0x1 << params.mtp_type_index);
  13466             a_offset.value[1] |= (0x3 & params.mtp_index) << (2 * params.mtp_type_index);
  13467             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13468             if ((fa->flags & _BCM_FIELD_ACTION_CTC_MANIPULATE_FLAG) &&
  13469                 (fa->param[2] == 1)) {
  13470                 int matched_rule = fa->param[3];
  13471 
  13472                 sal_memset(&a_offset, 0 , sizeof(a_offset));
  13473                 ACTION_GET(unit, f_ent, entbuf, bcmFieldActionFabricQueue, 0, &a_offset);
  13474                 a_offset.value[0] = 0;
  13475                 a_offset.value[1] = matched_rule;
  13476                 a_offset.value[2] = 0x3;
  13477                 ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13478             }
  13479 
  13480             break;
  13481         case bcmFieldActionDrop:
  13482             rv = _bcm_field_th_misc_cd_action_set(unit,
  13483                                                   bcmFieldActionGpDrop,
  13484                                                   f_ent, fa, entbuf);
  13485             BCM_IF_ERROR_RETURN(rv);
  13486 
  13487             rv = _bcm_field_th_misc_cd_action_set(unit,
  13488                                                   bcmFieldActionYpDrop,
  13489                                                   f_ent, fa, entbuf);
  13490             BCM_IF_ERROR_RETURN(rv);
  13491 
  13492             rv = _bcm_field_th_misc_cd_action_set(unit,
  13493                                                   bcmFieldActionRpDrop,
  13494                                                   f_ent, fa, entbuf);
  13495             BCM_IF_ERROR_RETURN(rv);
  13496             break;
  13497         case bcmFieldActionDropCancel:
  13498             rv = _bcm_field_th_misc_cd_action_set(unit,
  13499                                                   bcmFieldActionGpDropCancel,
  13500                                                   f_ent, fa, entbuf);
  13501             BCM_IF_ERROR_RETURN(rv);
  13502 
  13503             rv = _bcm_field_th_misc_cd_action_set(unit,
  13504                                                   bcmFieldActionYpDropCancel,
  13505                                                   f_ent, fa, entbuf);
  13506             BCM_IF_ERROR_RETURN(rv);
  13507 
  13508             rv = _bcm_field_th_misc_cd_action_set(unit,
  13509                                                   bcmFieldActionRpDropCancel,
  13510                                                   f_ent, fa, entbuf);
  13511             BCM_IF_ERROR_RETURN(rv);
  13512             break;
  13513         case bcmFieldActionOamCopyToCpu:
  13514             rv = _bcm_field_th_misc_cd_action_set(unit,
  13515                                                   bcmFieldActionGpOamCopyToCpu,
  13516                                                   f_ent, fa, entbuf);
  13517             BCM_IF_ERROR_RETURN(rv);
  13518 
  13519             rv = _bcm_field_th_misc_cd_action_set(unit,
  13520                                                   bcmFieldActionYpOamCopyToCpu,
  13521                                                   f_ent, fa, entbuf);
  13522             BCM_IF_ERROR_RETURN(rv);
  13523 
  13524             rv = _bcm_field_th_misc_cd_action_set(unit,
  13525                                                   bcmFieldActionRpOamCopyToCpu,
  13526                                                   f_ent, fa, entbuf);
  13527             BCM_IF_ERROR_RETURN(rv);
  13528             break;
  13529         case bcmFieldActionCopyToCpu:
  13530             rv = _bcm_field_th_misc_cd_action_set(unit,
  13531                                                   bcmFieldActionGpCopyToCpu,
  13532                                                   f_ent, fa, entbuf);
  13533             BCM_IF_ERROR_RETURN(rv);
  13534 
  13535             rv = _bcm_field_th_misc_cd_action_set(unit,
  13536                                                   bcmFieldActionYpCopyToCpu,
  13537                                                   f_ent, fa, entbuf);
  13538             BCM_IF_ERROR_RETURN(rv);
  13539 
  13540             rv = _bcm_field_th_misc_cd_action_set(unit,
  13541                                                   bcmFieldActionRpCopyToCpu,
  13542                                                   f_ent, fa, entbuf);
  13543             BCM_IF_ERROR_RETURN(rv);
  13544             break;
  13545         case bcmFieldActionCopyToCpuCancel:
  13546             rv = _bcm_field_th_misc_cd_action_set(unit,
  13547                                                 bcmFieldActionGpCopyToCpuCancel,
  13548                                                 f_ent, fa, entbuf);
  13549             BCM_IF_ERROR_RETURN(rv);
  13550 
  13551             rv = _bcm_field_th_misc_cd_action_set(unit,
  13552                                                 bcmFieldActionYpCopyToCpuCancel,
  13553                                                 f_ent, fa, entbuf);
  13554             BCM_IF_ERROR_RETURN(rv);
  13555 
  13556             rv = _bcm_field_th_misc_cd_action_set(unit,
  13557                                                 bcmFieldActionRpCopyToCpuCancel,
  13558                                                 f_ent, fa, entbuf);
  13559             BCM_IF_ERROR_RETURN(rv);
  13560             break;
  13561         case bcmFieldActionSwitchToCpuCancel:
  13562             rv = _bcm_field_th_misc_cd_action_set(unit,
  13563                                               bcmFieldActionGpSwitchToCpuCancel,
  13564                                               f_ent, fa, entbuf);
  13565             BCM_IF_ERROR_RETURN(rv);
  13566 
  13567             rv = _bcm_field_th_misc_cd_action_set(unit,
  13568                                               bcmFieldActionYpSwitchToCpuCancel,
  13569                                               f_ent, fa, entbuf);
  13570             BCM_IF_ERROR_RETURN(rv);
  13571 
  13572             rv = _bcm_field_th_misc_cd_action_set(unit,
  13573                                               bcmFieldActionRpSwitchToCpuCancel,
  13574                                               f_ent, fa, entbuf);
  13575             BCM_IF_ERROR_RETURN(rv);
  13576             break;
  13577         case bcmFieldActionSwitchToCpuReinstate:
  13578             rv = _bcm_field_th_misc_cd_action_set(unit,
  13579                                            bcmFieldActionGpSwitchToCpuReinstate,
  13580                                            f_ent, fa, entbuf);
  13581             BCM_IF_ERROR_RETURN(rv);
  13582 
  13583             rv = _bcm_field_th_misc_cd_action_set(unit,
  13584                                            bcmFieldActionYpSwitchToCpuReinstate,
  13585                                            f_ent, fa, entbuf);
  13586             BCM_IF_ERROR_RETURN(rv);
  13587 
  13588             rv = _bcm_field_th_misc_cd_action_set(unit,
  13589                                            bcmFieldActionRpSwitchToCpuReinstate,
  13590                                            f_ent, fa, entbuf);
  13591             BCM_IF_ERROR_RETURN(rv);
  13592             break;
  13593         case bcmFieldActionTimeStampToCpu:
  13594             rv = _bcm_field_th_misc_cd_action_set(unit,
  13595                                               bcmFieldActionGpTimeStampToCpu,
  13596                                               f_ent, fa, entbuf);
  13597             BCM_IF_ERROR_RETURN(rv);
  13598 
  13599             rv = _bcm_field_th_misc_cd_action_set(unit,
  13600                                               bcmFieldActionYpTimeStampToCpu,
  13601                                               f_ent, fa, entbuf);
  13602             BCM_IF_ERROR_RETURN(rv);
  13603 
  13604             rv = _bcm_field_th_misc_cd_action_set(unit,
  13605                                               bcmFieldActionRpTimeStampToCpu,
  13606                                               f_ent, fa, entbuf);
  13607             BCM_IF_ERROR_RETURN(rv);
  13608             break;
  13609         case bcmFieldActionGpTimeStampToCpu:
  13610             rv = _bcm_field_th_misc_cd_action_set(unit,
  13611                                               bcmFieldActionGpTimeStampToCpu,
  13612                                               f_ent, fa, entbuf);
  13613             BCM_IF_ERROR_RETURN(rv);
  13614             break;
  13615         case bcmFieldActionYpTimeStampToCpu:
  13616             rv = _bcm_field_th_misc_cd_action_set(unit,
  13617                                               bcmFieldActionYpTimeStampToCpu,
  13618                                               f_ent, fa, entbuf);
  13619             BCM_IF_ERROR_RETURN(rv);
  13620             break;
  13621         case bcmFieldActionRpTimeStampToCpu:
  13622             rv = _bcm_field_th_misc_cd_action_set(unit,
  13623                                               bcmFieldActionRpTimeStampToCpu,
  13624                                               f_ent, fa, entbuf);
  13625             BCM_IF_ERROR_RETURN(rv);
  13626             break;
  13627         case bcmFieldActionTimeStampToCpuCancel:
  13628             rv = _bcm_field_th_misc_cd_action_set(unit,
  13629                                                 bcmFieldActionGpCopyToCpuCancel,
  13630                                                 f_ent, fa, entbuf);
  13631             BCM_IF_ERROR_RETURN(rv);
  13632 
  13633             rv = _bcm_field_th_misc_cd_action_set(unit,
  13634                                                 bcmFieldActionYpCopyToCpuCancel,
  13635                                                 f_ent, fa, entbuf);
  13636             BCM_IF_ERROR_RETURN(rv);
  13637 
  13638             rv = _bcm_field_th_misc_cd_action_set(unit,
  13639                                                 bcmFieldActionRpCopyToCpuCancel,
  13640                                                 f_ent, fa, entbuf);
  13641             BCM_IF_ERROR_RETURN(rv);
  13642             break;
  13643 	case bcmFieldActionGpTimeStampToCpuCancel:
  13644             rv = _bcm_field_th_misc_cd_action_set(unit,
  13645                                                 bcmFieldActionGpCopyToCpuCancel,
  13646                                                 f_ent, fa, entbuf);
  13647 	    BCM_IF_ERROR_RETURN(rv);
  13648             break;
  13649 	case bcmFieldActionYpTimeStampToCpuCancel:
  13650             rv = _bcm_field_th_misc_cd_action_set(unit,
  13651                                                 bcmFieldActionYpCopyToCpuCancel,
  13652                                                 f_ent, fa, entbuf);
  13653 	    BCM_IF_ERROR_RETURN(rv);
  13654             break;
  13655         case bcmFieldActionRpTimeStampToCpuCancel:
  13656             rv = _bcm_field_th_misc_cd_action_set(unit,
  13657                                                 bcmFieldActionRpCopyToCpuCancel,
  13658                                                 f_ent, fa, entbuf);
  13659             BCM_IF_ERROR_RETURN(rv);
  13660             break;
  13661         case bcmFieldActionPrioPktAndIntCopy:
  13662         case bcmFieldActionPrioPktAndIntNew:
  13663         case bcmFieldActionPrioPktAndIntTos:
  13664         case bcmFieldActionPrioPktAndIntCancel:
  13665             if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  13666                 rv = _bcm_field_th_profile1_action_set(unit,
  13667                                                f_ent, fa, entbuf);
  13668 
  13669                 BCM_IF_ERROR_RETURN(rv);
  13670             }
  13671             rv = _bcm_field_th_profile2_action_set(unit,
  13672                                                f_ent, fa, entbuf);
  13673             BCM_IF_ERROR_RETURN(rv);
  13674             break;
  13675 #ifdef	INCLUDE_L3
  13676         case bcmFieldActionDgm:
  13677             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13678             break;
  13679         case bcmFieldActionDgmThreshold:
  13680         case bcmFieldActionDgmBias:
  13681         case bcmFieldActionDgmCost:
  13682             a_offset.value[0] = fa->param[0];
  13683             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13684             break;
  13685 #endif /*INCLUDE_L3*/
  13686         case bcmFieldActionEcmpResilientHashEnable:
  13687         case bcmFieldActionEcmpResilientHashDisable:
  13688         case bcmFieldActionTrunkResilientHashEnable:
  13689         case bcmFieldActionTrunkResilientHashDisable:
  13690         case bcmFieldActionHiGigTrunkResilientHashEnable:
  13691         case bcmFieldActionHiGigTrunkResilientHashDisable:
  13692         case bcmFieldActionFibreChanZoneCheckActionCancel:
  13693         case bcmFieldActionIntEncapEnable:
  13694         case bcmFieldActionIntEncapDisable:
  13695         case bcmFieldActionElephantColorEnable:
  13696         case bcmFieldActionElephantColorDisable:
  13697         case bcmFieldActionElephantQueueEnable:
  13698         case bcmFieldActionElephantQueueDisable:
  13699         case bcmFieldActionElephantLookupEnable:
  13700         case bcmFieldActionElephantLookupDisable:
  13701         case bcmFieldActionNshEncapEnable:
  13702             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13703             break;
  13704         case bcmFieldActionAssignExtractionCtrlId:
  13705         case bcmFieldActionAssignEditCtrlId:
  13706             a_offset.value[0] = fa->param[0];
  13707             a_offset.value[1] = fa->param[1];
  13708             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13709             break;
  13710         case bcmFieldActionAssignOpaqueObject4:
  13711         case bcmFieldActionAssignOpaqueObject3:
  13712         case bcmFieldActionAssignOpaqueObject2:
  13713         case bcmFieldActionAssignOpaqueObject1:
  13714             a_offset.value[0] = fa->param[0];
  13715             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13716             break;
  13717 #if defined (BCM_TRIDENT3_SUPPORT)
  13718         case bcmFieldActionEgressFlowControlEnable:
  13719         case bcmFieldActionEgressFlowEncapEnable:
  13720         case bcmFieldActionLoopbackSubtype:
  13721         case bcmFieldActionLoopbackType:
  13722         case bcmFieldActionAssignChangeL2FieldsClassId:
  13723             BCM_IF_ERROR_RETURN(_field_td3_flex_action_set(unit, fa, &a_offset));
  13724             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13725             break;
  13726 #endif
  13727         case bcmFieldActionFibreChanVsanId:
  13728             a_offset.value[0] = fa->param[0];
  13729             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13730             break;
  13731         case bcmFieldActionFibreChanIntVsanPri:
  13732             a_offset.value[1] = fa->param[0];
  13733             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13734             break;
  13735         case bcmFieldActionMatchPbmpDrop:
  13736             a_offset.value[0] = fa->hw_index;
  13737             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13738             break;
  13739         case bcmFieldActionMatchPbmpRedirect:
  13740             a_offset.value[0] = fa->hw_index;
  13741             a_offset.value[1] = fa->param[0];
  13742             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13743             break;
  13744         case bcmFieldActionDlbEcmpMonitorEnable:
  13745         case bcmFieldActionMirrorZeroingEnable:
  13746             a_offset.value[0] = fa->param[0];
  13747             ACTION_SET(unit, f_ent, entbuf, &a_offset);
  13748             break;
  13749         default:
  13750             return _bcm_field_th_misc_cd_action_set(unit, fa->action,
  13751                                                     f_ent, fa, entbuf);
  13752     }
  13753 
  13754     return BCM_E_NONE;
  13755 }
  13756 
  13757 /*
  13758  * Function:
  13759  *     _bcm_field_th_action_set
  13760  * Purpose:
  13761  *     Set the actions in entbuf which is to be written into POLICY table.
  13762  * Parameters:
  13763  *     unit     - BCM device number
  13764  *     mem      - Policy table memory
  13765  *     f_ent    - entry structure to get policy info from
  13766  *     tcam_idx - index into TCAM
  13767  *     fa       - field action
  13768  *     buf      - (OUT) Field Policy table entry
  13769  * Returns:
  13770  *     BCM_E_NONE
  13771  *     BCM_E_PARAM - Action parameter out-of-range or unrecognized action.
  13772  * Notes:
  13773  *     This is a simple read/modify/write pattern.
  13774  *     FP unit lock should be held by calling function.
  13775  */
  13776 int
  13777 _bcm_field_th_action_set(int unit, soc_mem_t mem, _field_entry_t *f_ent,
  13778                           int tcam_idx, _field_action_t *fa, uint32 *entbuf)
  13779 {
  13780     int rv;
  13781 
  13782     if (NULL == f_ent || NULL == fa || NULL == entbuf) {
  13783         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  13784         return (BCM_E_PARAM);
  13785     }
  13786 
  13787     switch (fa->action) {
  13788         case bcmFieldActionCosQNew:
  13789         case bcmFieldActionGpCosQNew:
  13790         case bcmFieldActionYpCosQNew:
  13791         case bcmFieldActionRpCosQNew:
  13792         case bcmFieldActionCosMapNew:
  13793         case bcmFieldActionGpCosMapNew:
  13794         case bcmFieldActionYpCosMapNew:
  13795         case bcmFieldActionRpCosMapNew:
  13796         case bcmFieldActionUcastCosQNew:
  13797         case bcmFieldActionGpUcastCosQNew:
  13798         case bcmFieldActionYpUcastCosQNew:
  13799         case bcmFieldActionRpUcastCosQNew:
  13800         case bcmFieldActionMcastCosQNew:
  13801         case bcmFieldActionGpMcastCosQNew:
  13802         case bcmFieldActionYpMcastCosQNew:
  13803         case bcmFieldActionRpMcastCosQNew:
  13804         case bcmFieldActionPrioIntNew:
  13805         case bcmFieldActionGpPrioIntNew:
  13806         case bcmFieldActionYpPrioIntNew:
  13807         case bcmFieldActionRpPrioIntNew:
  13808         case bcmFieldActionDropPrecedence:
  13809         case bcmFieldActionGpDropPrecedence:
  13810         case bcmFieldActionYpDropPrecedence:
  13811         case bcmFieldActionRpDropPrecedence:
  13812         case bcmFieldActionPrioIntCopy:
  13813         case bcmFieldActionPrioIntTos:
  13814         case bcmFieldActionPrioIntCancel:
  13815         case bcmFieldActionGpPrioIntCopy:
  13816         case bcmFieldActionGpPrioIntTos:
  13817         case bcmFieldActionGpPrioIntCancel:
  13818         case bcmFieldActionYpPrioIntCopy:
  13819         case bcmFieldActionYpPrioIntTos:
  13820         case bcmFieldActionYpPrioIntCancel:
  13821         case bcmFieldActionRpPrioIntCopy:
  13822         case bcmFieldActionRpPrioIntTos:
  13823         case bcmFieldActionRpPrioIntCancel:
  13824         case bcmFieldActionGpIntCongestionNotificationNew:
  13825         case bcmFieldActionYpIntCongestionNotificationNew:
  13826         case bcmFieldActionRpIntCongestionNotificationNew:
  13827         case bcmFieldActionUntaggedPacketPriorityNew:
  13828             rv = _bcm_field_th_profile1_action_set(unit, f_ent, fa, entbuf);
  13829             BCM_IF_ERROR_RETURN(rv);
  13830             break;
  13831         case bcmFieldActionEcnNew:
  13832         case bcmFieldActionGpEcnNew:
  13833         case bcmFieldActionYpEcnNew:
  13834         case bcmFieldActionRpEcnNew:
  13835         case bcmFieldActionPrioPktNew:
  13836         case bcmFieldActionGpPrioPktNew:
  13837         case bcmFieldActionYpPrioPktNew:
  13838         case bcmFieldActionRpPrioPktNew:
  13839         case bcmFieldActionGpTosPrecedenceNew:
  13840         case bcmFieldActionDscpNew:
  13841         case bcmFieldActionGpDscpNew:
  13842         case bcmFieldActionYpDscpNew:
  13843         case bcmFieldActionRpDscpNew:
  13844         case bcmFieldActionPrioPktCopy:
  13845         case bcmFieldActionGpPrioPktCopy:
  13846         case bcmFieldActionYpPrioPktCopy:
  13847         case bcmFieldActionRpPrioPktCopy:
  13848         case bcmFieldActionPrioPktTos:
  13849         case bcmFieldActionGpPrioPktTos:
  13850         case bcmFieldActionYpPrioPktTos:
  13851         case bcmFieldActionRpPrioPktTos:
  13852         case bcmFieldActionPrioPktCancel:
  13853         case bcmFieldActionGpPrioPktCancel:
  13854         case bcmFieldActionYpPrioPktCancel:
  13855         case bcmFieldActionRpPrioPktCancel:
  13856         case bcmFieldActionDot1pPreserve:
  13857         case bcmFieldActionGpDot1pPreserve:
  13858         case bcmFieldActionYpDot1pPreserve:
  13859         case bcmFieldActionRpDot1pPreserve:
  13860         case bcmFieldActionDscpCancel:
  13861         case bcmFieldActionGpDscpCancel:
  13862         case bcmFieldActionYpDscpCancel:
  13863         case bcmFieldActionRpDscpCancel:
  13864         case bcmFieldActionGpTosPrecedenceCopy:
  13865         case bcmFieldActionDscpPreserve:
  13866         case bcmFieldActionGpDscpPreserve:
  13867         case bcmFieldActionYpDscpPreserve:
  13868         case bcmFieldActionRpDscpPreserve:
  13869             rv = _bcm_field_th_profile2_action_set(unit, f_ent, fa, entbuf);
  13870             BCM_IF_ERROR_RETURN(rv);
  13871             break;
  13872         case bcmFieldActionRedirect:
  13873         case bcmFieldActionRedirectTrunk:
  13874         case bcmFieldActionUnmodifiedPacketRedirectPort:
  13875         case bcmFieldActionRedirectMcast:
  13876         case bcmFieldActionRedirectEgrNextHop:
  13877         case bcmFieldActionRedirectCancel:
  13878         case bcmFieldActionRedirectPbmp:
  13879         case bcmFieldActionRedirectVlan:
  13880         case bcmFieldActionRedirectBcastPbmp:
  13881         case bcmFieldActionRedirectIpmc:
  13882         case bcmFieldActionEgressMask:
  13883         case bcmFieldActionEgressPortsAdd:
  13884         case bcmFieldActionFabricEHAddOrUpdate:
  13885             rv = _bcm_field_th_redirect_action_set(unit, f_ent, fa, entbuf);
  13886             BCM_IF_ERROR_RETURN(rv);
  13887             break;
  13888         case bcmFieldActionEgressClassSelect:
  13889         case bcmFieldActionHiGigClassSelect:
  13890         case bcmFieldActionNewClassId:
  13891         case bcmFieldActionMultipathHash:
  13892         case bcmFieldActionAddClassTag:
  13893         case bcmFieldActionFabricQueue:
  13894         case bcmFieldActionL3Switch:
  13895         case bcmFieldActionDstMacNew:
  13896         case bcmFieldActionSrcMacNew:
  13897         case bcmFieldActionOuterVlanNew:
  13898         case bcmFieldActionVnTagNew:
  13899         case bcmFieldActionVnTagDelete:
  13900         case bcmFieldActionEtagNew:
  13901         case bcmFieldActionEtagDelete:
  13902         case bcmFieldActionL3SwitchCancel:
  13903         case bcmFieldActionChangeL2Fields:
  13904         case bcmFieldActionChangeL2FieldsCancel:
  13905         case bcmFieldActionBFDSessionIdNew:
  13906             rv = _bcm_field_th_l3swl2change_action_set(unit, f_ent, fa, entbuf);
  13907             BCM_IF_ERROR_RETURN(rv);
  13908             break;
  13909         default:
  13910             rv = _bcm_field_th_misc_action_set(unit, f_ent, fa, entbuf);
  13911             BCM_IF_ERROR_RETURN(rv);
  13912     }
  13913 
  13914     fa->flags &= ~_FP_ACTION_DIRTY; /* Mark action as installed. */
  13915 
  13916     return (BCM_E_NONE);
  13917 }
  13918 
  13919 /*
  13920  * Function:
  13921  *    _field_th_stage_quals_ibus_map_init
  13922  * Purpose:
  13923  *    Initialize Field Ingress Stage Qualifiers to their extractors mapping.
  13924  * Parameters:
  13925  *    unit       - (IN) BCM device number.
  13926  *    stage_fc   - (IN/OUT) Field Processor stage control structure.
  13927  *
  13928  * Returns:
  13929  *    BCM_E_PARAM - Null field stage control structure.
  13930  *    BCM_E_MEMORY - Allocation failure.
  13931  *    BCM_E_INTERNAL - Invalid CAP Stage ID.
  13932  *    BCM_E_NONE - Success.
  13933  */
  13934 STATIC int
  13935 _field_th_stage_quals_ibus_map_init(int unit, _field_stage_t *stage_fc)
  13936 {
  13937     bcmi_keygen_qual_flags_bmp_t qual_flags;
  13938     bcmi_keygen_qual_cfg_info_db_t *db = NULL;
  13939     BCMI_KEYGEN_QUAL_CFG_DECL;
  13940 
  13941     BCMI_KEYGEN_FUNC_ENTER(unit);
  13942 
  13943     /* L0 BUS extractor sections offset:
  13944      *    - 32bit extractor = 0
  13945      *    - 16bit extractor = 608
  13946      *    - 8bit extractor  = 1120
  13947      *    - 4bit extractor  = 1280
  13948      *    - 2bit extractor  = 1400
  13949      */
  13950 
  13951     /* Input parameters check. */
  13952     if (NULL == stage_fc) {
  13953         return (BCM_E_PARAM);
  13954     }
  13955 
  13956     _FP_XGS3_ALLOC(stage_fc->qual_cfg_info_db,
  13957          sizeof(bcmi_keygen_qual_cfg_info_db_t),
  13958          "IFP qualifiers");
  13959     if (NULL == stage_fc->qual_cfg_info_db) {
  13960         return (BCM_E_MEMORY);
  13961     }
  13962     db = stage_fc->qual_cfg_info_db;
  13963     sal_memset(&qual_flags, 0, sizeof(bcmi_keygen_qual_flags_bmp_t));
  13964 
  13965     /* UDF Qualifiers. */
  13966     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13967     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 8, 256, 32);
  13968     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData4, qual_flags);
  13969 
  13970     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13971     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 9, 288, 32);
  13972     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData3, qual_flags);
  13973 
  13974     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13975     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 10, 320, 32);
  13976     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData2, qual_flags);
  13977 
  13978     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13979     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 8, 128, 16);
  13980     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData1, qual_flags);
  13981 
  13982     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13983     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 9, 144, 16);
  13984     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData0, qual_flags);
  13985 
  13986     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13987     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 5, 160, 32);
  13988     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData9, qual_flags);
  13989 
  13990     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13991     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 6, 192, 32);
  13992     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData8, qual_flags);
  13993 
  13994     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13995     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 7, 224, 32);
  13996     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData7, qual_flags);
  13997 
  13998     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  13999     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 6, 96, 16);
  14000     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData6, qual_flags);
  14001 
  14002     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14003     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 7, 112, 16);
  14004     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyData5, qual_flags);
  14005 
  14006     /* Packet Fields */
  14007     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14008     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 25, 400, 16);
  14009     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlan, qual_flags);
  14010 
  14011     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14012     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 25, 400, 12);
  14013     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlanId, qual_flags);
  14014 
  14015     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14016     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 4, 32, 8);
  14017     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 5, 20, 4);
  14018     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlanId, qual_flags);
  14019 
  14020     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14021     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 25, 412, 1);
  14022     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlanCfi, qual_flags);
  14023 
  14024     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14025     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 25, 413, 3);
  14026     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterVlanPri, qual_flags);
  14027 
  14028     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14029     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 26, 416, 16);
  14030     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlan, qual_flags);
  14031 
  14032     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14033     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 26, 416, 12);
  14034     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlanId, qual_flags);
  14035 
  14036     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14037     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 3, 24, 8);
  14038     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 4, 16, 4);
  14039     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlanId, qual_flags);
  14040 
  14041     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14042     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 26, 428, 1);
  14043     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlanCfi, qual_flags);
  14044 
  14045     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14046     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 26, 429, 3);
  14047     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerVlanPri, qual_flags);
  14048 
  14049     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14050     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 2, 64, 32);
  14051     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 30, 480, 16);
  14052     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMac, qual_flags);
  14053 
  14054     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14055     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 3, 96, 32);
  14056     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 31, 496, 16);
  14057     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstMac, qual_flags);
  14058 
  14059     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14060     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 32);
  14061     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp, qual_flags);
  14062 
  14063     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14064     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 32);
  14065     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp, qual_flags);
  14066 
  14067     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14068     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 32);
  14069     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 384, 32);
  14070     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E32, 13, 416, 32);
  14071     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(3, BCMI_KEYGEN_EXT_SECTION_L1E32, 14, 448, 32);
  14072     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6, qual_flags);
  14073 
  14074     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14075     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 32);
  14076     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 384, 32);
  14077     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6Low, qual_flags);
  14078 
  14079     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14080     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 13, 416, 32);
  14081     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 14, 448, 32);
  14082     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6High, qual_flags);
  14083 
  14084     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14085     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 32);
  14086     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 16, 512, 32);
  14087     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E32, 17, 544, 32);
  14088     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(3, BCMI_KEYGEN_EXT_SECTION_L1E32, 18, 576, 32);
  14089     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6, qual_flags);
  14090 
  14091     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14092     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 32);
  14093     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 16, 512, 32);
  14094     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6Low, qual_flags);
  14095 
  14096     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14097     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 17, 544, 32);
  14098     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 18, 576, 32);
  14099     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6High, qual_flags);
  14100 
  14101     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14102     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 29, 464, 16);
  14103     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyEtherType, qual_flags);
  14104 
  14105     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14106     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 28, 448, 16);
  14107     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4SrcPort, qual_flags);
  14108 
  14109     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14110     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 28, 448, 16);
  14111     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  14112                                     bcmFieldQualifyIcmpTypeCode, qual_flags);
  14113 
  14114     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14115     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 27, 432, 16);
  14116     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4DstPort, qual_flags);
  14117 
  14118     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14119     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 4, 128, 32);
  14120     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyISid, qual_flags);
  14121 
  14122     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14123     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 4, 128, 24);
  14124     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2GreVsid, qual_flags);
  14125 
  14126     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14127     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 24);
  14128     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 7);
  14129     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags);
  14130 
  14131     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14132     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 24);
  14133     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 7);
  14134     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags);
  14135 
  14136     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14137     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 4, 128, 24);
  14138     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags);
  14139 
  14140     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14141     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14142     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 8);
  14143     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 7);
  14144     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags);
  14145 
  14146     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14147     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14148     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 8);
  14149     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 7);
  14150     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanNetworkId, qual_flags);
  14151 
  14152     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14153     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 24, 8);
  14154     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 7);
  14155     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags);
  14156 
  14157     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14158     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 56, 8);
  14159     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 7);
  14160     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags);
  14161 
  14162     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14163     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 4, 152, 8);
  14164     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags);
  14165 
  14166     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14167     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 56, 8);
  14168     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 7);
  14169     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags);
  14170 
  14171     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14172     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 88, 8);
  14173     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 7);
  14174     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanFlags, qual_flags);
  14175 
  14176     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14177     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 24);
  14178     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 8);
  14179     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits8_31, qual_flags);
  14180 
  14181     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14182     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 24);
  14183     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 8);
  14184     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits8_31, qual_flags);
  14185 
  14186     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14187     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14188     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 8);
  14189     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 8);
  14190     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits8_31, qual_flags);
  14191 
  14192     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14193     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14194     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 8);
  14195     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 8);
  14196     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits8_31, qual_flags);
  14197 
  14198     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14199     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 24, 8);
  14200     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 8);
  14201     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits56_63, qual_flags);
  14202 
  14203     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14204     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 56, 8);
  14205     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 8);
  14206     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits56_63, qual_flags);
  14207 
  14208     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14209     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 56, 8);
  14210     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 8);
  14211     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits56_63, qual_flags);
  14212 
  14213     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14214     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 88, 8);
  14215     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 8);
  14216     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVxlanHeaderBits56_63, qual_flags);
  14217 
  14218     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14219     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32);
  14220     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 0);
  14221     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyETag, qual_flags);
  14222 
  14223     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14224     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32);
  14225     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 0);
  14226     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyETag, qual_flags);
  14227 
  14228     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14229     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14230     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14231     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 0);
  14232     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyETag, qual_flags);
  14233 
  14234     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14235     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14236     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14237     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 0);
  14238     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyETag, qual_flags);
  14239 
  14240     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14241     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32);
  14242     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 0);
  14243     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVnTag, qual_flags);
  14244 
  14245     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14246     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32);
  14247     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 0);
  14248     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVnTag, qual_flags);
  14249 
  14250     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14251     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14252     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14253     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 0);
  14254     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVnTag, qual_flags);
  14255 
  14256     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14257     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14258     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14259     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 0);
  14260     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVnTag, qual_flags);
  14261 
  14262     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14263     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32);
  14264     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 1);
  14265     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCnTag, qual_flags);
  14266 
  14267     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14268     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32);
  14269     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 1);
  14270     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCnTag, qual_flags);
  14271 
  14272     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14273     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14274     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14275     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 1);
  14276     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCnTag, qual_flags);
  14277 
  14278     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14279     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14280     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14281     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 1);
  14282     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCnTag, qual_flags);
  14283 
  14284     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14285     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32);
  14286     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 2);
  14287     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFabricQueueTag, qual_flags);
  14288 
  14289     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14290     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32);
  14291     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 2);
  14292     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFabricQueueTag, qual_flags);
  14293 
  14294     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14295     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14296     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14297     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 2);
  14298     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFabricQueueTag, qual_flags);
  14299 
  14300     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14301     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14302     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14303     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 2);
  14304     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFabricQueueTag, qual_flags);
  14305 
  14306     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14307     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32);
  14308     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14309     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabel, qual_flags);
  14310 
  14311     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14312     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32);
  14313     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14314     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabel, qual_flags);
  14315 
  14316     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14317     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14318     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14319     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14320     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabel, qual_flags);
  14321 
  14322     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14323     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14324     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14325     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14326     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabel, qual_flags);
  14327 
  14328     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14329     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 12, 20);
  14330     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14331     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelId, qual_flags);
  14332 
  14333     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14334     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 44, 20);
  14335     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14336     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelId, qual_flags);
  14337 
  14338     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14339     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 44, 4);
  14340     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14341     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14342     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelId, qual_flags);
  14343 
  14344     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14345     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 76, 4);
  14346     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14347     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14348     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelId, qual_flags);
  14349 
  14350     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14351     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 8);
  14352     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14353     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelTtl, qual_flags);
  14354 
  14355     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14356     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 8);
  14357     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14358     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelTtl, qual_flags);
  14359 
  14360     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14361     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 8);
  14362     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14363     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelTtl, qual_flags);
  14364 
  14365     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14366     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 8);
  14367     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14368     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelTtl, qual_flags);
  14369 
  14370     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14371     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 9, 3);
  14372     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14373     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelExp, qual_flags);
  14374 
  14375     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14376     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 41, 3);
  14377     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14378     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelExp, qual_flags);
  14379 
  14380     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14381     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 41, 3);
  14382     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14383     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelExp, qual_flags);
  14384 
  14385     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14386     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 73, 3);
  14387     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14388     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelExp, qual_flags);
  14389 
  14390     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14391     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 8, 1);
  14392     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14393     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelBos, qual_flags);
  14394 
  14395     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14396     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 40, 1);
  14397     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14398     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelBos, qual_flags);
  14399 
  14400     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14401     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 40, 1);
  14402     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 3);
  14403     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelBos, qual_flags);
  14404 
  14405     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14406     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 72, 1);
  14407     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 3);
  14408     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelBos, qual_flags);
  14409 
  14410     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14411     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32);
  14412     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 4);
  14413     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsControlWord, qual_flags);
  14414 
  14415     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14416     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32);
  14417     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 4);
  14418     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsControlWord, qual_flags);
  14419 
  14420     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14421     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14422     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14423     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 4);
  14424     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsControlWord, qual_flags);
  14425 
  14426     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14427     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14428     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14429     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 4);
  14430     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsControlWord, qual_flags);
  14431 
  14432     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14433     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 20);
  14434     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 9);
  14435     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIp6FlowLabel, qual_flags);
  14436 
  14437     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14438     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 20);
  14439     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 9);
  14440     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIp6FlowLabel, qual_flags);
  14441 
  14442     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14443     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14444     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 4);
  14445     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 9);
  14446     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIp6FlowLabel, qual_flags);
  14447 
  14448     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14449     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14450     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 4);
  14451     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 9);
  14452     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIp6FlowLabel, qual_flags);
  14453 
  14454     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14455     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 13, 104, 8);
  14456     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN, 2);
  14457     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTtl, qual_flags);
  14458 
  14459     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14460     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 12, 96, 8);
  14461     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN, 2);
  14462     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTos, qual_flags);
  14463 
  14464     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14465     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 14, 112, 8);
  14466     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpProtocol, qual_flags);
  14467 
  14468     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14469     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 2, 8, 4);
  14470     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 3, 12, 4);
  14471     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN, 2);
  14472     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTcpControl, qual_flags);
  14473 
  14474     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14475     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 27, 432, 16);
  14476     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeRxID, qual_flags);
  14477 
  14478     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14479     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 28, 448, 16);
  14480     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeOxID, qual_flags);
  14481 
  14482     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14483     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 16, 256, 5);
  14484     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyExactMatchGroupClassIdLookup0, qual_flags);
  14485 
  14486     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14487     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 16, 264, 5);
  14488     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyExactMatchGroupClassIdLookup1, qual_flags);
  14489 
  14490     /* The extractors are fixed for ltid and
  14491      * ltid init is done along with pmux init
  14492      */
  14493 
  14494     if (soc_feature(unit, soc_feature_fp_ltid_match_all_parts) &&
  14495         (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS)) {
  14496         BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14497         BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 5, 40, 5);
  14498         BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_LTID, 1);
  14499         BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyPreLogicalTableId1, qual_flags);
  14500 
  14501         BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14502         BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 5, 40, 5);
  14503         BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_LTID, 2);
  14504         BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, _bcmFieldQualifyPreLogicalTableId2, qual_flags);
  14505     }
  14506     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14507     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 16, 128, 8);
  14508     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyExtensionHeaderType, qual_flags);
  14509 
  14510     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14511     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 15, 120, 8);
  14512     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyExtensionHeader2Type, qual_flags);
  14513 
  14514     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14515     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 17, 136, 8);
  14516     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyExtensionHeaderSubCode, qual_flags);
  14517 
  14518     SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  14519     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14520     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 28, 112, 4);
  14521     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMHOpcode, qual_flags);
  14522     SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  14523 
  14524     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14525     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 18, 36, 2);
  14526     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFlags, qual_flags);
  14527 
  14528     /*Packet Types*/
  14529     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14530     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 20, 41, 1);
  14531     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyHiGig, qual_flags);
  14532 
  14533     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14534     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 7, 15, 1);
  14535     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyHiGigProxy, qual_flags);
  14536 
  14537     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14538     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 7, 14, 1);
  14539     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyCpuVisibilityPacket, qual_flags);
  14540 
  14541     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14542     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 13, 54, 1);
  14543     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDosAttack, qual_flags);
  14544 
  14545     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14546     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 1, 1);
  14547     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0);
  14548     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4Ports, qual_flags);
  14549 
  14550     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14551     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 17, 1);
  14552     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0);
  14553     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4Ports, qual_flags);
  14554 
  14555     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14556     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 8, 17, 1);
  14557     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4Ports, qual_flags);
  14558 
  14559     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14560     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 20, 40, 1);
  14561     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMirrorCopy, qual_flags);
  14562 
  14563     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14564     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 19, 38, 2);
  14565     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFrag, qual_flags);
  14566 
  14567     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14568     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 0, 0, 2);
  14569     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyNatSrcRealmId, qual_flags);
  14570 
  14571     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14572     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 8, 16, 1);
  14573     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFragNonOrFirst, qual_flags);
  14574 
  14575     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14576     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 1);
  14577     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0);
  14578     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFragNonOrFirst, qual_flags);
  14579 
  14580     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14581     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 1);
  14582     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0);
  14583     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpFragNonOrFirst, qual_flags);
  14584 
  14585     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14586     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 5, 10, 1);
  14587     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIcmpError, qual_flags);
  14588 
  14589     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14590     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 5, 11, 1);
  14591     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRepCopy, qual_flags);
  14592 
  14593     /*Table HIT/Lookup Status bits*/
  14594     SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  14595     /* not supported for EM */
  14596     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14597     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 11, 46, 1);
  14598     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2SrcHit, qual_flags);
  14599 
  14600     /* not supported for EM */
  14601     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14602     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 48, 1);
  14603     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2DestHit, qual_flags);
  14604 
  14605     /* not supported for EM */
  14606     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14607     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 50, 1);
  14608     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3SrcHostHit, qual_flags);
  14609 
  14610     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14611     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 50, 1);
  14612     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpmcStarGroupHit, qual_flags);
  14613 
  14614     /* not supported for EM */
  14615     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14616     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 51, 1);
  14617     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3DestHostHit, qual_flags);
  14618 
  14619     /* not supported for EM */
  14620     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14621     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 13, 52, 1);
  14622     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3DestRouteHit, qual_flags);
  14623 
  14624     /* not supported for EM */
  14625     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14626     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 13, 53, 1);
  14627     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2StationMove, qual_flags);
  14628 
  14629     /* not supported for EM */
  14630     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14631     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 12, 49, 1);
  14632     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2CacheHit, qual_flags);
  14633 
  14634     /* not supported for EM */
  14635     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14636     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 11, 47, 1);
  14637     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2SrcStatic, qual_flags);
  14638 
  14639     SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  14640 
  14641     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14642     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 13, 55, 1);
  14643     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpTunnelHit, qual_flags);
  14644 
  14645     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14646     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 10, 40, 3);
  14647     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVlanTranslationHit, qual_flags);
  14648 
  14649     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14650     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1);
  14651     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsLabel1Hit, qual_flags);
  14652 
  14653     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14654     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1);
  14655     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTrillEgressRbridgeHit, qual_flags);
  14656 
  14657     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14658     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1);
  14659     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2GreSrcIpHit, qual_flags);
  14660 
  14661     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14662     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1);
  14663     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMimSrcGportHit, qual_flags);
  14664 
  14665     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14666     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 57, 1);
  14667     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsLabel2Hit, qual_flags);
  14668 
  14669     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14670     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 57, 1);
  14671     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTrillIngressRbridgeHit, qual_flags);
  14672 
  14673     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14674     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1);
  14675     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2GreVfiHit, qual_flags);
  14676 
  14677     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14678     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 56, 1);
  14679     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMimVfiHit, qual_flags);
  14680 
  14681     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14682     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 9, 18, 2);
  14683     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIntCongestionNotification, qual_flags);
  14684 
  14685     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14686     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 17, 35, 1);
  14687     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMyStationHit, qual_flags);
  14688 
  14689     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14690     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 14, 58, 1);
  14691     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsTerminated, qual_flags);
  14692 
  14693     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14694     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 16, 33, 1);
  14695     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpLocal, qual_flags);
  14696 
  14697     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14698     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 17, 34, 1);
  14699     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3Routable, qual_flags);
  14700 
  14701     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14702     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16);
  14703     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 3);
  14704     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags);
  14705 
  14706     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14707     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16);
  14708     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 3);
  14709     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags);
  14710 
  14711     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14712     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14713     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 5);
  14714     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags);
  14715 
  14716     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14717     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14718     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 5);
  14719     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags);
  14720 
  14721     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14722     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 16, 16);
  14723     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 5);
  14724     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags);
  14725 
  14726     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14727     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 48, 16);
  14728     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 5);
  14729     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashUpper, qual_flags);
  14730 
  14731     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14732     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16);
  14733     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 5);
  14734     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags);
  14735 
  14736     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14737     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16);
  14738     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 5);
  14739     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags);
  14740 
  14741     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14742     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  14743     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 6);
  14744     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags);
  14745 
  14746     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14747     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  14748     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 6);
  14749     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags);
  14750 
  14751     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14752     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 16, 16);
  14753     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 6);
  14754     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags);
  14755 
  14756     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14757     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 48, 16);
  14758     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 6);
  14759     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashUpper, qual_flags);
  14760 
  14761     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14762     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16);
  14763     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 4);
  14764     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags);
  14765 
  14766     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14767     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16);
  14768     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 4);
  14769     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags);
  14770 
  14771     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14772     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14773     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 5);
  14774     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags);
  14775 
  14776     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14777     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14778     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 5);
  14779     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags);
  14780 
  14781     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14782     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 16);
  14783     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 5);
  14784     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags);
  14785 
  14786     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14787     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 16);
  14788     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 5);
  14789     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7AHashLower, qual_flags);
  14790 
  14791     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14792     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16);
  14793     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 6);
  14794     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags);
  14795 
  14796     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14797     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16);
  14798     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 6);
  14799     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags);
  14800 
  14801     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14802     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  14803     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 6);
  14804     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags);
  14805 
  14806     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14807     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  14808     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 6);
  14809     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags);
  14810 
  14811     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14812     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 16);
  14813     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 6);
  14814     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags);
  14815 
  14816     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14817     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 16);
  14818     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 6);
  14819     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRtag7BHashLower, qual_flags);
  14820 
  14821     /*Class Ids from different Tables*/
  14822 
  14823     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14824     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 12);
  14825     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 0);
  14826     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags);
  14827 
  14828     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14829     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 12);
  14830     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 0);
  14831     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags);
  14832 
  14833     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14834     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8);
  14835     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 0);
  14836     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags);
  14837 
  14838     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14839     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8);
  14840     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 0);
  14841     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags);
  14842 
  14843     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14844     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4);
  14845     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 0);
  14846     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags);
  14847 
  14848     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14849     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4);
  14850     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 0);
  14851     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassPort, qual_flags);
  14852 
  14853     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14854     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 12);
  14855     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 1);
  14856     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags);
  14857 
  14858     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14859     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 12);
  14860     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 1);
  14861     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags);
  14862 
  14863     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14864     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8);
  14865     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 1);
  14866     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags);
  14867 
  14868     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14869     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8);
  14870     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 1);
  14871     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags);
  14872 
  14873     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14874     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4);
  14875     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 1);
  14876     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags);
  14877 
  14878     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14879     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4);
  14880     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 1);
  14881     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL3, qual_flags);
  14882 
  14883     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14884     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 12);
  14885     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 2);
  14886     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags);
  14887 
  14888     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14889     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 12);
  14890     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 2);
  14891     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags);
  14892 
  14893     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14894     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8);
  14895     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 2);
  14896     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags);
  14897 
  14898     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14899     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8);
  14900     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 2);
  14901     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags);
  14902 
  14903     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14904     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4);
  14905     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 2);
  14906     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags);
  14907 
  14908     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14909     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4);
  14910     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 2);
  14911     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassVPort, qual_flags);
  14912 
  14913     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14914     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 12);
  14915     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 3);
  14916     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags);
  14917 
  14918     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14919     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 12);
  14920     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 3);
  14921     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags);
  14922 
  14923     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14924     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8);
  14925     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 3);
  14926     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags);
  14927 
  14928     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14929     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8);
  14930     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 3);
  14931     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags);
  14932 
  14933     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14934     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4);
  14935     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 3);
  14936     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags);
  14937 
  14938     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14939     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4);
  14940     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 3);
  14941     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceClassL2, qual_flags);
  14942 
  14943     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14944     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 10);
  14945     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 4);
  14946     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14947 
  14948     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14949     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 10);
  14950     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 4);
  14951     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14952 
  14953     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14954     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 8);
  14955     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 4);
  14956     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14957 
  14958     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14959     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 8);
  14960     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 4);
  14961     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14962 
  14963     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14964     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8);
  14965     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 4);
  14966     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14967 
  14968     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14969     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8);
  14970     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 4);
  14971     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14972 
  14973     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14974     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8);
  14975     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 4);
  14976     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14977 
  14978     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14979     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8);
  14980     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 4);
  14981     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14982 
  14983     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14984     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4);
  14985     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 4);
  14986     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14987 
  14988     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14989     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4);
  14990     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 4);
  14991     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14992 
  14993     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14994     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4);
  14995     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 4);
  14996     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  14997 
  14998     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  14999     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4);
  15000     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 4);
  15001     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassField, qual_flags);
  15002 
  15003     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15004     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 10);
  15005     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 5);
  15006     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags);
  15007 
  15008     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15009     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 10);
  15010     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 5);
  15011     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags);
  15012 
  15013     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15014     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 216, 8);
  15015     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 4);
  15016     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags);
  15017 
  15018     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15019     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 200, 8);
  15020     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 4);
  15021     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags);
  15022 
  15023     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15024     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8);
  15025     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 5);
  15026     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags);
  15027 
  15028     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15029     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8);
  15030     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 5);
  15031     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags);
  15032 
  15033     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15034     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4);
  15035     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 5);
  15036     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags);
  15037 
  15038     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15039     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4);
  15040     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 5);
  15041     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassField, qual_flags);
  15042 
  15043     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15044     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 248, 8);
  15045     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 6);
  15046     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceLookupClassPort, qual_flags);
  15047 
  15048     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15049     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 232, 8);
  15050     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 6);
  15051     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceLookupClassPort, qual_flags);
  15052 
  15053     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15054     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 8);
  15055     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 6);
  15056     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags);
  15057 
  15058     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15059     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 8);
  15060     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 6);
  15061     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags);
  15062 
  15063     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15064     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8);
  15065     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 6);
  15066     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags);
  15067 
  15068     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15069     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8);
  15070     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 6);
  15071     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags);
  15072 
  15073     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15074     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4);
  15075     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 6);
  15076     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags);
  15077 
  15078     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15079     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4);
  15080     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 6);
  15081     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInterfaceIngressKeySelectClassPort, qual_flags);
  15082 
  15083     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15084     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 15, 240, 8);
  15085     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 7);
  15086     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags);
  15087 
  15088     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15089     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 14, 224, 8);
  15090     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 7);
  15091     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags);
  15092 
  15093     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15094     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 9, 72, 8);
  15095     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 7);
  15096     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags);
  15097 
  15098     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15099     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 8, 64, 8);
  15100     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 7);
  15101     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags);
  15102 
  15103     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15104     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 9, 36, 4);
  15105     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A, 7);
  15106     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags);
  15107 
  15108     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15109     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 8, 32, 4);
  15110     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B, 7);
  15111     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyUdfClass, qual_flags);
  15112 
  15113     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15114     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 10);
  15115     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 0);
  15116     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags);
  15117 
  15118     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15119     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 10);
  15120     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 0);
  15121     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags);
  15122 
  15123     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15124     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 216, 8);
  15125     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 5);
  15126     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags);
  15127 
  15128     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15129     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 200, 8);
  15130     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 5);
  15131     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags);
  15132 
  15133     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15134     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8);
  15135     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 0);
  15136     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags);
  15137 
  15138     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15139     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8);
  15140     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 0);
  15141     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags);
  15142 
  15143     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15144     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4);
  15145     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 0);
  15146     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags);
  15147 
  15148     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15149     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4);
  15150     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 0);
  15151     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL2, qual_flags);
  15152 
  15153     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15154     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 10);
  15155     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 1);
  15156     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15157 
  15158     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15159     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 10);
  15160     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 1);
  15161     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15162 
  15163     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15164     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 8);
  15165     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 5);
  15166     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15167 
  15168     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15169     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 8);
  15170     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 5);
  15171     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15172 
  15173     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15174     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8);
  15175     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 1);
  15176     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15177 
  15178     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15179     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8);
  15180     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 5);
  15181     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15182 
  15183     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15184     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8);
  15185     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 1);
  15186     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15187 
  15188     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15189     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8);
  15190     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 5);
  15191     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15192 
  15193     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15194     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4);
  15195     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 1);
  15196     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15197 
  15198     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15199     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4);
  15200     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 5);
  15201     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15202 
  15203     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15204     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4);
  15205     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 1);
  15206     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15207 
  15208     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15209     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4);
  15210     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 5);
  15211     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL2, qual_flags);
  15212 
  15213     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15214     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 12);
  15215     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 2);
  15216     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags);
  15217 
  15218     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15219     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 12);
  15220     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 2);
  15221     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags);
  15222 
  15223     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15224     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 216, 8);
  15225     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 6);
  15226     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags);
  15227 
  15228     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15229     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 200, 8);
  15230     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 6);
  15231     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags);
  15232 
  15233     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15234     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8);
  15235     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 2);
  15236     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags);
  15237 
  15238     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15239     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8);
  15240     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 2);
  15241     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags);
  15242 
  15243     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15244     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4);
  15245     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 2);
  15246     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags);
  15247 
  15248     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15249     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4);
  15250     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 2);
  15251     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcClassL3, qual_flags);
  15252 
  15253     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15254     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 10);
  15255     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 3);
  15256     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15257 
  15258     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15259     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 10);
  15260     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 3);
  15261     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15262 
  15263     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15264     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 13, 208, 8);
  15265     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 6);
  15266     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15267 
  15268     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15269     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 12, 192, 8);
  15270     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 6);
  15271     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15272 
  15273     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15274     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8);
  15275     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 3);
  15276     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15277 
  15278     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15279     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 7, 56, 8);
  15280     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 6);
  15281     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15282 
  15283     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15284     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8);
  15285     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 3);
  15286     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15287 
  15288     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15289     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 6, 48, 8);
  15290     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 6);
  15291     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15292 
  15293     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15294     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4);
  15295     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 3);
  15296     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15297 
  15298     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15299     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 7, 28, 4);
  15300     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C, 6);
  15301     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15302 
  15303     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15304     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4);
  15305     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 3);
  15306     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15307 
  15308     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15309     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 6, 24, 4);
  15310     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D, 6);
  15311     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstClassL3, qual_flags);
  15312 
  15313     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15314     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 5, 46, 2);
  15315     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyGroupClass, qual_flags);
  15316 
  15317     /* Ingress/Egress Objects */
  15318     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15319     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 10, 43, 1);
  15320     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyForwardingVlanValid, qual_flags);
  15321 
  15322     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15323     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 11, 44, 2);
  15324     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIngressStpState, qual_flags);
  15325 
  15326     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15327     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 11, 44, 2);
  15328     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyStpState, qual_flags);
  15329 
  15330     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15331     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 17, 272, 12);
  15332     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyForwardingVlanId, qual_flags);
  15333 
  15334     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15335     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 10, 20, 1);
  15336     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVirtualPortValid, qual_flags);
  15337 
  15338     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15339     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 10, 21, 1);
  15340     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDestVirtualPortValid, qual_flags);
  15341 
  15342     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15343     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16);
  15344     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15345     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0);
  15346     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModPortGport, qual_flags);
  15347 
  15348     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15349     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16);
  15350     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15351     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0);
  15352     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModPortGports, qual_flags);
  15353 
  15354     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15355     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16);
  15356     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15357     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0);
  15358     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcPort, qual_flags);
  15359 
  15360     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15361     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16);
  15362     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15363     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0);
  15364     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunkMemberGport, qual_flags);
  15365 
  15366     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15367     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 168, 8);
  15368     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15369     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 0);
  15370     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModuleGport, qual_flags);
  15371 
  15372     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15373     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16);
  15374     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15375     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0);
  15376     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModPortGport, qual_flags);
  15377 
  15378     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15379     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16);
  15380     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15381     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0);
  15382     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModPortGports, qual_flags);
  15383 
  15384     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15385     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16);
  15386     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15387     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0);
  15388     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcPort, qual_flags);
  15389 
  15390     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15391     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16);
  15392     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15393     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0);
  15394     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunkMemberGport, qual_flags);
  15395 
  15396     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15397     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 182, 8);
  15398     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15399     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0);
  15400     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcModuleGport, qual_flags);
  15401 
  15402     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15403     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 16);
  15404     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15405     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 1);
  15406     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunk, qual_flags);
  15407 
  15408     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15409     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15410     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15411     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 1);
  15412     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunk, qual_flags);
  15413 
  15414     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15415     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15416     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15417     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15418     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMplsGport, qual_flags);
  15419 
  15420     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15421     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15422     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15423     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15424     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMplsGport, qual_flags);
  15425 
  15426     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15427     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15428     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15429     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15430     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMplsGports, qual_flags);
  15431 
  15432     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15433     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15434     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15435     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15436     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMplsGports, qual_flags);
  15437 
  15438     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15439     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15440     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15441     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15442     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMimGport, qual_flags);
  15443 
  15444     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15445     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15446     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15447     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15448     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMimGport, qual_flags);
  15449 
  15450     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15451     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15452     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15453     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15454     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMimGports, qual_flags);
  15455 
  15456     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15457     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15458     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15459     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15460     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcMimGports, qual_flags);
  15461 
  15462     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15463     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15464     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15465     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15466     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcWlanGport, qual_flags);
  15467 
  15468     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15469     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15470     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15471     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15472     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcWlanGport, qual_flags);
  15473 
  15474     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15475     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15476     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15477     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15478     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcWlanGports, qual_flags);
  15479 
  15480     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15481     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15482     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15483     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15484     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcWlanGports, qual_flags);
  15485 
  15486     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15487     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15488     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15489     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15490     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcNivGport, qual_flags);
  15491 
  15492     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15493     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15494     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15495     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15496     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcNivGport, qual_flags);
  15497 
  15498     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15499     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15500     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15501     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15502     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcNivGports, qual_flags);
  15503 
  15504     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15505     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15506     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15507     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15508     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcNivGports, qual_flags);
  15509 
  15510     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15511     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15512     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15513     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15514     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVxlanGport, qual_flags);
  15515 
  15516     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15517     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15518     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15519     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15520     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVxlanGport, qual_flags);
  15521 
  15522     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15523     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15524     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15525     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15526     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVxlanGports, qual_flags);
  15527 
  15528     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15529     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15530     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15531     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15532     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVxlanGports, qual_flags);
  15533 
  15534     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15535     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15536     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15537     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15538     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVlanGport, qual_flags);
  15539 
  15540     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15541     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15542     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15543     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15544     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVlanGport, qual_flags);
  15545 
  15546     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15547     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 10, 160, 14);
  15548     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 7, 1);
  15549     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A, 2);
  15550     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVlanGports, qual_flags);
  15551 
  15552     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15553     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 14);
  15554     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15555     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 2);
  15556     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcVlanGports, qual_flags);
  15557 
  15558     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15559     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 2, 16, 8);
  15560     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 29, 116, 4);
  15561     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVrf, qual_flags);
  15562 
  15563     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15564     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 17, 272, 12);
  15565     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVrf, qual_flags);
  15566 
  15567     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15568     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 1, 8, 8);
  15569     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 0, 0, 4);
  15570     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E2, 1, 2, 2);
  15571     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVpn, qual_flags);
  15572 
  15573     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15574     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 17, 274, 14);
  15575     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVpn, qual_flags);
  15576 
  15577     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15578     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 18, 288, 13);
  15579     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL3Ingress, qual_flags);
  15580 
  15581     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15582     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 0, 0, 8);
  15583     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInPort, qual_flags);
  15584 
  15585     /*Miscellaneous*/
  15586     SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  15587     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15588     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 27, 108, 4);
  15589     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIntPriority, qual_flags);
  15590 
  15591     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15592     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 26, 52, 2);
  15593     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyColor, qual_flags);
  15594     SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  15595 
  15596     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15597     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 27, 55, 1);
  15598     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  15599                         bcmFieldQualifyRouterAlertLabelValid, qual_flags);
  15600 
  15601     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15602     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 27, 54, 1);
  15603     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  15604            bcmFieldQualifyGenericAssociatedChannelLabelValid, qual_flags);
  15605 
  15606     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15607     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 28, 56, 2);
  15608     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  15609                          bcmFieldQualifyMplsControlWordValid, qual_flags);
  15610 
  15611     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15612     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 15, 30, 1);
  15613     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_MAC_NORM, 1);
  15614     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMacAddrsNormalized, qual_flags);
  15615 
  15616     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15617     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 15, 31, 1);
  15618     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_L3_L4_NORM, 1);
  15619     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpAddrsNormalized, qual_flags);
  15620 
  15621     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15622     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 22, 44, 2);
  15623     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyVlanFormat, qual_flags);
  15624 
  15625     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15626     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 23, 46, 2);
  15627     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTranslatedVlanFormat, qual_flags);
  15628 
  15629     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15630     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 32);
  15631     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 384, 32);
  15632     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E32, 13, 416, 32);
  15633     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(3, BCMI_KEYGEN_EXT_SECTION_L1E32, 14, 448, 32);
  15634     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(4, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 32);
  15635     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(5, BCMI_KEYGEN_EXT_SECTION_L1E32, 16, 512, 32);
  15636     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(6, BCMI_KEYGEN_EXT_SECTION_L1E32, 17, 544, 32);
  15637     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(7, BCMI_KEYGEN_EXT_SECTION_L1E32, 18, 576, 32);
  15638     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2PayLoad, qual_flags);
  15639 
  15640     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15641     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 17, 544, 32);
  15642     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E32, 18, 576, 32);
  15643     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  15644                         bcmFieldQualifyL2PayloadFirstEightBytes, qual_flags);
  15645 
  15646     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15647     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 29, 58, 2);
  15648     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpInfo, qual_flags);
  15649 
  15650     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15651     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 0, 0, 32);
  15652     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 10);
  15653     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyBfdYourDiscriminator, qual_flags);
  15654 
  15655     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15656     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 1, 32, 32);
  15657     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 10);
  15658     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyBfdYourDiscriminator, qual_flags);
  15659 
  15660     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15661     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 2, 32, 16);
  15662     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 3, 48, 16);
  15663     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B, 10);
  15664     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyBfdYourDiscriminator, qual_flags);
  15665 
  15666     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15667     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 4, 64, 16);
  15668     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 5, 80, 16);
  15669     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A, 10);
  15670     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyBfdYourDiscriminator, qual_flags);
  15671 
  15672     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15673     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 16);
  15674     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 2);
  15675     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyPacketLength, qual_flags);
  15676 
  15677     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15678     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 16);
  15679     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 2);
  15680     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyPacketLength, qual_flags);
  15681 
  15682     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15683     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 23, 368, 16);
  15684     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 24, 384, 16);
  15685     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRangeCheck, qual_flags);
  15686 
  15687     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15688     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 11, 176, 16);
  15689     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 3, 6, 1);
  15690     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B, 0);
  15691     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcTrunkMemberGport, qual_flags);
  15692 
  15693     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15694     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 26, 104, 4);
  15695     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyMplsForwardingLabelAction, qual_flags);
  15696 
  15697     SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  15698     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15699     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 11, 88, 6);
  15700     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyPacketRes, qual_flags);
  15701     SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  15702 
  15703     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15704     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 10, 84, 1);
  15705     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyLoopback, qual_flags);
  15706 
  15707     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15708     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 10, 80, 5);
  15709     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyLoopbackType, qual_flags);
  15710 
  15711     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15712     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 10, 80, 5);
  15713     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTunnelType, qual_flags);
  15714 
  15715     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15716     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 1, 4, 4);
  15717     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E2, 4, 8, 1);
  15718     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpType, qual_flags);
  15719 
  15720     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15721     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 21, 42, 2);
  15722     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL2Format, qual_flags);
  15723 
  15724     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15725     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 25, 50, 2);
  15726     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInnerTpid, qual_flags);
  15727 
  15728     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15729     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 24, 48, 2);
  15730     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyOuterTpid, qual_flags);
  15731 
  15732     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15733     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 15, 60, 4);
  15734     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyForwardingType, qual_flags);
  15735 
  15736     /* Compression Qualifiers */
  15737 
  15738     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15739     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 17, 68, 4);
  15740     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeOxIDClass, qual_flags);
  15741 
  15742     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15743     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 16, 64, 4);
  15744     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeRxIDClass, qual_flags);
  15745 
  15746     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15747     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 17, 68, 4);
  15748     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4SrcPortClass, qual_flags);
  15749 
  15750     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15751     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 6, 4);
  15752     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0);
  15753     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4SrcPortClass, qual_flags);
  15754 
  15755     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15756     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 22, 4);
  15757     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0);
  15758     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4SrcPortClass, qual_flags);
  15759 
  15760     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15761     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 16, 64, 4);
  15762     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4DstPortClass, qual_flags);
  15763 
  15764     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15765     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 2, 4);
  15766     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0);
  15767     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4DstPortClass, qual_flags);
  15768 
  15769     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15770     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 18, 4);
  15771     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0);
  15772     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyL4DstPortClass, qual_flags);
  15773 
  15774     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15775     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 19, 76, 4);
  15776     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpProtocolClass, qual_flags);
  15777 
  15778     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15779     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 10, 4);
  15780     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 0);
  15781     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpProtocolClass, qual_flags);
  15782 
  15783     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15784     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 26, 4);
  15785     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 0);
  15786     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyIpProtocolClass, qual_flags);
  15787 
  15788     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15789     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 18, 72, 4);
  15790     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyEtherTypeClass, qual_flags);
  15791 
  15792     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15793     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 13, 104, 8);
  15794     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN, 0);
  15795     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTtlClassZero, qual_flags);
  15796 
  15797     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15798     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 13, 104, 8);
  15799     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN, 1);
  15800     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTtlClassOne, qual_flags);
  15801 
  15802     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15803     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 12, 96, 8);
  15804     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN, 0);
  15805     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTosClassZero, qual_flags);
  15806 
  15807     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15808     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 12, 96, 8);
  15809     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN, 1);
  15810     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTosClassOne, qual_flags);
  15811 
  15812     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15813     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 2, 8, 4);
  15814     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 3, 12, 4);
  15815     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN, 0);
  15816     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTcpClassZero, qual_flags);
  15817 
  15818     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15819     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 2, 8, 4);
  15820     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E4, 3, 12, 4);
  15821     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN, 1);
  15822     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyTcpClassOne, qual_flags);
  15823 
  15824     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15825     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16);
  15826     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16);
  15827     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4);
  15828     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIpClass, qual_flags);
  15829 
  15830     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15831     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16);
  15832     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIpClassLower, qual_flags);
  15833 
  15834     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15835     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16);
  15836     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIpClassUpper, qual_flags);
  15837 
  15838     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15839     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4);
  15840     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIpClassMsbNibble, qual_flags);
  15841 
  15842     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15843     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16);
  15844     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16);
  15845     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4);
  15846     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6Class, qual_flags);
  15847 
  15848     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15849     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16);
  15850     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6ClassLower, qual_flags);
  15851 
  15852     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15853     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16);
  15854     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6ClassUpper, qual_flags);
  15855 
  15856     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15857     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4);
  15858     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifySrcIp6ClassMsbNibble, qual_flags);
  15859 
  15860     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15861     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16);
  15862     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16);
  15863     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4);
  15864     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpClass, qual_flags);
  15865 
  15866     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15867     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16);
  15868     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpClassLower, qual_flags);
  15869 
  15870     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15871     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16);
  15872     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpClassUpper, qual_flags);
  15873 
  15874     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15875     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4);
  15876     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIpClassMsbNibble, qual_flags);
  15877 
  15878     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15879     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16);
  15880     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16);
  15881     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4);
  15882     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6Class, qual_flags);
  15883 
  15884     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15885     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16);
  15886     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6ClassLower, qual_flags);
  15887 
  15888     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15889     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16);
  15890     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6ClassUpper, qual_flags);
  15891 
  15892     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15893     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4);
  15894     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstIp6ClassMsbNibble, qual_flags);
  15895 
  15896     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15897     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16);
  15898     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16);
  15899     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4);
  15900     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcIdClass, qual_flags);
  15901 
  15902     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15903     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 21, 336, 16);
  15904     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcIdClassLower, qual_flags);
  15905 
  15906     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15907     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 22, 352, 16);
  15908     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcIdClassUpper, qual_flags);
  15909 
  15910     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15911     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 20, 80, 4);
  15912     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcIdClassMsbNibble, qual_flags);
  15913 
  15914     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15915     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16);
  15916     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16);
  15917     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4);
  15918     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstIdClass, qual_flags);
  15919 
  15920     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15921     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 19, 304, 16);
  15922     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstIdClassLower, qual_flags);
  15923 
  15924     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15925     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 20, 320, 16);
  15926     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstIdClassUpper, qual_flags);
  15927 
  15928     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15929     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E4, 21, 84, 4);
  15930     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstIdClassMsbNibble, qual_flags);
  15931 
  15932     /*Fiber Channel Qualifiers */
  15933     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15934     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 360, 24);
  15935     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanSrcId, qual_flags);
  15936 
  15937     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15938     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 355, 3);
  15939     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanInner, qual_flags);
  15940 
  15941     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15942     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 11, 352, 3);
  15943     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanOuter, qual_flags);
  15944 
  15945     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15946     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 392, 24);
  15947     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanFCtl, qual_flags);
  15948 
  15949     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15950     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 12, 384, 8);
  15951     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFcoeSOF, qual_flags);
  15952 
  15953     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15954     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 488, 24);
  15955     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDstId, qual_flags);
  15956 
  15957     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15958     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E32, 15, 480, 8);
  15959     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanRCtl, qual_flags);
  15960 
  15961     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15962     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 12, 96, 8);
  15963     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanCSCtl, qual_flags);
  15964 
  15965     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15966     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 13, 104, 8);
  15967     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTHopCount, qual_flags);
  15968 
  15969     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15970     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 12, 3);
  15971     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 7);
  15972     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTPri, qual_flags);
  15973 
  15974     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15975     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 0, 0, 12);
  15976     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D, 7);
  15977     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTFabricId, qual_flags);
  15978 
  15979     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15980     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 28, 3);
  15981     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 7);
  15982     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTPri, qual_flags);
  15983 
  15984     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15985     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E16, 1, 16, 12);
  15986     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C, 7);
  15987     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanVFTFabricId, qual_flags);
  15988 
  15989     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15990     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 14, 112, 8);
  15991     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanType, qual_flags);
  15992 
  15993     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  15994     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E8, 16, 128, 8);
  15995     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyFibreChanDFCtl, qual_flags);
  15996 
  15997 #if defined(BCM_TOMAHAWK2_SUPPORT)
  15998     if (SOC_IS_TOMAHAWK2(unit)) {
  15999         BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16000         BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_L1E2, 6, 12, 1);
  16001         BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyRecoverableDrop, qual_flags);
  16002     }
  16003 #endif /* BCM_TOMAHAWK2_SUPPORT */
  16004 
  16005     /* ltid is assigned fixed offset to avoid issues
  16006      * with matching on ltid with value 0
  16007      */
  16008     SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_PMUX);
  16009 
  16010     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16011     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0,
  16012         BCMI_KEYGEN_EXT_SECTION_LTID, 0, 144, 4);
  16013     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1,
  16014         BCMI_KEYGEN_EXT_SECTION_LTID, 1, 150, 1);
  16015     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  16016         _bcmFieldQualifyPreLogicalTableId, qual_flags);
  16017 
  16018     SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_EM);
  16019     /* Post Mux Qualifers */
  16020     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16021     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_DROP, 0, 159, 1);
  16022     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDrop, qual_flags);
  16023 
  16024     /* NAT Qualifiers */
  16025     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16026     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16027         (0, BCMI_KEYGEN_EXT_SECTION_NAT_NEEDED, 1, 158, 1);
  16028     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyNatNeeded, qual_flags);
  16029 
  16030     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16031     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16032         (0, BCMI_KEYGEN_EXT_SECTION_NAT_DST_REALMID, 2, 156, 2);
  16033     BCMI_KEYGEN_QUAL_CFG_INSERT
  16034         (unit, db, bcmFieldQualifyNatDstRealmId, qual_flags);
  16035 
  16036     /* Exact Match Class Id  and HIT status Qualifiers. */
  16037     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16038     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0,
  16039         BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_0_3, 8, 120, 4);
  16040     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1,
  16041         BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_4_7, 9, 124, 4);
  16042     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2,
  16043         BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_8_11, 10, 128, 4);
  16044     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  16045                   _bcmFieldQualifyExactMatchActionClassIdLookup0, qual_flags);
  16046 
  16047     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16048     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0,
  16049         BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_0_3, 5, 132, 4);
  16050     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(1,
  16051         BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_4_7, 6, 136, 4);
  16052     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(2,
  16053         BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_8_11, 7, 140, 4);
  16054     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  16055                    _bcmFieldQualifyExactMatchActionClassIdLookup1, qual_flags);
  16056 
  16057     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16058     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0,
  16059         BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_HIT, 3, 154, 1);
  16060     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  16061         _bcmFieldQualifyExactMatchHitStatusLookup0, qual_flags);
  16062 
  16063     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16064     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0,
  16065         BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_HIT, 3, 155, 1);
  16066     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db,
  16067         _bcmFieldQualifyExactMatchHitStatusLookup1, qual_flags);
  16068 
  16069     /* Destination Port Object(PORT/LAG/VP/VPLAG) -
  16070      * Any other Mode than SINGLE.
  16071      */
  16072     SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_PMUX);
  16073     SHR_BITSET(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_SINGLE);
  16074     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16075     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16076         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16077     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16078         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16079     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 4);
  16080     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstPort, qual_flags);
  16081 
  16082     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16083     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16084         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16085     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16086         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16087     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 4);
  16088     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstPort, qual_flags);
  16089 
  16090     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16091     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16092         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16093     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16094         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16095     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 4);
  16096     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstTrunk, qual_flags);
  16097 
  16098     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16099     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16100         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16101     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16102         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16103     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 4);
  16104     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstTrunk, qual_flags);
  16105 
  16106     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16107     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16108         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16109     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16110         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16111     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16112     BCMI_KEYGEN_QUAL_CFG_INSERT
  16113         (unit, db, bcmFieldQualifyDstMimGport, qual_flags);
  16114 
  16115     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16116     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16117         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16118     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16119         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16120     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16121     BCMI_KEYGEN_QUAL_CFG_INSERT
  16122         (unit, db, bcmFieldQualifyDstMimGport, qual_flags);
  16123 
  16124     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16125     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16126         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16127     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16128         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16129     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16130     BCMI_KEYGEN_QUAL_CFG_INSERT
  16131         (unit, db, bcmFieldQualifyDstMimGports, qual_flags);
  16132 
  16133     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16134     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16135         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16136     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16137         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16138     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16139     BCMI_KEYGEN_QUAL_CFG_INSERT
  16140         (unit, db, bcmFieldQualifyDstMimGports, qual_flags);
  16141 
  16142     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16143     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16144         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16145     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16146         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16147     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16148     BCMI_KEYGEN_QUAL_CFG_INSERT
  16149         (unit, db, bcmFieldQualifyDstNivGport, qual_flags);
  16150 
  16151     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16152     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16153         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16154     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16155         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16156     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16157     BCMI_KEYGEN_QUAL_CFG_INSERT
  16158         (unit, db, bcmFieldQualifyDstNivGport, qual_flags);
  16159 
  16160     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16161     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16162         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16163     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16164         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16165     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16166     BCMI_KEYGEN_QUAL_CFG_INSERT
  16167         (unit, db, bcmFieldQualifyDstNivGports, qual_flags);
  16168 
  16169     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16170     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16171         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16172     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16173         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16174     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16175     BCMI_KEYGEN_QUAL_CFG_INSERT
  16176         (unit, db, bcmFieldQualifyDstNivGports, qual_flags);
  16177 
  16178     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16179     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16180         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16181     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16182         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16183     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16184     BCMI_KEYGEN_QUAL_CFG_INSERT
  16185         (unit, db, bcmFieldQualifyDstVxlanGport, qual_flags);
  16186 
  16187     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16188     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16189         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16190     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16191         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16192     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16193     BCMI_KEYGEN_QUAL_CFG_INSERT
  16194         (unit, db, bcmFieldQualifyDstVxlanGport, qual_flags);
  16195 
  16196     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16197     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16198         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16199     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16200         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16201     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16202     BCMI_KEYGEN_QUAL_CFG_INSERT
  16203         (unit, db, bcmFieldQualifyDstVxlanGports, qual_flags);
  16204 
  16205     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16206     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16207         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16208     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16209         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16210     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16211     BCMI_KEYGEN_QUAL_CFG_INSERT
  16212         (unit, db, bcmFieldQualifyDstVxlanGports, qual_flags);
  16213 
  16214     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16215     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16216         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16217     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16218         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16219     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16220     BCMI_KEYGEN_QUAL_CFG_INSERT
  16221         (unit, db, bcmFieldQualifyDstVlanGport, qual_flags);
  16222 
  16223     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16224     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16225         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16226     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16227         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16228     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16229     BCMI_KEYGEN_QUAL_CFG_INSERT
  16230         (unit, db, bcmFieldQualifyDstVlanGport, qual_flags);
  16231 
  16232     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16233     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16234         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16235     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16236         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16237     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16238     BCMI_KEYGEN_QUAL_CFG_INSERT
  16239         (unit, db, bcmFieldQualifyDstVlanGports, qual_flags);
  16240 
  16241     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16242     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16243         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16244     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16245         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16246     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16247     BCMI_KEYGEN_QUAL_CFG_INSERT
  16248         (unit, db, bcmFieldQualifyDstVlanGports, qual_flags);
  16249 
  16250     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16251     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16252         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16253     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16254         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16255     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16256     BCMI_KEYGEN_QUAL_CFG_INSERT
  16257         (unit, db, bcmFieldQualifyDstMplsGport, qual_flags);
  16258 
  16259     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16260     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16261         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16262     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16263         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16264     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16265     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstMplsGport, qual_flags);
  16266 
  16267     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16268     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16269         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16270     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16271         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16272     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16273     BCMI_KEYGEN_QUAL_CFG_INSERT
  16274         (unit, db, bcmFieldQualifyDstMplsGports, qual_flags);
  16275 
  16276     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16277     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16278         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16279     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16280         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16281     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16282     BCMI_KEYGEN_QUAL_CFG_INSERT
  16283         (unit, db, bcmFieldQualifyDstMplsGports, qual_flags);
  16284 
  16285     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16286     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16287         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16288     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16289         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16290     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16291     BCMI_KEYGEN_QUAL_CFG_INSERT
  16292         (unit, db, bcmFieldQualifyDstWlanGport, qual_flags);
  16293 
  16294     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16295     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16296         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16297     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16298         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16299     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16300     BCMI_KEYGEN_QUAL_CFG_INSERT
  16301         (unit, db, bcmFieldQualifyDstWlanGport, qual_flags);
  16302 
  16303     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16304     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16305         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16306     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16307         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16308     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16309     BCMI_KEYGEN_QUAL_CFG_INSERT
  16310         (unit, db, bcmFieldQualifyDstWlanGports, qual_flags);
  16311 
  16312     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16313     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16314         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16315     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16316         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16317     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16318     BCMI_KEYGEN_QUAL_CFG_INSERT
  16319         (unit, db, bcmFieldQualifyDstWlanGports, qual_flags);
  16320 
  16321     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16322     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16323         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16324     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16325         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16326     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 9);
  16327     BCMI_KEYGEN_QUAL_CFG_INSERT
  16328         (unit, db, bcmFieldQualifyDstL3EgressNextHops, qual_flags);
  16329 
  16330     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16331     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16332         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16333     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16334         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16335     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 9);
  16336     BCMI_KEYGEN_QUAL_CFG_INSERT
  16337         (unit, db, bcmFieldQualifyDstL3Egress, qual_flags);
  16338 
  16339     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16340     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16341         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16342     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16343         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16344     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 9);
  16345     BCMI_KEYGEN_QUAL_CFG_INSERT
  16346         (unit, db, bcmFieldQualifyDstL3EgressNextHops, qual_flags);
  16347 
  16348     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16349     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16350         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16351     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16352         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16353     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 9);
  16354     BCMI_KEYGEN_QUAL_CFG_INSERT
  16355         (unit, db, bcmFieldQualifyDstL3Egress, qual_flags);
  16356 
  16357     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16358     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16359         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16360     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16361         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16362     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 7);
  16363     BCMI_KEYGEN_QUAL_CFG_INSERT
  16364         (unit, db, bcmFieldQualifyDstMultipath, qual_flags);
  16365 
  16366     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16367     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16368         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16369     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16370         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16371     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 7);
  16372     BCMI_KEYGEN_QUAL_CFG_INSERT
  16373         (unit, db, bcmFieldQualifyDstMultipath, qual_flags);
  16374 
  16375     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16376     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16377         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16378     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16379         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16380     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 7);
  16381     BCMI_KEYGEN_QUAL_CFG_INSERT
  16382         (unit, db, bcmFieldQualifyDstMultipathOverlay, qual_flags);
  16383 
  16384     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16385     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16386         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16387     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16388         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16389     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 7);
  16390     BCMI_KEYGEN_QUAL_CFG_INSERT
  16391         (unit, db, bcmFieldQualifyDstMultipathOverlay, qual_flags);
  16392 
  16393     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16394     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16395         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16396     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16397         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16398     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 8);
  16399     BCMI_KEYGEN_QUAL_CFG_INSERT
  16400         (unit, db, bcmFieldQualifyDstMultipathUnderlay, qual_flags);
  16401 
  16402     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16403     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16404         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16405     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16406         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16407     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 8);
  16408     BCMI_KEYGEN_QUAL_CFG_INSERT
  16409         (unit, db, bcmFieldQualifyDstMultipathUnderlay, qual_flags);
  16410 
  16411     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16412     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16413         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16414     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16415         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16416     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 10);
  16417     BCMI_KEYGEN_QUAL_CFG_INSERT
  16418         (unit, db, bcmFieldQualifyDstL3MulticastGroup, qual_flags);
  16419 
  16420     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16421     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16422         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16423     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16424         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16425     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 10);
  16426     BCMI_KEYGEN_QUAL_CFG_INSERT
  16427         (unit, db, bcmFieldQualifyDstL3MulticastGroup, qual_flags);
  16428 
  16429     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16430     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16431         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 14, 48, 16);
  16432     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16433         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16434     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 11);
  16435     BCMI_KEYGEN_QUAL_CFG_INSERT
  16436         (unit, db, bcmFieldQualifyDstL2MulticastGroup, qual_flags);
  16437 
  16438     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16439     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16440         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 13, 64, 16);
  16441     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16442         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16443     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 11);
  16444     BCMI_KEYGEN_QUAL_CFG_INSERT
  16445         (unit, db, bcmFieldQualifyDstL2MulticastGroup, qual_flags);
  16446 
  16447     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16448     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_IPBM, 0, 0, 34);
  16449     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT, 0);
  16450     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyInPorts, qual_flags);
  16451 
  16452     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16453     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_IPBM, 0, 0, 34);
  16454     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT, 3);
  16455     BCMI_KEYGEN_QUAL_CFG_INSERT
  16456         (unit, db, bcmFieldQualifyDevicePortBitmap, qual_flags);
  16457 
  16458     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16459     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_IPBM, 0, 0, 34);
  16460     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT, 1);
  16461     BCMI_KEYGEN_QUAL_CFG_INSERT
  16462         (unit, db, bcmFieldQualifySystemPortBitmap, qual_flags);
  16463 
  16464     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16465     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD(0, BCMI_KEYGEN_EXT_SECTION_IPBM, 0, 0, 34);
  16466     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT, 2);
  16467     BCMI_KEYGEN_QUAL_CFG_INSERT
  16468         (unit, db, bcmFieldQualifySourceGportBitmap, qual_flags);
  16469 
  16470     /* Destination Port Object(PORT/LAG/VP/VPLAG) - SINGLE Wide Mode */
  16471     SHR_BITCLR(qual_flags.w, BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_SINGLE);
  16472     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16473     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16474         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16475     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16476         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16477     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 4);
  16478     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstPort, qual_flags);
  16479 
  16480     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16481     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16482         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16483     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16484         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16485     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 4);
  16486     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstPort, qual_flags);
  16487 
  16488     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16489     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16490         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16491     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16492         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16493     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 4);
  16494     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstTrunk, qual_flags);
  16495 
  16496     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16497     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16498         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16499     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16500         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16501     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 4);
  16502     BCMI_KEYGEN_QUAL_CFG_INSERT(unit, db, bcmFieldQualifyDstTrunk, qual_flags);
  16503 
  16504     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16505     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16506         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16507     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16508         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16509     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16510     BCMI_KEYGEN_QUAL_CFG_INSERT
  16511         (unit, db, bcmFieldQualifyDstMimGport, qual_flags);
  16512 
  16513     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16514     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16515         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16516     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16517         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16518     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16519     BCMI_KEYGEN_QUAL_CFG_INSERT
  16520         (unit, db, bcmFieldQualifyDstMimGport, qual_flags);
  16521 
  16522     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16523     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16524         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16525     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16526         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16527     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16528     BCMI_KEYGEN_QUAL_CFG_INSERT
  16529         (unit, db, bcmFieldQualifyDstMimGports, qual_flags);
  16530 
  16531     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16532     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16533         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16534     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16535         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16536     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16537     BCMI_KEYGEN_QUAL_CFG_INSERT
  16538         (unit, db, bcmFieldQualifyDstMimGports, qual_flags);
  16539 
  16540     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16541     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16542         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16543     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16544         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16545     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16546     BCMI_KEYGEN_QUAL_CFG_INSERT
  16547         (unit, db, bcmFieldQualifyDstNivGport, qual_flags);
  16548 
  16549     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16550     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16551         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16552     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16553         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16554     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16555     BCMI_KEYGEN_QUAL_CFG_INSERT
  16556         (unit, db, bcmFieldQualifyDstNivGport, qual_flags);
  16557 
  16558     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16559     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16560         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16561     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16562         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16563     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16564     BCMI_KEYGEN_QUAL_CFG_INSERT
  16565         (unit, db, bcmFieldQualifyDstNivGports, qual_flags);
  16566 
  16567     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16568     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16569         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16570     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16571         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16572     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16573     BCMI_KEYGEN_QUAL_CFG_INSERT
  16574         (unit, db, bcmFieldQualifyDstNivGports, qual_flags);
  16575 
  16576     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16577     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16578         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16579     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16580         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16581     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16582     BCMI_KEYGEN_QUAL_CFG_INSERT
  16583         (unit, db, bcmFieldQualifyDstVxlanGport, qual_flags);
  16584 
  16585     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16586     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16587         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16588     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16589         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16590     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16591     BCMI_KEYGEN_QUAL_CFG_INSERT
  16592         (unit, db, bcmFieldQualifyDstVxlanGport, qual_flags);
  16593 
  16594     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16595     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16596         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16597     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16598         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16599     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16600     BCMI_KEYGEN_QUAL_CFG_INSERT
  16601         (unit, db, bcmFieldQualifyDstVxlanGports, qual_flags);
  16602 
  16603     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16604     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16605         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16606     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16607         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16608     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16609     BCMI_KEYGEN_QUAL_CFG_INSERT
  16610         (unit, db, bcmFieldQualifyDstVxlanGports, qual_flags);
  16611 
  16612     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16613     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16614         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16615     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16616         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16617     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16618     BCMI_KEYGEN_QUAL_CFG_INSERT
  16619         (unit, db, bcmFieldQualifyDstVlanGport, qual_flags);
  16620 
  16621     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16622     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16623         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16624     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16625         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16626     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16627     BCMI_KEYGEN_QUAL_CFG_INSERT
  16628         (unit, db, bcmFieldQualifyDstVlanGport, qual_flags);
  16629 
  16630     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16631     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16632         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16633     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16634         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16635     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16636     BCMI_KEYGEN_QUAL_CFG_INSERT
  16637         (unit, db, bcmFieldQualifyDstVlanGports, qual_flags);
  16638 
  16639     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16640     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16641         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16642     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16643         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16644     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16645     BCMI_KEYGEN_QUAL_CFG_INSERT
  16646         (unit, db, bcmFieldQualifyDstVlanGports, qual_flags);
  16647 
  16648     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16649     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16650         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16651     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16652         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16653     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16654     BCMI_KEYGEN_QUAL_CFG_INSERT
  16655         (unit, db, bcmFieldQualifyDstWlanGport, qual_flags);
  16656 
  16657     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16658     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16659         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16660     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16661         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16662     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16663     BCMI_KEYGEN_QUAL_CFG_INSERT
  16664         (unit, db, bcmFieldQualifyDstWlanGport, qual_flags);
  16665 
  16666     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16667     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16668         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16669     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16670         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16671     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16672     BCMI_KEYGEN_QUAL_CFG_INSERT
  16673         (unit, db, bcmFieldQualifyDstWlanGports, qual_flags);
  16674 
  16675     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16676     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16677         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16678     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16679         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16680     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16681     BCMI_KEYGEN_QUAL_CFG_INSERT
  16682         (unit, db, bcmFieldQualifyDstWlanGports, qual_flags);
  16683 
  16684     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16685     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16686         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16687     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16688         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16689     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16690     BCMI_KEYGEN_QUAL_CFG_INSERT
  16691         (unit, db, bcmFieldQualifyDstMplsGport, qual_flags);
  16692 
  16693     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16694     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16695         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16696     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16697         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16698     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16699     BCMI_KEYGEN_QUAL_CFG_INSERT
  16700         (unit, db, bcmFieldQualifyDstMplsGport, qual_flags);
  16701 
  16702     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16703     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16704         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16705     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16706         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16707     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 5);
  16708     BCMI_KEYGEN_QUAL_CFG_INSERT
  16709         (unit, db, bcmFieldQualifyDstMplsGports, qual_flags);
  16710 
  16711     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16712     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16713         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16714     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16715         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16716     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 5);
  16717     BCMI_KEYGEN_QUAL_CFG_INSERT
  16718         (unit, db, bcmFieldQualifyDstMplsGports, qual_flags);
  16719 
  16720     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16721     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16722         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16723     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16724         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16725     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 9);
  16726     BCMI_KEYGEN_QUAL_CFG_INSERT
  16727         (unit, db, bcmFieldQualifyDstL3EgressNextHops, qual_flags);
  16728 
  16729     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16730     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16731         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16732     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16733         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16734     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 9);
  16735     BCMI_KEYGEN_QUAL_CFG_INSERT
  16736         (unit, db, bcmFieldQualifyDstL3Egress, qual_flags);
  16737 
  16738     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16739     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16740         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16741     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16742         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16743     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 9);
  16744     BCMI_KEYGEN_QUAL_CFG_INSERT
  16745         (unit, db, bcmFieldQualifyDstL3EgressNextHops, qual_flags);
  16746 
  16747     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16748     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16749         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16750     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16751         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16752     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 9);
  16753     BCMI_KEYGEN_QUAL_CFG_INSERT
  16754         (unit, db, bcmFieldQualifyDstL3Egress, qual_flags);
  16755 
  16756     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16757     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16758         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16759     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16760         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16761     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 7);
  16762     BCMI_KEYGEN_QUAL_CFG_INSERT
  16763         (unit, db, bcmFieldQualifyDstMultipath, qual_flags);
  16764 
  16765     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16766     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16767         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16768     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16769         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16770     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 7);
  16771     BCMI_KEYGEN_QUAL_CFG_INSERT
  16772         (unit, db, bcmFieldQualifyDstMultipath, qual_flags);
  16773 
  16774     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16775     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16776         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16777     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16778         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16779     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 7);
  16780     BCMI_KEYGEN_QUAL_CFG_INSERT
  16781         (unit, db, bcmFieldQualifyDstMultipathOverlay, qual_flags);
  16782 
  16783     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16784     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16785         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16786     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16787         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16788     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 7);
  16789     BCMI_KEYGEN_QUAL_CFG_INSERT
  16790         (unit, db, bcmFieldQualifyDstMultipathOverlay, qual_flags);
  16791 
  16792     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16793     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16794         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16795     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16796         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16797     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 8);
  16798     BCMI_KEYGEN_QUAL_CFG_INSERT
  16799         (unit, db, bcmFieldQualifyDstMultipathUnderlay, qual_flags);
  16800 
  16801     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16802     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16803         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16804     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16805         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16806     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 8);
  16807     BCMI_KEYGEN_QUAL_CFG_INSERT
  16808         (unit, db, bcmFieldQualifyDstMultipathUnderlay, qual_flags);
  16809 
  16810     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16811     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16812         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16813     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16814         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16815     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 10);
  16816     BCMI_KEYGEN_QUAL_CFG_INSERT
  16817         (unit, db, bcmFieldQualifyDstL3MulticastGroup, qual_flags);
  16818 
  16819     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16820     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16821         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16822     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16823         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16824     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 10);
  16825     BCMI_KEYGEN_QUAL_CFG_INSERT
  16826         (unit, db, bcmFieldQualifyDstL3MulticastGroup, qual_flags);
  16827 
  16828     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16829     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16830         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0, 12, 88, 16);
  16831     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16832         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 152, 1);
  16833     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0, 11);
  16834     BCMI_KEYGEN_QUAL_CFG_INSERT
  16835         (unit, db, bcmFieldQualifyDstL2MulticastGroup, qual_flags);
  16836 
  16837     BCMI_KEYGEN_QUAL_CFG_INIT(unit);
  16838     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16839         (0, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1, 11, 104, 16);
  16840     BCMI_KEYGEN_QUAL_CFG_OFFSET_ADD
  16841         (1, BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB, 4, 153, 1);
  16842     BCMI_KEYGEN_QUAL_CFG_PRI_CTRL_SEL_ADD(BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1, 11);
  16843     BCMI_KEYGEN_QUAL_CFG_INSERT
  16844         (unit, db, bcmFieldQualifyDstL2MulticastGroup, qual_flags);
  16845 
  16846 exit:
  16847     BCMI_KEYGEN_FUNC_EXIT();
  16848 }
  16849 
  16850 /*
  16851  * Function:
  16852  *    _field_th_common_qualifiers_init
  16853  *
  16854  * Purpose:
  16855  *    Initialize Field Common Stage Qualifiers extractors and offsets.
  16856  *
  16857  * Parameters:
  16858  *    unit       - (IN) BCM device number.
  16859  *    stage_fc   - (IN/OUT) Field Processor stage control structure.
  16860  *
  16861  * Returns:
  16862  *    BCM_E_PARAM       - Null field stage control structure.
  16863  *    BCM_E_MEMORY      - Allocation failure.
  16864  *    BCM_E_INTERNAL    - Invalid CAP Stage ID.
  16865  *    BCM_E_NONE        - Success.
  16866  */
  16867 STATIC int
  16868 _field_th_common_qualifiers_init(int unit, _field_stage_t *stage_fc)
  16869 {
  16870     _FP_QUAL_DECL;
  16871 
  16872     /* Allocated stage qualifiers configuration array. */
  16873     _FP_XGS3_ALLOC(stage_fc->f_qual_arr,
  16874         (_bcmFieldQualifyCount * sizeof(_bcm_field_qual_info_t *)),
  16875         "IFP qualifiers");
  16876     if (stage_fc->f_qual_arr == 0) {
  16877         return (BCM_E_MEMORY);
  16878     }
  16879 
  16880     /* Pseudo Qualifiers. */
  16881     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyStage,
  16882         0,
  16883         _bcmFieldSliceSelDisable, 0,
  16884         0, 0,
  16885         0, 0);
  16886     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyStageIngress,
  16887         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16888         _bcmFieldSliceSelDisable, 0,
  16889         0, 0,
  16890         0, 0);
  16891     if (soc_feature(unit, soc_feature_field_exact_match_support)) {
  16892         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyStageIngressExactMatch,
  16893             _BCM_FIELD_QUAL_OFFSET_NO_IFP_SUPPORT,
  16894             _bcmFieldSliceSelDisable, 0,
  16895             0, 0,
  16896             0, 0);
  16897     }
  16898     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExactMatchHitStatus,
  16899         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16900         _bcmFieldSliceSelDisable, 0,
  16901         0, 0,
  16902         0, 0);
  16903     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExactMatchGroupClassId,
  16904         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16905         _bcmFieldSliceSelDisable, 0,
  16906         0, 0,
  16907         0, 0);
  16908     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExactMatchActionClassId,
  16909         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16910         _bcmFieldSliceSelDisable, 0,
  16911         0, 0,
  16912         0, 0);
  16913     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIp4,
  16914         0,
  16915         _bcmFieldSliceSelDisable, 0,
  16916         0, 0,
  16917         0, 0);
  16918     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIp6,
  16919         0,
  16920         _bcmFieldSliceSelDisable, 0,
  16921         0, 0,
  16922         0, 0);
  16923     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNormalizeIpAddrs,
  16924         0,
  16925         _bcmFieldSliceSelDisable, 0,
  16926         0, 0,
  16927         0, 0);
  16928     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNormalizeMacAddrs,
  16929         0,
  16930         _bcmFieldSliceSelDisable, 0,
  16931         0, 0,
  16932         0, 0);
  16933 
  16934     /* Post muxed qualifiers. */
  16935      if (!soc_feature(unit, soc_feature_ifp_no_inports_support)) {
  16936         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInPorts,
  16937         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16938         _bcmFieldSliceSelDisable, 0,
  16939         0, 36,
  16940         36, 0);
  16941      }
  16942     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDevicePortBitmap,
  16943         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16944         _bcmFieldSliceSelDisable, 0,
  16945         0, 36,
  16946         36, 0);
  16947     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySystemPortBitmap,
  16948         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16949         _bcmFieldSliceSelDisable, 0,
  16950         0, 36,
  16951         36, 0);
  16952     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySourceGportBitmap,
  16953         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16954         _bcmFieldSliceSelDisable, 0,
  16955         0, 36,
  16956         36, 0);
  16957     if (soc_feature(unit, soc_feature_nat)) {
  16958         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNatDstRealmId,
  16959             _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16960             _bcmFieldSliceSelDisable, 0,
  16961             156, 2,
  16962             2, 156);
  16963         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNatSrcRealmId,
  16964             0,
  16965             _bcmFieldSliceSelDisable, 0,
  16966             0, 2,
  16967             2, 0);
  16968         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNatNeeded,
  16969             _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16970             _bcmFieldSliceSelDisable, 0,
  16971             158, 1,
  16972             1, 158);
  16973     }
  16974     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDrop,
  16975         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16976         _bcmFieldSliceSelDisable, 0,
  16977         159, 1,
  16978         1, 159);
  16979     /* Exact Match Chaining Post Mux Qualifier */
  16980 #if defined(BCM_TOMAHAWK3_SUPPORT)
  16981     if (soc_feature(unit, soc_feature_th3_style_fp)) {
  16982         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  16983                 _bcmFieldQualifyExactMatchHitStatusLookup0,
  16984                 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16985                 _bcmFieldSliceSelDisable, 0,
  16986                 158, 1,
  16987                 1, 158);
  16988         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  16989                 _bcmFieldQualifyExactMatchActionClassIdLookup0,
  16990                 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  16991                 _bcmFieldSliceSelDisable, 0,
  16992                 84, 12,
  16993                 12, 84);
  16994 
  16995      } else
  16996 #endif
  16997      {
  16998          _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  16999                  _bcmFieldQualifyExactMatchHitStatusLookup0,
  17000                  _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17001                  _bcmFieldSliceSelDisable, 0,
  17002                  154, 1,
  17003                  1, 154);
  17004          _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  17005                  _bcmFieldQualifyExactMatchHitStatusLookup1,
  17006                  _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17007                  _bcmFieldSliceSelDisable, 0,
  17008                  155, 1,
  17009                  1, 155);
  17010          _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  17011                  _bcmFieldQualifyExactMatchActionClassIdLookup0,
  17012                  _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17013                  _bcmFieldSliceSelDisable, 0,
  17014                  120, 12,
  17015                  12, 120);
  17016          _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  17017                  _bcmFieldQualifyExactMatchActionClassIdLookup1,
  17018                  _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17019                  _bcmFieldSliceSelDisable, 0,
  17020                  132, 12,
  17021                  12, 132);
  17022      }
  17023     /*Initailizing the offset values for below postmux qualifiers.
  17024        Appropirate offsets will be updated during
  17025        group creation depending on 80bit mode or 160bit mode*/
  17026 	/*DGLP*/
  17027     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstPort,
  17028                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17029                      _bcmFieldDevSelDisable, 0,
  17030                      _bcmFieldDevSelDisable, 0,
  17031                      _bcmFieldDevSelDisable, 0,
  17032                      0,
  17033                      0, 16,
  17034                      0, 1,
  17035                      0, 0,
  17036                      0,
  17037                      17, 0);
  17038     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstTrunk,
  17039                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17040                      _bcmFieldDevSelDisable, 0,
  17041                      _bcmFieldDevSelDisable, 0,
  17042                      _bcmFieldDevSelDisable, 0,
  17043                      0,
  17044                      0, 16,
  17045                      0, 1,
  17046                      0, 0,
  17047                      0,
  17048                      17, 0);
  17049 	/*DVP*/
  17050     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMplsGport,
  17051                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17052                      _bcmFieldDevSelDisable, 0,
  17053                      _bcmFieldDevSelDisable, 0,
  17054                      _bcmFieldDevSelDisable, 0,
  17055                      0,
  17056                      0, 16,
  17057                      0, 1,
  17058                      0, 0,
  17059                      0,
  17060                      17, 0);
  17061     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMplsGports,
  17062                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17063                      _bcmFieldDevSelDisable, 0,
  17064                      _bcmFieldDevSelDisable, 0,
  17065                      _bcmFieldDevSelDisable, 0,
  17066                      0,
  17067                      0, 16,
  17068                      0, 1,
  17069                      0, 0,
  17070                      0,
  17071                      17, 0);
  17072     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMimGport,
  17073                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17074                      _bcmFieldDevSelDisable, 0,
  17075                      _bcmFieldDevSelDisable, 0,
  17076                      _bcmFieldDevSelDisable, 0,
  17077                      0,
  17078                      0, 16,
  17079                      0, 1,
  17080                      0, 0,
  17081                      0,
  17082                      17,0);
  17083     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMimGports,
  17084                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17085                      _bcmFieldDevSelDisable, 0,
  17086                      _bcmFieldDevSelDisable, 0,
  17087                      _bcmFieldDevSelDisable, 0,
  17088                      0,
  17089                      0, 16,
  17090                      0, 1,
  17091                      0, 0,
  17092                      0,
  17093                      17, 0);
  17094     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstWlanGport,
  17095                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17096                      _bcmFieldDevSelDisable, 0,
  17097                      _bcmFieldDevSelDisable, 0,
  17098                      _bcmFieldDevSelDisable, 0,
  17099                      0,
  17100                      0, 16,
  17101                      0, 1,
  17102                      0, 0,
  17103                      0,
  17104                      17, 0);
  17105     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstWlanGports,
  17106                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17107                      _bcmFieldDevSelDisable, 0,
  17108                      _bcmFieldDevSelDisable, 0,
  17109                      _bcmFieldDevSelDisable, 0,
  17110                      0,
  17111                      0, 16,
  17112                      0, 1,
  17113                      0, 0,
  17114                      0,
  17115                      17, 0);
  17116     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstVlanGport,
  17117                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17118                      _bcmFieldDevSelDisable, 0,
  17119                      _bcmFieldDevSelDisable, 0,
  17120                      _bcmFieldDevSelDisable, 0,
  17121                      0,
  17122                      0, 16,
  17123                      0, 1,
  17124                      0, 0,
  17125                      0,
  17126                      17, 0);
  17127     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstVlanGports,
  17128                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17129                      _bcmFieldDevSelDisable, 0,
  17130                      _bcmFieldDevSelDisable, 0,
  17131                      _bcmFieldDevSelDisable, 0,
  17132                      0,
  17133                      0, 16,
  17134                      0, 1,
  17135                      0, 0,
  17136                      0,
  17137                      17, 0);
  17138     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstVxlanGport,
  17139                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17140                      _bcmFieldDevSelDisable, 0,
  17141                      _bcmFieldDevSelDisable, 0,
  17142                      _bcmFieldDevSelDisable, 0,
  17143                      0,
  17144                      0, 16,
  17145                      0, 1,
  17146                      0, 0,
  17147                      0,
  17148                      17, 0);
  17149     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstVxlanGports,
  17150                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17151                      _bcmFieldDevSelDisable, 0,
  17152                      _bcmFieldDevSelDisable, 0,
  17153                      _bcmFieldDevSelDisable, 0,
  17154                      0,
  17155                      0, 16,
  17156                      0, 1,
  17157                      0, 0,
  17158                      0,
  17159                      17, 0);
  17160     if (soc_feature(unit, soc_feature_niv)) {
  17161         _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstNivGport,
  17162                          _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17163                          _bcmFieldDevSelDisable, 0,
  17164                          _bcmFieldDevSelDisable, 0,
  17165                          _bcmFieldDevSelDisable, 0,
  17166                          0,
  17167                          0, 16,
  17168                          0, 1,
  17169                          0, 0,
  17170                          0,
  17171                          17, 0);
  17172         _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstNivGports,
  17173                          _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17174                          _bcmFieldDevSelDisable, 0,
  17175                          _bcmFieldDevSelDisable, 0,
  17176                          _bcmFieldDevSelDisable, 0,
  17177                          0,
  17178                          0, 16,
  17179                          0, 1,
  17180                          0, 0,
  17181                          0,
  17182                          17, 0);
  17183     }
  17184 	/*DVP - */
  17185     if (soc_feature(unit, soc_feature_td3_style_fp)) {
  17186         _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3EgressNextHopsUnderlay,
  17187                          _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17188                          _bcmFieldDevSelDisable, 0,
  17189                          _bcmFieldDevSelDisable, 0,
  17190                          _bcmFieldDevSelDisable, 0,
  17191                          0,
  17192                          0, 16,
  17193                          0, 1,
  17194                          0, 0,
  17195                          0,
  17196                          17, 0);
  17197         _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3EgressUnderlay,
  17198                          _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17199                          _bcmFieldDevSelDisable, 0,
  17200                          _bcmFieldDevSelDisable, 0,
  17201                          _bcmFieldDevSelDisable, 0,
  17202                          0,
  17203                          0, 16,
  17204                          0, 1,
  17205                          0, 0,
  17206                          0,
  17207                          17, 0);
  17208     }
  17209     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3EgressNextHops,
  17210                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17211                      _bcmFieldDevSelDisable, 0,
  17212                      _bcmFieldDevSelDisable, 0,
  17213                      _bcmFieldDevSelDisable, 0,
  17214                      0,
  17215                      0, 16,
  17216                      0, 1,
  17217                      0, 0,
  17218                      0,
  17219                      17, 0);
  17220     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMultipath,
  17221                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17222                      _bcmFieldDevSelDisable, 0,
  17223                      _bcmFieldDevSelDisable, 0,
  17224                      _bcmFieldDevSelDisable, 0,
  17225                      0,
  17226                      0, 16,
  17227                      0, 1,
  17228                      0, 0,
  17229                      0,
  17230                      17, 0);
  17231     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMultipathOverlay,
  17232                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17233                      _bcmFieldDevSelDisable, 0,
  17234                      _bcmFieldDevSelDisable, 0,
  17235                      _bcmFieldDevSelDisable, 0,
  17236                      0,
  17237                      0, 16,
  17238                      0, 1,
  17239                      0, 0,
  17240                      0,
  17241                      17, 0);
  17242     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMultipathUnderlay,
  17243                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17244                      _bcmFieldDevSelDisable, 0,
  17245                      _bcmFieldDevSelDisable, 0,
  17246                      _bcmFieldDevSelDisable, 0,
  17247                      0,
  17248                      0, 16,
  17249                      0, 1,
  17250                      0, 0,
  17251                      0,
  17252                      17, 0);
  17253     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3Egress,
  17254                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17255                      _bcmFieldDevSelDisable, 0,
  17256                      _bcmFieldDevSelDisable, 0,
  17257                      _bcmFieldDevSelDisable, 0,
  17258                      0,
  17259                      0, 16,
  17260                      0, 1,
  17261                      0, 0,
  17262                      0,
  17263                      17, 0);
  17264     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL3MulticastGroup,
  17265                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17266                      _bcmFieldDevSelDisable, 0,
  17267                      _bcmFieldDevSelDisable, 0,
  17268                      _bcmFieldDevSelDisable, 0,
  17269                      0,
  17270                      0, 16,
  17271                      0, 1,
  17272                      0, 0,
  17273                      0,
  17274                      17, 0);
  17275     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstL2MulticastGroup,
  17276                      _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17277                      _bcmFieldDevSelDisable, 0,
  17278                      _bcmFieldDevSelDisable, 0,
  17279                      _bcmFieldDevSelDisable, 0,
  17280                      0,
  17281                      0, 16,
  17282                      0, 1,
  17283                      0, 0,
  17284                      0,
  17285                      17, 0);
  17286 
  17287     /* L2 qualifiers - 48 bits section. */
  17288     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstMac,
  17289         0,
  17290         _bcmFieldSliceSelDisable, 0,
  17291         0, 48,
  17292         48, 0);
  17293     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMac,
  17294         0,
  17295         _bcmFieldSliceSelDisable, 0,
  17296         0, 48,
  17297         48, 0);
  17298     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2PayloadFirstEightBytes,
  17299         0,
  17300         _bcmFieldSliceSelDisable, 0,
  17301         0, 64,
  17302         64, 0);
  17303     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyISid,
  17304         0,
  17305         _bcmFieldSliceSelDisable, 0,
  17306         0, 24,
  17307         24, 0);
  17308 
  17309     /* L2 qualifiers - 16 bits section. */
  17310     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterVlan,
  17311         0,
  17312         _bcmFieldSliceSelDisable, 0,
  17313         0, 16,
  17314         16, 0);
  17315     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterVlanCfi,
  17316         0,
  17317         _bcmFieldSliceSelDisable, 0,
  17318         0, 1,
  17319         1, 0);
  17320     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterVlanPri,
  17321         0,
  17322         _bcmFieldSliceSelDisable, 0,
  17323         0, 3,
  17324         3, 0);
  17325     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterVlanId,
  17326         0,
  17327         _bcmFieldSliceSelDisable, 0,
  17328         0, 12,
  17329         12, 0);
  17330     if (soc_feature(unit, soc_feature_td3_style_fp)) {
  17331         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIncomingOuterVlanId,
  17332             0,
  17333             _bcmFieldSliceSelDisable, 0,
  17334             0, 12,
  17335             12, 0);
  17336     }
  17337     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerVlan,
  17338         0,
  17339         _bcmFieldSliceSelDisable, 0,
  17340         0, 16,
  17341         16, 0);
  17342     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerVlanCfi,
  17343         0,
  17344         _bcmFieldSliceSelDisable, 0,
  17345         0, 1,
  17346         1, 0);
  17347     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerVlanPri,
  17348         0,
  17349         _bcmFieldSliceSelDisable, 0,
  17350         0, 3,
  17351         3, 0);
  17352     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerVlanId,
  17353         0,
  17354         _bcmFieldSliceSelDisable, 0,
  17355         0, 12,
  17356         12, 0);
  17357 
  17358     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyEtherType,
  17359         0,
  17360         _bcmFieldSliceSelDisable, 0,
  17361         0, 16,
  17362         16, 0);
  17363 
  17364     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMacAddrsNormalized,
  17365         0,
  17366         _bcmFieldSliceSelDisable, 0,
  17367         0, 1,
  17368         1, 0);
  17369     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpAddrsNormalized,
  17370         0,
  17371         _bcmFieldSliceSelDisable, 0,
  17372         1, 1,
  17373         1, 1);
  17374     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2Format,
  17375         0,
  17376         _bcmFieldSliceSelDisable, 0,
  17377         0, 2,
  17378         2, 0);
  17379     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVlanFormat,
  17380         0,
  17381         _bcmFieldSliceSelDisable, 0,
  17382         0, 2,
  17383         2, 0);
  17384     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTranslatedVlanFormat,
  17385         0,
  17386         _bcmFieldSliceSelDisable, 0,
  17387         0, 2,
  17388         2, 0);
  17389     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterTpid,
  17390         0,
  17391         _bcmFieldSliceSelDisable, 0,
  17392         0, 2,
  17393         2, 0);
  17394     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerTpid,
  17395         0,
  17396         _bcmFieldSliceSelDisable, 0,
  17397         0, 2,
  17398         2, 0);
  17399 
  17400     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVlanTranslationHit,
  17401         0,
  17402         _bcmFieldSliceSelDisable, 0,
  17403         0, 3,
  17404         3, 0);
  17405     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyForwardingVlanValid,
  17406         0,
  17407         _bcmFieldSliceSelDisable, 0,
  17408         0, 1,
  17409         1, 0);
  17410     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIngressStpState,
  17411         0,
  17412         _bcmFieldSliceSelDisable, 0,
  17413         0, 2,
  17414         2, 0);
  17415     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyStpState,
  17416         0,
  17417         _bcmFieldSliceSelDisable, 0,
  17418         0, 2,
  17419         2, 0);
  17420     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2SrcHit,
  17421         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17422         _bcmFieldSliceSelDisable, 0,
  17423         0, 1,
  17424         1, 1);
  17425     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2SrcStatic,
  17426         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17427         _bcmFieldSliceSelDisable, 0,
  17428         0, 1,
  17429         1, 0);
  17430     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2DestHit,
  17431         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17432         _bcmFieldSliceSelDisable, 0,
  17433         0, 1,
  17434         1, 0);
  17435     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2CacheHit,
  17436         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17437         _bcmFieldSliceSelDisable, 0,
  17438         0, 1,
  17439         1, 0);
  17440     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3SrcHostHit,
  17441         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17442         _bcmFieldSliceSelDisable, 0,
  17443         0, 1,
  17444         1, 0);
  17445     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpmcStarGroupHit,
  17446         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17447         _bcmFieldSliceSelDisable, 0,
  17448         0, 1,
  17449         1, 0);
  17450     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3DestHostHit,
  17451         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17452         _bcmFieldSliceSelDisable, 0,
  17453         0, 1,
  17454         1, 0);
  17455     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3DestRouteHit,
  17456         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17457         _bcmFieldSliceSelDisable, 0,
  17458         0, 1,
  17459         1, 0);
  17460     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2StationMove,
  17461         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17462         _bcmFieldSliceSelDisable, 0,
  17463         0, 1,
  17464         1, 0);
  17465     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDosAttack,
  17466         0,
  17467         _bcmFieldSliceSelDisable, 0,
  17468         0, 1,
  17469         1, 0);
  17470     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpTunnelHit,
  17471         0,
  17472         _bcmFieldSliceSelDisable, 0,
  17473         0, 1,
  17474         1, 0);
  17475     /* NV GRE */
  17476     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2GreVsid,
  17477         0,
  17478         _bcmFieldSliceSelDisable, 0,
  17479         0, 24,
  17480         24, 0);
  17481 
  17482     /* MPLS */
  17483     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelAction,
  17484         0,
  17485         _bcmFieldSliceSelDisable, 0,
  17486         0, 3,
  17487         3, 0);
  17488     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabel,
  17489         0,
  17490         _bcmFieldSliceSelDisable, 0,
  17491         0, 32,
  17492         32, 0);
  17493     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelId,
  17494         0,
  17495         _bcmFieldSliceSelDisable, 0,
  17496         0, 20,
  17497         20, 0);
  17498     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelExp,
  17499         0,
  17500         _bcmFieldSliceSelDisable, 0,
  17501         0, 3,
  17502         3, 0);
  17503     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelBos,
  17504         0,
  17505         _bcmFieldSliceSelDisable, 0,
  17506         0, 1,
  17507         1, 0);
  17508     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsForwardingLabelTtl,
  17509         0,
  17510         _bcmFieldSliceSelDisable, 0,
  17511         0, 8,
  17512         8, 0);
  17513     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsControlWord,
  17514         0,
  17515         _bcmFieldSliceSelDisable, 0,
  17516         0, 32,
  17517         32, 0);
  17518     /* L2 Payload for non-IP Packets */
  17519     _FP_QUAL_EXT_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2PayLoad,
  17520         0,
  17521         _bcmFieldDevSelDisable, 0,
  17522         _bcmFieldDevSelDisable, 0,
  17523         _bcmFieldDevSelDisable, 0,
  17524         0,
  17525         0, 128,
  17526         128, 128,
  17527         0, 0,
  17528         0,
  17529         256, 0);
  17530     /* L3 IPv6 qualifiers - 128 bits section. */
  17531     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6,
  17532         0,
  17533         _bcmFieldSliceSelDisable, 0,
  17534         0, 128,
  17535         128, 0);
  17536     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6,
  17537         0,
  17538         _bcmFieldSliceSelDisable, 0,
  17539         0, 128,
  17540         128, 0);
  17541     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6High,
  17542         0,
  17543         _bcmFieldSliceSelDisable, 0,
  17544         0, 64,
  17545         64, 0);
  17546     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6Low,
  17547         0,
  17548         _bcmFieldSliceSelDisable, 0,
  17549         0, 64,
  17550         64, 0);
  17551     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6High,
  17552         0,
  17553         _bcmFieldSliceSelDisable, 0,
  17554         0, 64,
  17555         64, 0);
  17556     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6Low,
  17557         0,
  17558         _bcmFieldSliceSelDisable, 0,
  17559         0, 64,
  17560         64, 0);
  17561     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExtensionHeader2Type,
  17562         0,
  17563         _bcmFieldSliceSelDisable, 0,
  17564         0, 8,
  17565         8, 0);
  17566     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExtensionHeaderType,
  17567         0,
  17568         _bcmFieldSliceSelDisable, 0,
  17569         0, 8,
  17570         8, 0);
  17571     if (!soc_feature(unit, soc_feature_td3_style_fp)) {
  17572         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyExtensionHeaderSubCode,
  17573             0,
  17574             _bcmFieldSliceSelDisable, 0,
  17575             0, 8,
  17576             8, 0);
  17577     }
  17578     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIp6FlowLabel,
  17579         0,
  17580         _bcmFieldSliceSelDisable, 0,
  17581         0, 20,
  17582         20, 0);
  17583 
  17584     /* L3 IPv4 qualifiers - 32 bits section. */
  17585     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp,
  17586         0,
  17587         _bcmFieldSliceSelDisable, 0,
  17588         0, 32,
  17589         32, 0);
  17590 
  17591     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp,
  17592         0,
  17593         _bcmFieldSliceSelDisable, 0,
  17594         0, 32,
  17595         32, 0);
  17596 
  17597     /* L3 IPv4 qualifiers - 16 bits section. */
  17598     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4DstPort,
  17599         0,
  17600         _bcmFieldSliceSelDisable, 0,
  17601         0, 16,
  17602         16, 0);
  17603     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4SrcPort,
  17604         0,
  17605         _bcmFieldSliceSelDisable, 0,
  17606         0, 16,
  17607         16, 0);
  17608     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIcmpTypeCode,
  17609         0,
  17610         _bcmFieldSliceSelDisable, 0,
  17611         0, 16,
  17612         16, 0);
  17613 
  17614     /* L3 IPv4 qualifiers - 8 bits section. */
  17615     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpProtocol,
  17616         0,
  17617         _bcmFieldSliceSelDisable, 0,
  17618         0, 8,
  17619         8, 0);
  17620     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTtl,
  17621         0,
  17622         _bcmFieldSliceSelDisable, 0,
  17623         0, 8,
  17624         8, 0);
  17625     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTos,
  17626         0,
  17627         _bcmFieldSliceSelDisable, 0,
  17628         0, 8,
  17629         8, 0);
  17630     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTcpControl,
  17631         0,
  17632         _bcmFieldSliceSelDisable, 0,
  17633         0, 8,
  17634         8, 0);
  17635     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpType,
  17636         0,
  17637         _bcmFieldSliceSelDisable, 0,
  17638         0, 5,
  17639         5, 0);
  17640     /* L3 qualifiers - 1 bit section. */
  17641     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRepCopy,
  17642         0,
  17643         _bcmFieldSliceSelDisable, 0,
  17644         0, 1,
  17645         1, 0);
  17646     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIcmpError,
  17647         0,
  17648         _bcmFieldSliceSelDisable, 0,
  17649         0, 1,
  17650         1, 0);
  17651     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpLocal,
  17652         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17653         _bcmFieldSliceSelDisable, 0,
  17654         0, 1,
  17655         1, 0);
  17656     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpFlags,
  17657         0,
  17658         _bcmFieldSliceSelDisable, 0,
  17659         0, 2,
  17660         2, 0);
  17661     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpFrag,
  17662         0,
  17663         _bcmFieldSliceSelDisable, 0,
  17664         0, 2,
  17665         2, 0);
  17666     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpFragNonOrFirst,
  17667         0,
  17668         _bcmFieldSliceSelDisable, 0,
  17669         0, 1,
  17670         1, 0);
  17671     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyColor,
  17672         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17673         _bcmFieldSliceSelDisable, 0,
  17674         0, 2,
  17675         2, 0);
  17676     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  17677         bcmFieldQualifyGenericAssociatedChannelLabelValid,
  17678         0,
  17679         _bcmFieldSliceSelDisable, 0,
  17680         0, 1,
  17681         1, 0);
  17682     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  17683         bcmFieldQualifyRouterAlertLabelValid,
  17684         0,
  17685         _bcmFieldSliceSelDisable, 0,
  17686         0, 1,
  17687         1, 0);
  17688     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsControlWordValid,
  17689         0,
  17690         _bcmFieldSliceSelDisable, 0,
  17691         0, 1,
  17692         1, 0);
  17693     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpInfo,
  17694         0,
  17695         _bcmFieldSliceSelDisable, 0,
  17696         0, 1,
  17697         1, 0);
  17698 #if defined(BCM_TOMAHAWK2_SUPPORT)
  17699     if (SOC_IS_TOMAHAWK2(unit)) {
  17700         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRecoverableDrop,
  17701              0,
  17702              _bcmFieldSliceSelDisable, 0,
  17703              0, 1,
  17704              1, 0);
  17705     }
  17706 #endif /* BCM_TOMAHAWK2_SUPPORT */
  17707 
  17708     /* Switch - Port and Interface qualifiers. */
  17709     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInPort,
  17710         0,
  17711         _bcmFieldSliceSelDisable, 0,
  17712         0, 8,
  17713         8, 0);
  17714     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVpn,
  17715         0,
  17716         _bcmFieldSliceSelDisable, 0,
  17717         0, SOC_IS_HELIX5(unit) ? 12 : 13,
  17718         SOC_IS_HELIX5(unit) ? 12 : 13, 0);
  17719     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVrf,
  17720         0,
  17721         _bcmFieldSliceSelDisable, 0,
  17722         0, 11,
  17723         11, 0);
  17724 
  17725     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassPort,
  17726         0,
  17727         _bcmFieldSliceSelDisable, 0,
  17728         0, 12,
  17729         12, 0);
  17730     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassL3,
  17731         0,
  17732         _bcmFieldSliceSelDisable, 0,
  17733         0, 12,
  17734         12, 0);
  17735     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassVPort,
  17736         0,
  17737         _bcmFieldSliceSelDisable, 0,
  17738         0, 12,
  17739         12, 0);
  17740     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassL2,
  17741         0,
  17742         _bcmFieldSliceSelDisable, 0,
  17743         0, 12,
  17744         12, 0);
  17745     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstClassField,
  17746         0,
  17747         _bcmFieldSliceSelDisable, 0,
  17748         0, 10,
  17749         10, 0);
  17750     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcClassField,
  17751         0,
  17752         _bcmFieldSliceSelDisable, 0,
  17753         0, 10,
  17754         10, 0);
  17755     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVlanTranslateClassId,
  17756         0,
  17757         _bcmFieldSliceSelDisable, 0,
  17758         0, 12,
  17759         12, 0);
  17760     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassMplsLookup1,
  17761         0,
  17762         _bcmFieldSliceSelDisable, 0,
  17763         0, 12,
  17764         12, 0);
  17765     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassMplsLookup2,
  17766         0,
  17767         _bcmFieldSliceSelDisable, 0,
  17768         0, 12,
  17769         12, 0);
  17770     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceClassL3Tunnel,
  17771         0,
  17772         _bcmFieldSliceSelDisable, 0,
  17773         0, 12,
  17774         12, 0);
  17775     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyCosMapSelect,
  17776         0,
  17777         _bcmFieldSliceSelDisable, 0,
  17778         0, 1,
  17779         1, 0);
  17780     if (soc_feature(unit, soc_feature_td3_style_fp)) {
  17781         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOpaqueObject4,
  17782             0,
  17783             _bcmFieldSliceSelDisable, 0,
  17784             0, 16,
  17785             16, 0);
  17786         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOpaqueObject3,
  17787             0,
  17788             _bcmFieldSliceSelDisable, 0,
  17789             0, 16,
  17790             16, 0);
  17791         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOpaqueObject2,
  17792             0,
  17793             _bcmFieldSliceSelDisable, 0,
  17794             0, 16,
  17795             16, 0);
  17796         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOpaqueObject1,
  17797             0,
  17798             _bcmFieldSliceSelDisable, 0,
  17799             0, 16,
  17800             16, 0);
  17801     }
  17802     if (soc_feature(unit, soc_feature_flex_flowtracker_ver_1)) {
  17803         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerLearn,
  17804             0,
  17805             _bcmFieldSliceSelDisable, 0,
  17806             0, 1,
  17807             1, 0);
  17808         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerGroupId,
  17809             0,
  17810             _bcmFieldSliceSelDisable, 0,
  17811             0, 16,
  17812             16, 0);
  17813         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerClassId,
  17814             0,
  17815             _bcmFieldSliceSelDisable, 0,
  17816             0, 16,
  17817             16, 0);
  17818         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerGroupValid,
  17819             0,
  17820             _bcmFieldSliceSelDisable, 0,
  17821             0, 1,
  17822             1, 0);
  17823         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerDisabled,
  17824             0,
  17825             _bcmFieldSliceSelDisable, 0,
  17826             0, 1,
  17827             1, 0);
  17828         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerCheck,
  17829             0,
  17830             _bcmFieldSliceSelDisable, 0,
  17831             0, 8,
  17832             8, 0);
  17833         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerCollectorCopy,
  17834             0,
  17835             _bcmFieldSliceSelDisable, 0,
  17836             0, 1,
  17837             1, 0);
  17838         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerMeteringExceeded,
  17839             0,
  17840             _bcmFieldSliceSelDisable, 0,
  17841             0, 1,
  17842             1, 0);
  17843         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerFlowTableFull,
  17844             0,
  17845             _bcmFieldSliceSelDisable, 0,
  17846             0, 1,
  17847             1, 0);
  17848         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerGroupFlowExceeded,
  17849             0,
  17850             _bcmFieldSliceSelDisable, 0,
  17851             0, 1,
  17852             1, 0);
  17853         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFlowtrackerExportQueueFull,
  17854             0,
  17855             _bcmFieldSliceSelDisable, 0,
  17856             0, 1,
  17857             1, 0);
  17858     }
  17859     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceLookupClassPort,
  17860         0,
  17861         _bcmFieldSliceSelDisable, 0,
  17862         0, 8,
  17863         8, 0);
  17864     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInterfaceIngressKeySelectClassPort,
  17865         0,
  17866         _bcmFieldSliceSelDisable, 0,
  17867         0, 8,
  17868         8, 0);
  17869     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyUdfClass,
  17870         0,
  17871         _bcmFieldSliceSelDisable, 0,
  17872         0, 8,
  17873         8, 0);
  17874     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGroupClass,
  17875         0,
  17876         _bcmFieldSliceSelDisable, 0,
  17877         0, 2,
  17878         2, 0);
  17879 	/*SGPP*/
  17880 #ifdef BCM_TOMAHAWK3_SUPPORT
  17881     if (soc_feature(unit, soc_feature_th3_style_fp)) {
  17882         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcPort,
  17883             0,
  17884             _bcmFieldSliceSelDisable, 0,
  17885             0, 9,
  17886             9, 0);
  17887     } else
  17888 #endif
  17889     {
  17890         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcPort,
  17891             0,
  17892             _bcmFieldSliceSelDisable, 0,
  17893             0, 16,
  17894             16, 0);
  17895     }
  17896 
  17897     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcModPortGport,
  17898         0,
  17899         _bcmFieldSliceSelDisable, 0,
  17900         0, 16,
  17901         16, 0);
  17902     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcModPortGports,
  17903         0,
  17904         _bcmFieldSliceSelDisable, 0,
  17905         0, 16,
  17906         16, 0);
  17907     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcModuleGport,
  17908         0,
  17909         _bcmFieldSliceSelDisable, 0,
  17910         0, 9,
  17911         9, 0);
  17912     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcTrunkMemberGport,
  17913         0,
  17914         _bcmFieldSliceSelDisable, 0,
  17915         0, 16,
  17916         16, 0);
  17917 	/*SGLP*/
  17918     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcTrunk,
  17919         0,
  17920         _bcmFieldSliceSelDisable, 0,
  17921         0, 16,
  17922         16, 0);
  17923 	/*SVP*/
  17924     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMplsGport,
  17925         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17926         _bcmFieldSliceSelDisable, 0,
  17927         0, 16,
  17928         16, 0);
  17929     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMplsGports,
  17930         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  17931         _bcmFieldSliceSelDisable, 0,
  17932         0, 16,
  17933         16, 0);
  17934     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMimGport,
  17935         0,
  17936         _bcmFieldSliceSelDisable, 0,
  17937         0, 16,
  17938         16, 0);
  17939     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcMimGports,
  17940         0,
  17941         _bcmFieldSliceSelDisable, 0,
  17942         0, 16,
  17943         16, 0);
  17944     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcWlanGport,
  17945         0,
  17946         _bcmFieldSliceSelDisable, 0,
  17947         0, 16,
  17948         16, 0);
  17949     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcWlanGports,
  17950         0,
  17951         _bcmFieldSliceSelDisable, 0,
  17952         0, 16,
  17953         16, 0);
  17954     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVlanGport,
  17955         0,
  17956         _bcmFieldSliceSelDisable, 0,
  17957         0, 16,
  17958         16, 0);
  17959     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVlanGports,
  17960         0,
  17961         _bcmFieldSliceSelDisable, 0,
  17962         0, 16,
  17963         16, 0);
  17964     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVxlanGport,
  17965         0,
  17966         _bcmFieldSliceSelDisable, 0,
  17967         0, 16,
  17968         16, 0);
  17969     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVxlanGports,
  17970         0,
  17971         _bcmFieldSliceSelDisable, 0,
  17972         0, 16,
  17973         16, 0);
  17974     if (soc_feature(unit, soc_feature_niv)) {
  17975         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcNivGport,
  17976             0,
  17977             _bcmFieldSliceSelDisable, 0,
  17978             0, 16,
  17979             16, 0);
  17980         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcNivGports,
  17981             0,
  17982             _bcmFieldSliceSelDisable, 0,
  17983             0, 16,
  17984             16, 0);
  17985     }
  17986 	/*SVP - */
  17987     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcClassL2,
  17988         0,
  17989         _bcmFieldSliceSelDisable, 0,
  17990         0, 10,
  17991         10, 0);
  17992     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstClassL2,
  17993         0,
  17994         _bcmFieldSliceSelDisable, 0,
  17995         0, 10,
  17996         10, 0);
  17997     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcClassL3,
  17998         0,
  17999         _bcmFieldSliceSelDisable, 0,
  18000         0, 10,
  18001         10, 0);
  18002     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstClassL3,
  18003         0,
  18004         _bcmFieldSliceSelDisable, 0,
  18005         0, 10,
  18006         10, 0);
  18007     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcVirtualPortValid,
  18008         0,
  18009         _bcmFieldSliceSelDisable, 0,
  18010         0, 1,
  18011         1, 0);
  18012     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDestVirtualPortValid,
  18013         0,
  18014         _bcmFieldSliceSelDisable, 0,
  18015         0, 1,
  18016         1, 0);
  18017 
  18018     /* Meta data qualifiers. */
  18019     /* L3_IIF table size is 8192. */
  18020     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyForwardingVlanId,
  18021         0,
  18022         _bcmFieldSliceSelDisable, 0,
  18023         0, 12,
  18024         12, 0);
  18025     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3Ingress,
  18026         0,
  18027         _bcmFieldSliceSelDisable, 0,
  18028         0, 13,
  18029         13, 0);
  18030     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRangeCheck,
  18031         0,
  18032         _bcmFieldSliceSelDisable, 0,
  18033         0, 32,
  18034         32, 0);
  18035     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyPacketRes,
  18036         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  18037         _bcmFieldSliceSelDisable, 0,
  18038         0, 6,
  18039         6, 0);
  18040     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyPacketLength,
  18041         0,
  18042         _bcmFieldSliceSelDisable, 0,
  18043         0, 16,
  18044         16, 0);
  18045     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTunnelType,
  18046         0,
  18047         _bcmFieldSliceSelDisable, 0,
  18048         0, 5,
  18049         5, 0);
  18050     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyLoopbackType,
  18051         0,
  18052         _bcmFieldSliceSelDisable, 0,
  18053         0, 5,
  18054         5, 0);
  18055     if (!soc_feature(unit, soc_feature_td3_style_fp)) {
  18056         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyLoopback,
  18057             0,
  18058             _bcmFieldSliceSelDisable, 0,
  18059             0, 1,
  18060             1, 0);
  18061     }
  18062     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsLabel1Hit,
  18063         0,
  18064         _bcmFieldSliceSelDisable, 0,
  18065         0, 1,
  18066         1, 0);
  18067     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTrillEgressRbridgeHit,
  18068         0,
  18069         _bcmFieldSliceSelDisable, 0,
  18070         0, 1,
  18071         1, 0);
  18072     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2GreSrcIpHit,
  18073         0,
  18074         _bcmFieldSliceSelDisable, 0,
  18075         0, 1,
  18076         1, 0);
  18077     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMimSrcGportHit,
  18078         0,
  18079         _bcmFieldSliceSelDisable, 0,
  18080         0, 1,
  18081         1, 0);
  18082     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsLabel2Hit,
  18083         0,
  18084         _bcmFieldSliceSelDisable, 0,
  18085         0, 1,
  18086         1, 0);
  18087     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTrillIngressRbridgeHit,
  18088         0,
  18089         _bcmFieldSliceSelDisable, 0,
  18090         0, 1,
  18091         1, 0);
  18092     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2GreVfiHit,
  18093         0,
  18094         _bcmFieldSliceSelDisable, 0,
  18095         0, 1,
  18096         1, 0);
  18097     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMimVfiHit,
  18098         0,
  18099         _bcmFieldSliceSelDisable, 0,
  18100         0, 1,
  18101         1, 0);
  18102     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsTerminated,
  18103         0,
  18104         _bcmFieldSliceSelDisable, 0,
  18105         0, 1,
  18106         1, 0);
  18107     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyForwardingType,
  18108         0,
  18109         _bcmFieldSliceSelDisable, 0,
  18110         0, 4,
  18111         4, 0);
  18112     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPriority,
  18113         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  18114         _bcmFieldSliceSelDisable, 0,
  18115         0, 4,
  18116         4, 0);
  18117     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMHOpcode,
  18118         _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  18119         _bcmFieldSliceSelDisable, 0,
  18120         0, 3,
  18121         3, 0);
  18122     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGigProxy,
  18123         0,
  18124         _bcmFieldSliceSelDisable, 0,
  18125         0, 1,
  18126         1, 0);
  18127     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyCpuVisibilityPacket,
  18128         0,
  18129         _bcmFieldSliceSelDisable, 0,
  18130         0, 1,
  18131         1, 0);
  18132     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4Ports,
  18133         0,
  18134         _bcmFieldSliceSelDisable, 0,
  18135         0, 1,
  18136         1, 0);
  18137     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMirrorCopy,
  18138         0,
  18139         _bcmFieldSliceSelDisable, 0,
  18140         0, 1,
  18141         1, 0);
  18142     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGig,
  18143         0,
  18144         _bcmFieldSliceSelDisable, 0,
  18145         0, 1,
  18146         1, 0);
  18147     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntCongestionNotification,
  18148         0,
  18149         _bcmFieldSliceSelDisable, 0,
  18150         0, 2,
  18151         2, 0);
  18152     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3Routable,
  18153         0,
  18154         _bcmFieldSliceSelDisable, 0,
  18155         0, 1,
  18156         1, 0);
  18157     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMyStationHit,
  18158         0,
  18159         _bcmFieldSliceSelDisable, 0,
  18160         0, 1,
  18161         1, 0);
  18162     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRtag7AHashUpper,
  18163         0,
  18164         _bcmFieldSliceSelDisable, 0,
  18165         0, 16,
  18166         16, 0);
  18167     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRtag7AHashLower,
  18168         0,
  18169         _bcmFieldSliceSelDisable, 0,
  18170         0, 16,
  18171         16, 0);
  18172     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRtag7BHashUpper,
  18173         0,
  18174         _bcmFieldSliceSelDisable, 0,
  18175         0, 16,
  18176         16, 0);
  18177     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRtag7BHashLower,
  18178         0,
  18179         _bcmFieldSliceSelDisable, 0,
  18180         0, 16,
  18181         16, 0);
  18182 
  18183     /* VXLAN qualifiers. */
  18184     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanNetworkId,
  18185         0,
  18186         _bcmFieldSliceSelDisable, 0,
  18187         0, 24,
  18188         24, 0);
  18189     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanFlags,
  18190         0,
  18191         _bcmFieldSliceSelDisable, 0,
  18192         0, 8,
  18193         8, 0);
  18194     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanHeaderBits8_31,
  18195         0,
  18196         _bcmFieldSliceSelDisable, 0,
  18197         0, 24,
  18198         24, 0);
  18199     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanHeaderBits56_63,
  18200         0,
  18201         _bcmFieldSliceSelDisable, 0,
  18202         0, 8,
  18203         8, 0);
  18204     if (soc_feature(unit, soc_feature_niv)) {
  18205         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVnTag,
  18206             0,
  18207             _bcmFieldSliceSelDisable, 0,
  18208             0, 32,
  18209             32, 0);
  18210     }
  18211     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyETag,
  18212         0,
  18213         _bcmFieldSliceSelDisable, 0,
  18214         0, 32,
  18215         32, 0);
  18216     if (soc_feature(unit, soc_feature_CnTag)) {
  18217         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyCnTag,
  18218                 0,
  18219                 _bcmFieldSliceSelDisable, 0,
  18220                 0, 32,
  18221                 32, 0);
  18222     }
  18223     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRangeCheckGroup,
  18224         0,
  18225         _bcmFieldSliceSelDisable, 0,
  18226         0, 8,
  18227         8, 0);
  18228     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFabricQueueTag,
  18229         0,
  18230         _bcmFieldSliceSelDisable, 0,
  18231         0, 32,
  18232         32, 0);
  18233     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyBfdYourDiscriminator,
  18234         0,
  18235         _bcmFieldSliceSelDisable, 0,
  18236         0, 32,
  18237         32, 0);
  18238 
  18239     /* Class Qualifiers */
  18240     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeRxID,
  18241             0,
  18242             _bcmFieldSliceSelDisable, 0,
  18243             0, 16,
  18244             16, 0);
  18245     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeOxID,
  18246             0,
  18247             _bcmFieldSliceSelDisable, 0,
  18248             0, 16,
  18249             16, 0);
  18250     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4DstPortClass,
  18251             0,
  18252             _bcmFieldSliceSelDisable, 0,
  18253             0, 4,
  18254             4, 0);
  18255     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeRxIDClass,
  18256             0,
  18257             _bcmFieldSliceSelDisable, 0,
  18258             0, 4,
  18259             4, 0);
  18260     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL4SrcPortClass,
  18261             0,
  18262             _bcmFieldSliceSelDisable, 0,
  18263             0, 4,
  18264             4, 0);
  18265     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeOxIDClass,
  18266             0,
  18267             _bcmFieldSliceSelDisable, 0,
  18268             0, 4,
  18269             4, 0);
  18270     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyEtherTypeClass,
  18271             0,
  18272             _bcmFieldSliceSelDisable, 0,
  18273             0, 4,
  18274             4, 0);
  18275     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpProtocolClass,
  18276             0,
  18277             _bcmFieldSliceSelDisable, 0,
  18278             0, 4,
  18279             4, 0);
  18280     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIpClassMsbNibble,
  18281             0,
  18282             _bcmFieldSliceSelDisable, 0,
  18283             0, 4,
  18284             4, 0);
  18285     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6ClassMsbNibble,
  18286             0,
  18287             _bcmFieldSliceSelDisable, 0,
  18288             0, 4,
  18289             4, 0);
  18290     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanSrcIdClassMsbNibble,
  18291             0,
  18292             _bcmFieldSliceSelDisable, 0,
  18293             0, 4,
  18294             4, 0);
  18295     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpClassMsbNibble,
  18296             0,
  18297             _bcmFieldSliceSelDisable, 0,
  18298             0, 4,
  18299             4, 0);
  18300     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6ClassMsbNibble,
  18301             0,
  18302             _bcmFieldSliceSelDisable, 0,
  18303             0, 4,
  18304             4, 0);
  18305     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDstIdClassMsbNibble,
  18306             0,
  18307             _bcmFieldSliceSelDisable, 0,
  18308             0, 4,
  18309             4, 0);
  18310     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpClassLower,
  18311             0,
  18312             _bcmFieldSliceSelDisable, 0,
  18313             0, 16,
  18314             16, 0);
  18315     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6ClassLower,
  18316             0,
  18317             _bcmFieldSliceSelDisable, 0,
  18318             0, 16,
  18319             16, 0);
  18320     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDstIdClassLower,
  18321             0,
  18322             _bcmFieldSliceSelDisable, 0,
  18323             0, 16,
  18324             16, 0);
  18325     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpClassUpper,
  18326             0,
  18327             _bcmFieldSliceSelDisable, 0,
  18328             0, 16,
  18329             16, 0);
  18330     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6ClassUpper,
  18331             0,
  18332             _bcmFieldSliceSelDisable, 0,
  18333             0, 16,
  18334             16, 0);
  18335     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDstIdClassUpper,
  18336             0,
  18337             _bcmFieldSliceSelDisable, 0,
  18338             0, 16,
  18339             16, 0);
  18340     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIpClassLower,
  18341             0,
  18342             _bcmFieldSliceSelDisable, 0,
  18343             0, 16,
  18344             16, 0);
  18345     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6ClassLower,
  18346             0,
  18347             _bcmFieldSliceSelDisable, 0,
  18348             0, 16,
  18349             16, 0);
  18350     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanSrcIdClassLower,
  18351             0,
  18352             _bcmFieldSliceSelDisable, 0,
  18353             0, 16,
  18354             16, 0);
  18355     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIpClassUpper,
  18356             0,
  18357             _bcmFieldSliceSelDisable, 0,
  18358             0, 16,
  18359             16, 0);
  18360     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6ClassUpper,
  18361             0,
  18362             _bcmFieldSliceSelDisable, 0,
  18363             0, 16,
  18364             16, 0);
  18365     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanSrcIdClassUpper,
  18366             0,
  18367             _bcmFieldSliceSelDisable, 0,
  18368             0, 16,
  18369             16, 0);
  18370     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIpClass,
  18371             0,
  18372             _bcmFieldSliceSelDisable, 0,
  18373             0, 36,
  18374             36, 0);
  18375     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySrcIp6Class,
  18376             0,
  18377             _bcmFieldSliceSelDisable, 0,
  18378             0, 36,
  18379             36, 0);
  18380     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanSrcIdClass,
  18381             0,
  18382             _bcmFieldSliceSelDisable, 0,
  18383             0, 36,
  18384             36, 0);
  18385     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIpClass,
  18386             0,
  18387             _bcmFieldSliceSelDisable, 0,
  18388             0, 36,
  18389             36, 0);
  18390     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyDstIp6Class,
  18391             0,
  18392             _bcmFieldSliceSelDisable, 0,
  18393             0, 36,
  18394             36, 0);
  18395     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDstIdClass,
  18396             0,
  18397             _bcmFieldSliceSelDisable, 0,
  18398             0, 36,
  18399             36, 0);
  18400     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTcpClassZero,
  18401             0,
  18402             _bcmFieldSliceSelDisable, 0,
  18403             0, 8,
  18404             8, 0);
  18405     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTosClassZero,
  18406             0,
  18407             _bcmFieldSliceSelDisable, 0,
  18408             0, 8,
  18409             8, 0);
  18410     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTtlClassZero,
  18411             0,
  18412             _bcmFieldSliceSelDisable, 0,
  18413             0, 8,
  18414             8, 0);
  18415     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTcpClassOne,
  18416             0,
  18417             _bcmFieldSliceSelDisable, 0,
  18418             0, 8,
  18419             8, 0);
  18420     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTosClassOne,
  18421             0,
  18422             _bcmFieldSliceSelDisable, 0,
  18423             0, 8,
  18424             8, 0);
  18425     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTtlClassOne,
  18426             0,
  18427             _bcmFieldSliceSelDisable, 0,
  18428             0, 8,
  18429             8, 0);
  18430 
  18431     /* UDF1 and UDF2 qualifiers. */
  18432 
  18433     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData0,
  18434         0,
  18435         _bcmFieldSliceSelDisable, 0,
  18436         0, 16,
  18437         16, 0);
  18438     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData1,
  18439         0,
  18440         _bcmFieldSliceSelDisable, 0,
  18441         0, 16,
  18442         16, 0);
  18443     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData2,
  18444         0,
  18445         _bcmFieldSliceSelDisable, 0,
  18446         0, 16,
  18447         16, 0);
  18448     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData3,
  18449         0,
  18450         _bcmFieldSliceSelDisable, 0,
  18451         0, 16,
  18452         16, 0);
  18453     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData4,
  18454         0,
  18455         _bcmFieldSliceSelDisable, 0,
  18456         0, 16,
  18457         16, 0);
  18458     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData5,
  18459         0,
  18460         _bcmFieldSliceSelDisable, 0,
  18461         0, 16,
  18462         16, 0);
  18463     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData6,
  18464         0,
  18465         _bcmFieldSliceSelDisable, 0,
  18466         0, 16,
  18467         16, 0);
  18468     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData7,
  18469         0,
  18470         _bcmFieldSliceSelDisable, 0,
  18471         0, 16,
  18472         16, 0);
  18473     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData8,
  18474         0,
  18475         _bcmFieldSliceSelDisable, 0,
  18476         0, 16,
  18477         16, 0);
  18478     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData9,
  18479         0,
  18480         _bcmFieldSliceSelDisable, 0,
  18481         0, 16,
  18482         16, 0);
  18483     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData10,
  18484         0,
  18485         _bcmFieldSliceSelDisable, 0,
  18486         0, 16,
  18487         16, 0);
  18488     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData11,
  18489         0,
  18490         _bcmFieldSliceSelDisable, 0,
  18491         0, 16,
  18492         16, 0);
  18493     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData12,
  18494         0,
  18495         _bcmFieldSliceSelDisable, 0,
  18496         0, 16,
  18497         16, 0);
  18498     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData13,
  18499         0,
  18500         _bcmFieldSliceSelDisable, 0,
  18501         0, 16,
  18502         16, 0);
  18503     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData14,
  18504         0,
  18505         _bcmFieldSliceSelDisable, 0,
  18506         0, 16,
  18507         16, 0);
  18508     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyData15,
  18509         0,
  18510         _bcmFieldSliceSelDisable, 0,
  18511         0, 16,
  18512         16, 0);
  18513 
  18514     /* FCoE  qualifiers */
  18515     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  18516         bcmFieldQualifyFibreChanSrcId,
  18517         0,
  18518         _bcmFieldSliceSelDisable, 0,
  18519         0, 24,
  18520         24, 0);
  18521     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  18522         bcmFieldQualifyFibreChanFCtl,
  18523         0,
  18524         _bcmFieldSliceSelDisable, 0,
  18525         0, 24,
  18526         24, 0);
  18527     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFcoeSOF,
  18528         0,
  18529         _bcmFieldSliceSelDisable, 0,
  18530         0, 8,
  18531         8, 0);
  18532     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  18533         bcmFieldQualifyFibreChanDstId,
  18534         0,
  18535         _bcmFieldSliceSelDisable, 0,
  18536         0, 24,
  18537         24, 0);
  18538     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanRCtl,
  18539         0,
  18540         _bcmFieldSliceSelDisable, 0,
  18541         0, 8,
  18542         8, 0);
  18543     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanCSCtl,
  18544         0,
  18545         _bcmFieldSliceSelDisable, 0,
  18546         0, 8,
  18547         8, 0);
  18548     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanVFTHopCount,
  18549         0,
  18550         _bcmFieldSliceSelDisable, 0,
  18551         0, 8,
  18552         8, 0);
  18553     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  18554         bcmFieldQualifyFibreChanVFTPri,
  18555         0,
  18556         _bcmFieldSliceSelDisable, 0,
  18557         0, 3,
  18558         3, 0);
  18559     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanVFTFabricId,
  18560         0,
  18561         _bcmFieldSliceSelDisable, 0,
  18562         0, 12,
  18563         12, 0);
  18564     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanType,
  18565         0,
  18566         _bcmFieldSliceSelDisable, 0,
  18567         0, 8,
  18568         8, 0);
  18569     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanDFCtl,
  18570         0,
  18571         _bcmFieldSliceSelDisable, 0,
  18572         0, 8,
  18573         8, 0);
  18574     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanOuter,
  18575         0,
  18576         _bcmFieldSliceSelDisable, 0,
  18577         0, 3,
  18578         3, 0);
  18579     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  18580         bcmFieldQualifyFibreChanInner,
  18581         0,
  18582         _bcmFieldSliceSelDisable, 0,
  18583         0, 3,
  18584         3, 0);
  18585 
  18586 #if defined(BCM_TOMAHAWK3_SUPPORT)
  18587     if (soc_feature(unit, soc_feature_th3_style_fp)) {
  18588         /* Exact Match Chaining Qualifier */
  18589         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  18590                 _bcmFieldQualifyExactMatchGroupClassIdLookup0,
  18591                 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  18592                 _bcmFieldSliceSelDisable, 0,
  18593                 0, 4,
  18594                 4, 0);
  18595     } else
  18596 #endif
  18597     {
  18598         /* Exact Match Chaining Qualifier */
  18599         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  18600                 _bcmFieldQualifyExactMatchGroupClassIdLookup0,
  18601                 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  18602                 _bcmFieldSliceSelDisable, 0,
  18603                 0, 5,
  18604                 5, 0);
  18605         _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc,
  18606                 _bcmFieldQualifyExactMatchGroupClassIdLookup1,
  18607                 _BCM_FIELD_QUAL_OFFSET_NO_EM_SUPPORT,
  18608                 _bcmFieldSliceSelDisable, 0,
  18609                 0, 5,
  18610                 5, 0);
  18611     }
  18612 
  18613     /* Preselector Logical Table ID Qualifier */
  18614     _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyPreLogicalTableId,
  18615         0,
  18616         _bcmFieldSliceSelDisable, 0,
  18617         0, 5,
  18618         5, 0);
  18619     if (soc_feature(unit, soc_feature_fp_ltid_match_all_parts) &&
  18620         (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS)) {
  18621        _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyPreLogicalTableId1,
  18622            0,
  18623            _bcmFieldSliceSelDisable, 0,
  18624            0, 5,
  18625            5, 0);
  18626        _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyPreLogicalTableId2,
  18627            0,
  18628            _bcmFieldSliceSelDisable, 0,
  18629            0, 5,
  18630            5, 0);
  18631     }
  18632 #if defined (BCM_TRIDENT3_SUPPORT)
  18633     if (soc_feature(unit, soc_feature_td3_style_fp)) {
  18634       /* PARSER_1_FLEX_HVE_CHECK_RESULT_15_0 (49) */
  18635       /* BIT 0 */
  18636       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpFragPkt,
  18637             0,
  18638             _bcmFieldSliceSelDisable, 0,
  18639             0, 1,
  18640             1, 0);
  18641       /* BIT 1 */
  18642       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOuterPriTaggedPkt,
  18643             0,
  18644             _bcmFieldSliceSelDisable, 0,
  18645             0, 1,
  18646             1, 0);
  18647       /* BIT 2 */
  18648       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpInIpPkt,
  18649             0,
  18650             _bcmFieldSliceSelDisable, 0,
  18651             0, 1,
  18652             1, 0);
  18653       /* BIT 3 */
  18654       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGenevePktWithOam,
  18655             0,
  18656             _bcmFieldSliceSelDisable, 0,
  18657             0, 1,
  18658             1, 0);
  18659       /* BIT 3 */
  18660       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGpePktWithOam,
  18661             0,
  18662             _bcmFieldSliceSelDisable, 0,
  18663             0, 1,
  18664             1, 0);
  18665       /* BIT 11 */
  18666       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktVersionOne,
  18667             0,
  18668             _bcmFieldSliceSelDisable, 0,
  18669             0, 1,
  18670             1, 0);
  18671       /* BIT 12 */
  18672       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktOverflowed,
  18673             0,
  18674             _bcmFieldSliceSelDisable, 0,
  18675             0, 1,
  18676             1, 0);
  18677       /* BIT 13 */
  18678       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktFinalHop,
  18679             0,
  18680             _bcmFieldSliceSelDisable, 0,
  18681             0, 1,
  18682             1, 0);
  18683       /* BIT 14 */
  18684       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktLengthValid,
  18685             0,
  18686             _bcmFieldSliceSelDisable, 0,
  18687             0, 1,
  18688             1, 0);
  18689       /* BIT 14 */
  18690       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyBfdPktVersionOne,
  18691             0,
  18692             _bcmFieldSliceSelDisable, 0,
  18693             0, 1,
  18694             1, 0);
  18695       /* BIT 14 */
  18696       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGenevePktVersionZero,
  18697             0,
  18698             _bcmFieldSliceSelDisable, 0,
  18699             0, 1,
  18700             1, 0);
  18701       /* BIT 14 */
  18702       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGpePktVersionZero,
  18703             0,
  18704             _bcmFieldSliceSelDisable, 0,
  18705             0, 1,
  18706             1, 0);
  18707       /* BIT 15 */
  18708       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIntPktType,
  18709             0,
  18710             _bcmFieldSliceSelDisable, 0,
  18711             0, 1,
  18712             1, 0);
  18713 
  18714 
  18715       /* PARSER_1_FLEX_HVE_CHECK_RESULT_15_0 (48) */
  18716       /* BIT 0 */
  18717       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpmcV4Pkt,
  18718             0,
  18719             _bcmFieldSliceSelDisable, 0,
  18720             0, 1,
  18721             1, 0);
  18722       /* BIT 1 */
  18723       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpmcV6Pkt,
  18724             0,
  18725             _bcmFieldSliceSelDisable, 0,
  18726             0, 1,
  18727             1, 0);
  18728       /* BIT 2 */
  18729       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpChecksumOkPkt,
  18730             0,
  18731             _bcmFieldSliceSelDisable, 0,
  18732             0, 1,
  18733             1, 0);
  18734       /* BIT 3 */
  18735       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNetworkTagMulticastPkt,
  18736             0,
  18737             _bcmFieldSliceSelDisable, 0,
  18738             0, 1,
  18739             1, 0);
  18740       /* BIT 4 */
  18741       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpTtlZeroPkt,
  18742             0,
  18743             _bcmFieldSliceSelDisable, 0,
  18744             0, 1,
  18745             1, 0);
  18746       /* BIT 14 */
  18747       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyInnerBfdPktVersionOne,
  18748             0,
  18749             _bcmFieldSliceSelDisable, 0,
  18750             0, 1,
  18751             1, 0);
  18752       /* OPAQUE_1 (42) + (8 MSB bits of) OPAQUE_2 (43)*/
  18753       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNshServicePathId,
  18754             0,
  18755             _bcmFieldSliceSelDisable, 0,
  18756             0, 24,
  18757             24, 0);
  18758       /* OPAQUE_2 (43 - 8 LSB Bits) */
  18759       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNshServiceIndex,
  18760             0,
  18761             _bcmFieldSliceSelDisable, 0,
  18762             0, 8,
  18763             8, 0);
  18764       /* FCOE_VSAN_ID (40) */
  18765       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFibreChanVFTVsanId,
  18766             0,
  18767             _bcmFieldSliceSelDisable, 0,
  18768             0, 16,
  18769             16, 0);
  18770 
  18771       /* PKT_FLOW_ID_0 (39) - 624 */
  18772       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyFrontPanelPkt,
  18773             0,
  18774             _bcmFieldSliceSelDisable, 0,
  18775             0, 8,
  18776             8, 0);
  18777       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGigProxyTunnelType,
  18778             0,
  18779             _bcmFieldSliceSelDisable, 0,
  18780             0, 8,
  18781             8, 0);
  18782       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyLoopbackType,
  18783             0,
  18784             _bcmFieldSliceSelDisable, 0,
  18785             0, 8,
  18786             8, 0);
  18787       /* PKT_FLOW_ID_1 (38) - 608 */
  18788       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTunnelType,
  18789             0,
  18790             _bcmFieldSliceSelDisable, 0,
  18791             0, 4,
  18792             4, 0);
  18793       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTunnelSubType,
  18794             0,
  18795             _bcmFieldSliceSelDisable, 0,
  18796             0, 6,
  18797             6, 0);
  18798       /* PKT_FLOW_ID_2 (37) -  */
  18799       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTunnelTerminated,
  18800             0,
  18801             _bcmFieldSliceSelDisable, 0,
  18802             0, 1,
  18803             1, 0);
  18804       /* ZONE_0_MATCH_ID (36) - 576 */
  18805       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySysHdrType,
  18806             0,
  18807             _bcmFieldSliceSelDisable, 0,
  18808             0, 4,
  18809             4, 0);
  18810       if (soc_feature(unit, soc_feature_hgproxy_subtag_coe)) {
  18811           /* ZONE_1_MATCH_ID (35) - 560 */
  18812           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySubportTagPresent,
  18813                   0,
  18814                   _bcmFieldSliceSelDisable, 0,
  18815                   0, 1,
  18816                   1, 0);
  18817       }
  18818 
  18819 #if defined(BCM_HELIX5_SUPPORT)
  18820       if (SOC_IS_HELIX5(unit)) {
  18821           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGbpPresent,
  18822                   0,
  18823                   _bcmFieldSliceSelDisable, 0,
  18824                   0, 1,
  18825                   1, 0);
  18826           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGigGbpPresent,
  18827                   0,
  18828                   _bcmFieldSliceSelDisable, 0,
  18829                   0, 1,
  18830                   1, 0);
  18831       }
  18832 #endif /* BCM_HELIX5_SUPPORT */
  18833       if (soc_feature(unit, soc_feature_td3_style_fp)) {
  18834           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifySysHdrLocalDstport,
  18835                   0,
  18836                   _bcmFieldSliceSelDisable, 0,
  18837                   0, 8,
  18838                   8, 0);
  18839           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyTimeStampTxPktType,
  18840                   0,
  18841                   _bcmFieldSliceSelDisable, 0,
  18842                   0, 16,
  18843                   16, 0);
  18844           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVxlanGbpPresent,
  18845                   0,
  18846                   _bcmFieldSliceSelDisable, 0,
  18847                   0, 1,
  18848                   1, 0);
  18849           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyHiGigGbpSrcId,
  18850                   0,
  18851                   _bcmFieldSliceSelDisable, 0,
  18852                   0, 12,
  18853                   12, 0);
  18854           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGbpSrcId,
  18855                   0,
  18856                   _bcmFieldSliceSelDisable, 0,
  18857                   0, 16,
  18858                   16, 0);
  18859           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyGbpDstId,
  18860                   0,
  18861                   _bcmFieldSliceSelDisable, 0,
  18862                   0, 16,
  18863                   16, 0);
  18864           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyLoopbackSubtype,
  18865                   0,
  18866                   _bcmFieldSliceSelDisable, 0,
  18867                   0, 8,
  18868                   8, 0);
  18869       }
  18870       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyNetworkTagType,
  18871             0,
  18872             _bcmFieldSliceSelDisable, 0,
  18873             0, 2,
  18874             2, 0);
  18875       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyVlanFormat,
  18876             0,
  18877             _bcmFieldSliceSelDisable, 0,
  18878             0, 2,
  18879             2, 0);
  18880       if (soc_feature(unit, soc_feature_CnTag)) {
  18881           _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyCnTagPresent,
  18882                   0,
  18883                   _bcmFieldSliceSelDisable, 0,
  18884                   0, 1,
  18885                   1, 0);
  18886       }
  18887       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL2PktType,
  18888             0,
  18889             _bcmFieldSliceSelDisable, 0,
  18890             0, 2,
  18891             2, 0);
  18892 
  18893       /* ZONE_2_MATCH_ID (34) - 544 */
  18894       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyPktType,
  18895             0,
  18896             _bcmFieldSliceSelDisable, 0,
  18897             0, 8,
  18898             8, 0);
  18899       /*
  18900        * bcmFieldQualifyMplsCwPresent bit is overlapping with MSB bit (7th bit) of
  18901        * bcmFieldQualifyPktType. This qualifier should be used only if PktType qualifier
  18902        * has MPLS types.
  18903        */
  18904       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsCwPresent,
  18905             0,
  18906             _bcmFieldSliceSelDisable, 0,
  18907             0, 1,
  18908             1, 0);
  18909       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsMcastEthertypePresent,
  18910             0,
  18911             _bcmFieldSliceSelDisable, 0,
  18912             0, 1,
  18913             1, 0);
  18914       /* Ipv4OptionHdrType should be used only if PktType qualifier has IPv4 types. */
  18915       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpv4OptionHdrType,
  18916             0,
  18917             _bcmFieldSliceSelDisable, 0,
  18918             0, 3,
  18919             3, 0);
  18920       /* Ipv6ExtensionHdrType should be used only if PktType qualifier has IPv6 types. */
  18921       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpv6ExtensionHdrType,
  18922             0,
  18923             _bcmFieldSliceSelDisable, 0,
  18924             0, 4,
  18925             4, 0);
  18926       /* ZONE_3_MATCH_ID (33) - 528 */
  18927       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayVlanFormat,
  18928             0,
  18929             _bcmFieldSliceSelDisable, 0,
  18930             0, 2,
  18931             2, 0);
  18932       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayL2PktType,
  18933             0,
  18934             _bcmFieldSliceSelDisable, 0,
  18935             0, 2,
  18936             2, 0);
  18937       /* ZONE_4_MATCH_ID (32) - 512 */
  18938       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayPktType,
  18939             0,
  18940             _bcmFieldSliceSelDisable, 0,
  18941             0, 8,
  18942             8, 0);
  18943       /* Ipv4OptionHdrType should be used only if PktType qualifier has IPv4 types. */
  18944       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayIpv4OptionHdrType,
  18945             0,
  18946             _bcmFieldSliceSelDisable, 0,
  18947             0, 3,
  18948             3, 0);
  18949       /* Ipv6ExtensionHdrType should be used only if PktType qualifier has IPv6 types. */
  18950       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyOverlayIpv6ExtensionHdrType,
  18951             0,
  18952             _bcmFieldSliceSelDisable, 0,
  18953             0, 4,
  18954             4, 0);
  18955 
  18956 
  18957       /* 2 BIT Section */
  18958       /* L3_TYPE_1 - 1st Bit */
  18959       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyPimBidirDfStatus,
  18960             0,
  18961             _bcmFieldSliceSelDisable, 0,
  18962             0, 1,
  18963             1, 0);
  18964       /* CW_VALID_PROTECTION_DROP - 1st Bit */
  18965       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyRecoverableDrop,
  18966             0,
  18967             _bcmFieldSliceSelDisable, 0,
  18968             0, 1,
  18969             1, 0);
  18970       /* 4 BIT Section */
  18971       /* LOOKUP_STATUS_VECTOR_4 - 19th Bit */
  18972       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpmcStarGroupHit,
  18973             0,
  18974             _bcmFieldSliceSelDisable, 0,
  18975             0, 1,
  18976             1, 0);
  18977       /* LOOKUP_STATUS_VECTOR_5 - 23rd Bit */
  18978       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyL3SrcRouteHit,
  18979             0,
  18980             _bcmFieldSliceSelDisable, 0,
  18981             0, 1,
  18982             1, 0);
  18983 
  18984       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyBfdGoodPkt,
  18985             0,
  18986             _bcmFieldSliceSelDisable, 0,
  18987             0, 1,
  18988             1, 0);
  18989       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyBfdPktWithDstIpLoopbackAddr,
  18990             0,
  18991             _bcmFieldSliceSelDisable, 0,
  18992             0, 1,
  18993             1, 0);
  18994       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyMplsControlPkt,
  18995             0,
  18996             _bcmFieldSliceSelDisable, 0,
  18997             0, 1,
  18998             1, 0);
  18999       /* OPAQUE_3 */
  19000       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyInPorts_1,
  19001             0,
  19002             _bcmFieldSliceSelDisable, 0,
  19003             0, 16,
  19004             16, 0);
  19005       /* OPAQUE_4 */
  19006       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, _bcmFieldQualifyInPorts_2,
  19007             0,
  19008             _bcmFieldSliceSelDisable, 0,
  19009             0, 16,
  19010             16, 0);
  19011       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyIpIdentifier,
  19012             0,
  19013             _bcmFieldSliceSelDisable, 0,
  19014             0, 16,
  19015             16, 0);
  19016       /* UDF Chunks */
  19017       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyINTProbeMarker1,
  19018             0,
  19019             _bcmFieldSliceSelDisable, 0,
  19020             0, 32,
  19021             32, 0);
  19022       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyINTProbeMarker2,
  19023             0,
  19024             _bcmFieldSliceSelDisable, 0,
  19025             0, 32,
  19026             32, 0);
  19027       _FP_QUAL_ADD_WITH_FLAGS(unit, stage_fc, bcmFieldQualifyINTReserved4Bytes,
  19028             0,
  19029             _bcmFieldSliceSelDisable, 0,
  19030             0, 32,
  19031             32, 0);
  19032     }
  19033 #endif /* BCM_TRIDENT3_SUPPORT */
  19034     return (BCM_E_NONE);
  19035 }
  19036 
  19037 /*
  19038  * Function:
  19039  *    _field_th_qualifiers_init
  19040  * Purpose:
  19041  *    Initialize device qaualifiers select codes & offsets
  19042  * Parameters:
  19043  *    unit       - (IN) BCM device number.
  19044  *    stage_fc   - (IN/OUT) Field Processor stage control structure.
  19045  *
  19046  * Returns:
  19047  *    BCM_E_PARAM - Null field stage control structure.
  19048  *    BCM_E_MEMORY - Allocation failure.
  19049  *    BCM_E_INTERNAL - Invalid CAP Stage ID.
  19050  *    BCM_E_NONE - Success.
  19051  */
  19052 STATIC int
  19053 _field_th_qualifiers_init(int unit, _field_stage_t *stage_fc)
  19054 {
  19055     /* Input parameters check. */
  19056     if (NULL == stage_fc) {
  19057         return (BCM_E_PARAM);
  19058     }
  19059 
  19060     /* Initialize the stage's qualifier information. */
  19061     switch (stage_fc->stage_id) {
  19062         case _BCM_FIELD_STAGE_INGRESS:
  19063         case _BCM_FIELD_STAGE_EXACTMATCH:
  19064             return (_field_th_common_qualifiers_init(unit, stage_fc));
  19065         case _BCM_FIELD_STAGE_LOOKUP:
  19066             return (_field_th_lookup_qualifiers_init(unit, stage_fc));
  19067         case _BCM_FIELD_STAGE_EGRESS:
  19068 #if defined(BCM_TRIDENT3_SUPPORT)
  19069             if (soc_feature(unit, soc_feature_td3_style_fp)) {
  19070                 return (_field_td3_egress_qualifiers_init(unit, stage_fc));
  19071             } else
  19072 #endif
  19073 	    {
  19074                 return (_field_th_egress_qualifiers_init(unit, stage_fc));
  19075             }
  19076         case _BCM_FIELD_STAGE_CLASS:
  19077         case _BCM_FIELD_STAGE_FLOWTRACKER:
  19078             return BCM_E_NONE;
  19079         default:
  19080             break;
  19081     }
  19082 
  19083     return (BCM_E_INTERNAL);
  19084 }
  19085 
  19086 /*
  19087  * Function:
  19088  *     _bcm_field_th_egress_key_match_type_set
  19089  *
  19090  * Purpose:
  19091  *     Set key match type based on entry group.
  19092  *     NOTE: For double wide entries key type must be the same for
  19093  *           both parts of the entry.
  19094  * Parameters:
  19095  *     unit   - (IN) BCM device number
  19096  *     f_ent  - (IN) Slice number to enable
  19097  * Returns:
  19098  *     BCM_E_XXX
  19099  */
  19100 int
  19101 _bcm_field_th_egress_key_match_type_set (int unit, _field_entry_t *f_ent)
  19102 {
  19103     _field_group_t    *fg;          /* Field group entry belongs to. */
  19104     uint32            data;         /* Key match type.               */
  19105     uint32            default_data; /* default key match type.       */
  19106     uint32            mask;         /* Key match type mask.          */
  19107     int               rv;           /* Operation return status.      */
  19108 
  19109     /* Key match type offset.        */
  19110     _bcm_field_qual_offset_t q_offset;
  19111     {
  19112        sal_memset(&q_offset, 0, sizeof(q_offset));
  19113        q_offset.field = KEYf;
  19114        q_offset.num_offsets = 1;
  19115        if (!soc_feature(unit, soc_feature_td3_style_fp)) {
  19116            q_offset.offset[0] = 236;
  19117        } else {
  19118            q_offset.offset[0] = 268;
  19119        }
  19120        q_offset.width[0] = 4;
  19121     }
  19122 
  19123     /* Input parameters check. */
  19124     if (NULL == f_ent) {
  19125         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  19126         return (BCM_E_PARAM);
  19127     }
  19128     if (NULL == (fg = f_ent->group)) {
  19129         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  19130         return (BCM_E_PARAM);
  19131     }
  19132 
  19133     if (fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) {
  19134         switch (fg->sel_codes[0].fpf3) {
  19135             case _BCM_FIELD_EFP_KEY1:
  19136                 data = KEY_TYPE_IPv4_SINGLE;
  19137                 default_data = KEY_TYPE_L2_SINGLE;
  19138                 break;
  19139             case _BCM_FIELD_EFP_KEY2:
  19140                 data = KEY_TYPE_IPv6_SINGLE;
  19141                 default_data = KEY_TYPE_L2_SINGLE;
  19142                 break;
  19143             case _BCM_FIELD_EFP_KEY4:
  19144                 data = KEY_TYPE_L2_SINGLE;
  19145                 default_data = KEY_TYPE_L2_SINGLE;
  19146                 break;
  19147 #if defined(BCM_TRIDENT3_SUPPORT)
  19148           case _BCM_FIELD_EFP_KEY5:
  19149                 data = KEY_TYPE_FCOE_SINGLE;
  19150                 default_data = KEY_TYPE_L2_SINGLE;
  19151               break;
  19152 #endif /* BCM_TRIDENT3_SUPPORT */
  19153             default:
  19154                 return (BCM_E_INTERNAL);
  19155         }
  19156     } else {
  19157         switch (fg->sel_codes[1].fpf3) {
  19158             case _BCM_FIELD_EFP_KEY2:
  19159                 data = KEY_TYPE_IPv6_DOUBLE;
  19160                 default_data = KEY_TYPE_L2_DOUBLE;
  19161                 break;
  19162             case _BCM_FIELD_EFP_KEY4:
  19163                 if (_BCM_FIELD_EFP_KEY1 == fg->sel_codes[0].fpf3) {
  19164                     if (BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp4)){
  19165                         default_data = KEY_TYPE_L2_DOUBLE;
  19166                     } else {
  19167                         default_data = KEY_TYPE_IPv4_L2_L3_DOUBLE;
  19168                     }
  19169                     data = KEY_TYPE_IPv4_L2_L3_DOUBLE;
  19170                 } else if (_BCM_FIELD_EFP_KEY2 == fg->sel_codes[0].fpf3) {
  19171                     data = KEY_TYPE_IPv4_IPv6_DOUBLE;
  19172                     default_data = KEY_TYPE_L2_DOUBLE;
  19173                 } else if (_BCM_FIELD_EFP_KEY6 == fg->sel_codes[0].fpf3) {
  19174                     data = KEY_TYPE_HIGIG_DOUBLE;
  19175                     default_data = KEY_TYPE_IPv4_L2_L3_DOUBLE;
  19176                 } else if (_BCM_FIELD_EFP_KEY7 == fg->sel_codes[0].fpf3) {
  19177                     data = KEY_TYPE_LOOPBACK_DOUBLE;
  19178                     default_data = KEY_TYPE_IPv4_L2_L3_DOUBLE;
  19179                 } else if (_BCM_FIELD_EFP_KEY8 == fg->sel_codes[0].fpf3) {
  19180                     data = KEY_TYPE_L2_DOUBLE;
  19181                     default_data = KEY_TYPE_L2_DOUBLE;
  19182                 } else if (_BCM_FIELD_EFP_KEY5 == fg->sel_codes[0].fpf3) {
  19183                     data = KEY_TYPE_FCOE_DOUBLE;
  19184                     default_data = KEY_TYPE_IPv4_L2_L3_DOUBLE;
  19185                 }
  19186                 break;
  19187             default:
  19188                 return (BCM_E_INTERNAL);
  19189         }
  19190     }
  19191 
  19192     mask = 0xf;
  19193 
  19194    /*
  19195     * COVERITY
  19196     *
  19197     *This flow takes care of the  Out-of-bounds access issue
  19198     * for data and mask.
  19199     */
  19200     /* coverity[callee_ptr_arith : FALSE] */
  19201     rv = _bcm_field_qual_value_set_by_entry_type(unit, &q_offset, f_ent,
  19202                                                  &data, &mask,
  19203                                                  _FP_ENTRY_TYPE_0);
  19204     BCM_IF_ERROR_RETURN(rv);
  19205 
  19206    /*
  19207     * COVERITY
  19208     *
  19209     * This flow takes care of the  Out-of-bounds access issue
  19210     * for data and mask.
  19211     */
  19212 
  19213     /* coverity[callee_ptr_arith : FALSE] */
  19214 
  19215     rv = _bcm_field_qual_value_set_by_entry_type(unit, &q_offset, f_ent,
  19216                                                  &default_data, &mask,
  19217                                                  _FP_ENTRY_TYPE_1);
  19218     BCM_IF_ERROR_RETURN(rv);
  19219 
  19220     return rv;
  19221 }
  19222 
  19223 /*
  19224  * Function:
  19225  *     _bcm_field_th_egress_selcode_get
  19226  * Purpose:
  19227  *     Finds a select encodings that will satisfy the
  19228  *     requested qualifier set (Qset).
  19229  * Parameters:
  19230  *     unit      - (IN) BCM unit number.
  19231  *     stage_fc  - (IN) Stage Field control structure.
  19232  *     qset_req  - (IN) Client qualifier set.
  19233  *     fg        - (IN/OUT)Select code information filled into the group.
  19234  *
  19235  * Returns:
  19236  *     BCM_E_XXX
  19237  */
  19238 int
  19239 _bcm_field_th_egress_selcode_get(int unit, _field_stage_t *stage_fc,
  19240                                bcm_field_qset_t *qset_req,
  19241                                _field_group_t *fg)
  19242 {
  19243     int             rv;          /* Operation return status. */
  19244     bcm_field_qset_t new_qset;
  19245 
  19246     /* Input parameters check. */
  19247     if ((NULL == fg) || (NULL == qset_req) || (NULL == stage_fc)) {
  19248         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  19249         return (BCM_E_PARAM);
  19250     }
  19251 
  19252     if  (fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) {
  19253         /* Attempt _BCM_FIELD_EFP_KEY4  (L2 key). */
  19254         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19255                                            _BCM_FIELD_EFP_KEY4, 0, fg);
  19256         if (BCM_SUCCESS(rv)) {
  19257 
  19258             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19259                                          _BCM_FIELD_EFP_KEY4, -1, &new_qset, fg);
  19260             BCM_IF_ERROR_RETURN(rv);
  19261 
  19262             /* In EFP, for a given qset we can have two selector code
  19263                combination. So attempt _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19264 
  19265             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19266                                                            &new_qset,
  19267                                                            _BCM_FIELD_EFP_KEY4,
  19268                                                            0, fg);
  19269             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19270                                     (rv != BCM_E_RESOURCE))) {
  19271                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY4;
  19272                 return rv;
  19273             }
  19274         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19275             return rv;
  19276         }
  19277 
  19278         /* Attempt _BCM_FIELD_EFP_KEY1  (IPv4 key). */
  19279         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19280                                            _BCM_FIELD_EFP_KEY1, 0, fg);
  19281 
  19282         if (BCM_SUCCESS(rv)) {
  19283 
  19284             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19285                                          _BCM_FIELD_EFP_KEY4, -1, &new_qset, fg);
  19286             BCM_IF_ERROR_RETURN(rv);
  19287 
  19288 
  19289             /* In EFP, for a given qset we can have two selector code
  19290                combination. So attempt _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19291 
  19292             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19293                                                            &new_qset,
  19294                                                            _BCM_FIELD_EFP_KEY4,
  19295                                                            0, fg);
  19296             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19297                                     (rv != BCM_E_RESOURCE))) {
  19298                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY1;
  19299                 return rv;
  19300             }
  19301         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19302             return rv;
  19303         }
  19304 
  19305         /* Attempt _BCM_FIELD_EFP_KEY2  (IPv6 key). */
  19306         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19307                                            _BCM_FIELD_EFP_KEY2, 0, fg);
  19308         if (BCM_SUCCESS(rv)) {
  19309 
  19310             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19311                                          _BCM_FIELD_EFP_KEY4, -1, &new_qset, fg);
  19312             BCM_IF_ERROR_RETURN(rv);
  19313 
  19314 
  19315             /* In EFP, for a given qset we can have two selector code
  19316                combination. So attempt _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19317 
  19318 
  19319             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19320                                                            &new_qset,
  19321                                                            _BCM_FIELD_EFP_KEY4,
  19322                                                            0, fg);
  19323             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19324                                     (rv != BCM_E_RESOURCE))) {
  19325                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY2;
  19326                 return rv;
  19327             }
  19328         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19329             return rv;
  19330         }
  19331 
  19332 #if defined(BCM_TRIDENT3_SUPPORT)
  19333         if (soc_feature(unit, soc_feature_td3_style_fp)) {
  19334             /* Attempt _BCM_FIELD_EFP_KEY5  (FCOE key). */
  19335             rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19336                     _BCM_FIELD_EFP_KEY5, 0, fg);
  19337             if (BCM_SUCCESS(rv)) {
  19338 
  19339                 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19340                         _BCM_FIELD_EFP_KEY4, -1, &new_qset, fg);
  19341                 BCM_IF_ERROR_RETURN(rv);
  19342 
  19343 
  19344                 /* In EFP, for a given qset we can have two selector code
  19345  *                    combination. So attempt _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19346 
  19347 
  19348                 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19349                         &new_qset,
  19350                         _BCM_FIELD_EFP_KEY4,
  19351                         0, fg);
  19352                 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19353                             (rv != BCM_E_RESOURCE))) {
  19354                     fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY5;
  19355                     return rv;
  19356                 }
  19357             } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19358                 return rv;
  19359             }
  19360         }
  19361 #endif
  19362     } else {
  19363 
  19364         if (BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp4)) {
  19365             /* L3 + L2 double wide key for IPv4 packets */
  19366             rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19367                                                _BCM_FIELD_EFP_KEY1,
  19368                                                _BCM_FIELD_EFP_KEY4, fg);
  19369             if (BCM_SUCCESS(rv)) {
  19370 
  19371                 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19372                                              _BCM_FIELD_EFP_KEY8,
  19373                                              _BCM_FIELD_EFP_KEY4,
  19374                                              &new_qset, fg);
  19375                 BCM_IF_ERROR_RETURN(rv);
  19376 
  19377 
  19378                 /* In EFP, for a given qset we can have two selector code
  19379                    combination. So attempt _BCM_FIELD_EFP_KEY8 and
  19380                    _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19381 
  19382 
  19383                 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19384                                                                &new_qset,
  19385                                                            _BCM_FIELD_EFP_KEY8,
  19386                                                            _BCM_FIELD_EFP_KEY4,
  19387                                                               fg);
  19388                 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19389                                    (rv != BCM_E_RESOURCE))) {
  19390                     fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY1;
  19391                     fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4;
  19392                     return rv;
  19393                 }
  19394             } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19395                 return rv;
  19396             }
  19397         }
  19398 
  19399         /* L2 + L3 double wide predefined key. */
  19400         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19401                                            _BCM_FIELD_EFP_KEY1,
  19402                                            _BCM_FIELD_EFP_KEY4, fg);
  19403         if (BCM_SUCCESS(rv)) {
  19404 
  19405             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19406                                          _BCM_FIELD_EFP_KEY1,
  19407                                          _BCM_FIELD_EFP_KEY4,
  19408                                          &new_qset, fg);
  19409             BCM_IF_ERROR_RETURN(rv);
  19410 
  19411 
  19412             /* In EFP, for a given qset we can have two selector code
  19413                combination. So attempt _BCM_FIELD_EFP_KEY1 and
  19414                _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19415 
  19416 
  19417             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19418                                                            &new_qset,
  19419                                                            _BCM_FIELD_EFP_KEY1,
  19420                                                            _BCM_FIELD_EFP_KEY4,
  19421                                                            fg);
  19422             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19423                                     (rv != BCM_E_RESOURCE))) {
  19424                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY1;
  19425                 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4;
  19426                 return rv;
  19427             }
  19428         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19429             return rv;
  19430         }
  19431 
  19432         /* HiGiG Doublewide key */
  19433         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19434                                            _BCM_FIELD_EFP_KEY6,
  19435                                            _BCM_FIELD_EFP_KEY4, fg);
  19436         if (BCM_SUCCESS(rv)) {
  19437 
  19438             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19439                                          _BCM_FIELD_EFP_KEY1,
  19440                                          _BCM_FIELD_EFP_KEY4,
  19441                                          &new_qset, fg);
  19442             BCM_IF_ERROR_RETURN(rv);
  19443 
  19444 
  19445             /* In EFP, for a given qset we can have two selector code
  19446                combination. So attempt _BCM_FIELD_EFP_KEY1 and
  19447                _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19448 
  19449 
  19450             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19451                                                            &new_qset,
  19452                                                            _BCM_FIELD_EFP_KEY1,
  19453                                                            _BCM_FIELD_EFP_KEY4,
  19454                                                            fg);
  19455             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19456                                     (rv != BCM_E_RESOURCE))) {
  19457                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY6;
  19458                 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4;
  19459                 return rv;
  19460             }
  19461         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19462             return rv;
  19463         }
  19464 
  19465         /* Loopback double wide key */
  19466 
  19467         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19468                                            _BCM_FIELD_EFP_KEY7,
  19469                                            _BCM_FIELD_EFP_KEY4, fg);
  19470         if (BCM_SUCCESS(rv)) {
  19471 
  19472             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19473                                          _BCM_FIELD_EFP_KEY1,
  19474                                          _BCM_FIELD_EFP_KEY4,
  19475                                          &new_qset, fg);
  19476             BCM_IF_ERROR_RETURN(rv);
  19477 
  19478 
  19479             /* In EFP, for a given qset we can have two selector code
  19480                combination. So attempt _BCM_FIELD_EFP_KEY1 and
  19481                _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19482 
  19483 
  19484             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19485                                                            &new_qset,
  19486                                                            _BCM_FIELD_EFP_KEY1,
  19487                                                            _BCM_FIELD_EFP_KEY4,
  19488                                                            fg);
  19489             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19490                                     (rv != BCM_E_RESOURCE))) {
  19491                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY7;
  19492                 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4;
  19493                 return rv;
  19494             }
  19495         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19496             return rv;
  19497         }
  19498 
  19499         /* L3 + L2 double wide key for IPv6 packets */
  19500         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19501                                            _BCM_FIELD_EFP_KEY2,
  19502                                            _BCM_FIELD_EFP_KEY4, fg);
  19503         if (BCM_SUCCESS(rv)) {
  19504 
  19505             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19506                                          _BCM_FIELD_EFP_KEY8,
  19507                                          _BCM_FIELD_EFP_KEY4,
  19508                                          &new_qset, fg);
  19509             BCM_IF_ERROR_RETURN(rv);
  19510 
  19511 
  19512             /* In EFP, for a given qset we can have two selector code
  19513                combination. So attempt _BCM_FIELD_EFP_KEY8 and
  19514                _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19515 
  19516 
  19517             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19518                                                            &new_qset,
  19519                                                            _BCM_FIELD_EFP_KEY8,
  19520                                                            _BCM_FIELD_EFP_KEY4,
  19521                                                            fg);
  19522             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19523                                     (rv != BCM_E_RESOURCE))) {
  19524                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY2;
  19525                 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4;
  19526                 return rv;
  19527             }
  19528         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19529             return rv;
  19530         }
  19531 
  19532         /* L3 key for IPv6 packets */
  19533         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19534                                            _BCM_FIELD_EFP_KEY3,
  19535                                            _BCM_FIELD_EFP_KEY2, fg);
  19536         if (BCM_SUCCESS(rv)) {
  19537 
  19538             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19539                                          _BCM_FIELD_EFP_KEY8,
  19540                                          _BCM_FIELD_EFP_KEY4,
  19541                                          &new_qset, fg);
  19542             BCM_IF_ERROR_RETURN(rv);
  19543 
  19544 
  19545             /* In EFP, for a given qset we can have two selector code
  19546                combination. So attempt _BCM_FIELD_EFP_KEY8 and
  19547                _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19548 
  19549 
  19550             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19551                                                            &new_qset,
  19552                                                            _BCM_FIELD_EFP_KEY8,
  19553                                                            _BCM_FIELD_EFP_KEY4,
  19554                                                            fg);
  19555             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19556                                     (rv != BCM_E_RESOURCE))) {
  19557                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY3;
  19558                 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY2;
  19559                 return rv;
  19560             }
  19561         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19562             return rv;
  19563         }
  19564 
  19565         /* Bytes after L2 Double key for non IP packets */
  19566         rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19567                                            _BCM_FIELD_EFP_KEY8,
  19568                                            _BCM_FIELD_EFP_KEY4, fg);
  19569         if (BCM_SUCCESS(rv)) {
  19570 
  19571             rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19572                                          _BCM_FIELD_EFP_KEY8,
  19573                                          _BCM_FIELD_EFP_KEY4,
  19574                                          &new_qset, fg);
  19575             BCM_IF_ERROR_RETURN(rv);
  19576 
  19577 
  19578             /* In EFP, for a given qset we can have two selector code
  19579                combination. So attempt _BCM_FIELD_EFP_KEY8 and
  19580                _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19581 
  19582 
  19583             rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19584                                                            &new_qset,
  19585                                                            _BCM_FIELD_EFP_KEY8,
  19586                                                            _BCM_FIELD_EFP_KEY4,
  19587                                                            fg);
  19588             if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19589                                     (rv != BCM_E_RESOURCE))) {
  19590                 fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY8;
  19591                 fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4;
  19592                 return rv;
  19593             }
  19594         } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19595             return rv;
  19596         }
  19597 
  19598 #if defined(BCM_TRIDENT3_SUPPORT)
  19599         if (soc_feature(unit, soc_feature_td3_style_fp)) {
  19600             /* FCOE double wide predefined key. */
  19601             rv = _bcm_field_egress_key_attempt(unit, stage_fc, qset_req,
  19602                     _BCM_FIELD_EFP_KEY5,
  19603                     _BCM_FIELD_EFP_KEY4, fg);
  19604             if (BCM_SUCCESS(rv)) {
  19605 
  19606                 rv = _bcm_field_trx_qset_get(unit, qset_req, stage_fc,
  19607                         _BCM_FIELD_EFP_KEY1,
  19608                         _BCM_FIELD_EFP_KEY4,
  19609                         &new_qset, fg);
  19610                 BCM_IF_ERROR_RETURN(rv);
  19611 
  19612 
  19613                 /* In EFP, for a given qset we can have two selector code
  19614                  * combination. So attempt _BCM_FIELD_EFP_KEY1 and
  19615                  * _BCM_FIELD_EFP_KEY4 (Any Packet type) */
  19616                 rv = _bcm_field_trx_egress_default_selcode_get(unit, stage_fc,
  19617                         &new_qset,
  19618                         _BCM_FIELD_EFP_KEY1,
  19619                         _BCM_FIELD_EFP_KEY4,
  19620                         fg);
  19621                 if (BCM_SUCCESS(rv) || (BCM_FAILURE(rv) &&
  19622                             (rv != BCM_E_RESOURCE))) {
  19623                     fg->sel_codes[0].fpf3= _BCM_FIELD_EFP_KEY5;
  19624                     fg->sel_codes[1].fpf3= _BCM_FIELD_EFP_KEY4;
  19625                     return rv;
  19626                 }
  19627             } else if(BCM_FAILURE(rv) && (rv != BCM_E_RESOURCE)) {
  19628                 return rv;
  19629             }
  19630         }
  19631 #endif
  19632     }
  19633 
  19634     return BCM_E_RESOURCE;
  19635 }
  19636 
  19637 /*
  19638  * Function:
  19639  *     _bcm_field_th_selcode_get
  19640  * Purpose:
  19641  *     Finds a 4-tuple of select encodings that will satisfy the
  19642  *     requested qualifier set (Qset).
  19643  * Parameters:
  19644  *     unit      - (IN) BCM unit number.
  19645  *     stage_fc  - (IN) Stage Field control structure.
  19646  *     qset_req  - (IN) Client qualifier set.
  19647  *     fg        - (IN/OUT)Select code information filled into the group.
  19648  *
  19649  * Returns:
  19650  *     BCM_E_XXX
  19651  */
  19652 int
  19653 _bcm_field_th_selcode_get(int unit, _field_stage_t *stage_fc,
  19654                           bcm_field_qset_t *qset_req,
  19655                           _field_group_t *fg)
  19656 {
  19657     int  rv;                     /* Operation return status. */
  19658 
  19659     /* Input parameters check. */
  19660     if ((NULL == fg) || (NULL == qset_req) || (NULL == stage_fc)) {
  19661         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  19662         return (BCM_E_PARAM);
  19663     }
  19664 
  19665     /* Egress qualifiers are selected based on Key. */
  19666     switch (stage_fc->stage_id) {
  19667       case _BCM_FIELD_STAGE_EGRESS:
  19668           rv =  _bcm_field_th_egress_selcode_get(unit, stage_fc, qset_req, fg);
  19669           break;
  19670       default:
  19671           rv =  _bcm_field_selcode_get(unit, stage_fc, qset_req, fg);
  19672     }
  19673     return (rv);
  19674 }
  19675 
  19676 /*
  19677  * Function:
  19678  *    _field_th_group_install
  19679  *
  19680  * Purpose:
  19681  *    Auxiliary routine used to install field group.
  19682  * Parameters:
  19683  *     unit       - (IN) BCM device number.
  19684  *     fg         - (IN) Installed group structure.
  19685  *
  19686  * Returns:
  19687  *     BCM_E_XXX
  19688  */
  19689 STATIC int
  19690 _field_th_group_install(int unit, _field_group_t *fg)
  19691 {
  19692     _field_slice_t *fs;        /* Slice pointer.           */
  19693     uint8  slice_number;       /* Slices iterator.         */
  19694     int    parts_count;        /* Number of entry parts.   */
  19695     int    idx;                /* Iteration index.         */
  19696 
  19697     if (NULL == fg) {
  19698         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META("Invalid Parameters\n")));
  19699         return (BCM_E_PARAM);
  19700     }
  19701 
  19702     /* Get number of entry parts. */
  19703     BCM_IF_ERROR_RETURN(_bcm_field_entry_tcam_parts_count(unit,
  19704                                                           fg->stage_id,
  19705                                                           fg->flags,
  19706                                                           &parts_count
  19707                                                           )
  19708                         );
  19709 
  19710     for (idx = 0; idx < parts_count; ++idx) {
  19711         BCM_IF_ERROR_RETURN(_bcm_field_tcam_part_to_slice_number(unit, idx,
  19712                                                                  fg,
  19713                                                                  &slice_number
  19714                                                                  )
  19715                             );
  19716         fs = fg->slices + slice_number;
  19717 
  19718         BCM_IF_ERROR_RETURN(_bcm_field_th_selcodes_install(unit,
  19719                                                            fg,
  19720                                                            fs->slice_number,
  19721                                                            fg->pbmp,
  19722                                                            idx)
  19723                             );
  19724     }
  19725 
  19726     return (BCM_E_NONE);
  19727 }
  19728 
  19729 /*
  19730  * Function:
  19731  *     _bcm_field_th_group_install
  19732  *
  19733  * Purpose:
  19734  *    Auxiliary routine used to install field group.
  19735  * Parameters:
  19736  *     unit       - (IN) BCM device number.
  19737  *     fg         - (IN) Installed group structure.
  19738  *
  19739  * Returns:
  19740  *     BCM_E_XXX
  19741  */
  19742 
  19743 int
  19744 _bcm_field_th_group_install(int unit, _field_group_t *fg)
  19745 {
  19746   return _field_th_group_install(unit, fg);
  19747 }
  19748            /* START OF COUNTER ROUTINES */
  19749 
  19750 
  19751 /*
  19752  * Function:
  19753  *     _bcm_field_th_flex_stat_index_get
  19754  * Purpose:
  19755  *      Get the indexes and flags needed to compose requested statistic
  19756  *      which uses flex counter pools.
  19757  *
  19758  * Parameters:
  19759  *   unit          - (IN)  BCM device number.
  19760  *   f_st          - (IN)  Field statistics entity.
  19761  *   stat          - (IN)  Counter type.
  19762  *   idx1          - (OUT) Primary counter index.
  19763  *   idx2          - (OUT) Secondary counter index.
  19764  *   idx3          - (OUT) Ternary Counter Index.
  19765  *   out_flags     - (OUT) Counter flags.
  19766  * Returns:
  19767  *    BCM_E_XXX
  19768  */
  19769 int
  19770 _bcm_field_th_flex_stat_index_get(int unit,
  19771                                   _field_stat_t *f_st,
  19772                                   bcm_field_stat_t stat,
  19773                                   int *idx1, int *idx2,
  19774                                   int *idx3, uint32 *out_flags)
  19775 {
  19776     int     fp_stat_mode_max; /* Max stat modes.                 */
  19777     uint8   idx;              /* HW counter modes iterator.      */
  19778     uint32  flags = 0;        /* _FP_STAT_XXX flags.             */
  19779     uint32  req_bmap;         /* Requested statistics bitmap.    */
  19780     uint32  hw_bmap;          /* HW supported statistics bitmap. */
  19781     _field_stat_color_t  color; /* Stat Color. */
  19782 
  19783     if (NULL == f_st ||
  19784         NULL == idx1 ||
  19785         NULL == idx2 ||
  19786         NULL == idx3 ||
  19787         NULL == out_flags) {
  19788         return BCM_E_PARAM;
  19789     }
  19790 
  19791     /* Get application requested bitmap. */
  19792     BCM_IF_ERROR_RETURN
  19793         (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap));
  19794 
  19795     /* If bitmap is zero - no mode selection is required. */
  19796     if (0 == req_bmap) {
  19797         return BCM_E_INTERNAL;
  19798     }
  19799 
  19800     *idx1 = *idx2 = *idx3 = _FP_INVALID_INDEX;
  19801 
  19802     fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl);
  19803     for (idx = 0; idx < fp_stat_mode_max; idx++) {
  19804         hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap;
  19805         color = th_ingress_cntr_hw_mode_tbl[idx].color;
  19806         if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) {
  19807             /*
  19808              * For maximizing utilization of hardware counters, this should
  19809              * select the hw_mode both supports the requested stats
  19810              * AND minimizes the number of required hardware counters.
  19811              */
  19812              break;
  19813         }
  19814     }
  19815 
  19816     if  (idx >= fp_stat_mode_max) {
  19817         return (BCM_E_INTERNAL);
  19818     }
  19819 
  19820     switch (stat) {
  19821         case bcmFieldStatBytes:
  19822             flags |= _FP_STAT_BYTES;
  19823             /* Fall through */
  19824         case bcmFieldStatPackets:
  19825             if (_bcmFieldStatColorNoColor == color) {
  19826                 *idx1 = f_st->hw_index;
  19827             } else if ((_bcmFieldStatColorGreenNotGreen == color) ||
  19828                      (_bcmFieldStatColorYellowNotYellow == color) ||
  19829                      (_bcmFieldStatColorRedNotRed == color)) {
  19830                 *idx1 = f_st->hw_index;
  19831                 *idx2 = f_st->hw_index + 1;
  19832             } else if (_bcmFieldStatColorGreenYellowRed == color) {
  19833                 *idx1 = f_st->hw_index;
  19834                 *idx2 = f_st->hw_index + 1;
  19835                 *idx3 = f_st->hw_index + 2;
  19836             } else {
  19837                 return BCM_E_INTERNAL;
  19838             }
  19839             break;
  19840         case bcmFieldStatGreenBytes:
  19841             flags |= _FP_STAT_BYTES;
  19842             /* Fall through */
  19843         case bcmFieldStatGreenPackets:
  19844             if ((_bcmFieldStatColorGreen == color) ||
  19845                 (_bcmFieldStatColorGreenYellow == color) ||
  19846                 (_bcmFieldStatColorGreenRed == color) ||
  19847                 (_bcmFieldStatColorGreenNotGreen == color) ||
  19848                 (_bcmFieldStatColorGreenYellowRed == color)) {
  19849                 *idx1 = f_st->hw_index;
  19850             } else {
  19851                 return BCM_E_INTERNAL;
  19852             }
  19853             break;
  19854         case bcmFieldStatYellowBytes:
  19855             flags |= _FP_STAT_BYTES;
  19856             /* Fall through */
  19857         case bcmFieldStatYellowPackets:
  19858             if ((_bcmFieldStatColorYellow == color) ||
  19859                 (_bcmFieldStatColorYellowRed == color) ||
  19860                 (_bcmFieldStatColorYellowNotYellow == color)) {
  19861                 *idx1 = f_st->hw_index;
  19862             } else if ((_bcmFieldStatColorGreenYellow == color) ||
  19863                        (_bcmFieldStatColorGreenYellowRed == color)) {
  19864                 *idx1 = f_st->hw_index + 1;
  19865             } else {
  19866                 return BCM_E_INTERNAL;
  19867             }
  19868             break;
  19869         case bcmFieldStatRedBytes:
  19870             flags |= _FP_STAT_BYTES;
  19871             /* Fall through */
  19872         case bcmFieldStatRedPackets:
  19873             if ((_bcmFieldStatColorRed == color) ||
  19874                 (_bcmFieldStatColorRedNotRed == color)) {
  19875                 *idx1 = f_st->hw_index;
  19876             } else if ((_bcmFieldStatColorGreenRed == color) ||
  19877                        (_bcmFieldStatColorYellowRed == color)) {
  19878                 *idx1 = f_st->hw_index + 1;
  19879             } else if (_bcmFieldStatColorGreenYellowRed == color) {
  19880                 *idx1 = f_st->hw_index + 2;
  19881             } else {
  19882                 return BCM_E_INTERNAL;
  19883             }
  19884             break;
  19885         case bcmFieldStatNotGreenBytes:
  19886             flags |= _FP_STAT_BYTES;
  19887             /* Fall through */
  19888         case bcmFieldStatNotGreenPackets:
  19889             if (_bcmFieldStatColorNotGreen == color) {
  19890                 *idx1 = f_st->hw_index;
  19891             } else if (_bcmFieldStatColorGreenNotGreen == color) {
  19892                 *idx1 = f_st->hw_index + 1;
  19893             } else if (_bcmFieldStatColorYellowRed == color) {
  19894                 *idx1 = f_st->hw_index;
  19895                 *idx2 = f_st->hw_index + 1;
  19896             } else if (_bcmFieldStatColorGreenYellowRed == color) {
  19897                 *idx1 = f_st->hw_index + 1;
  19898                 *idx2 = f_st->hw_index + 2;
  19899             } else {
  19900                 return BCM_E_INTERNAL;
  19901             }
  19902             break;
  19903         case bcmFieldStatNotYellowBytes:
  19904             flags |= _FP_STAT_BYTES;
  19905             /* Fall through */
  19906         case bcmFieldStatNotYellowPackets:
  19907             if (_bcmFieldStatColorNotYellow == color) {
  19908                 *idx1 = f_st->hw_index;
  19909             } else if (_bcmFieldStatColorYellowNotYellow == color) {
  19910                 *idx1 = f_st->hw_index + 1;
  19911             } else if (_bcmFieldStatColorGreenRed == color) {
  19912                 *idx1 = f_st->hw_index;
  19913                 *idx2 = f_st->hw_index + 1;
  19914             } else if (_bcmFieldStatColorGreenYellowRed == color) {
  19915                 *idx1 = f_st->hw_index;
  19916                 *idx2 = f_st->hw_index + 2;
  19917             } else {
  19918                 return BCM_E_INTERNAL;
  19919             }
  19920             break;
  19921         case bcmFieldStatNotRedBytes:
  19922             flags |= _FP_STAT_BYTES;
  19923             /* Fall through */
  19924         case bcmFieldStatNotRedPackets:
  19925             if (_bcmFieldStatColorNotRed == color) {
  19926                 *idx1 = f_st->hw_index;
  19927             } else if (_bcmFieldStatColorRedNotRed == color) {
  19928                 *idx1 = f_st->hw_index + 1;
  19929             } else if ((_bcmFieldStatColorGreenYellow == color) ||
  19930                        (_bcmFieldStatColorGreenYellowRed == color)) {
  19931                 *idx1 = f_st->hw_index;
  19932                 *idx2 = f_st->hw_index + 1;
  19933             } else {
  19934                 return BCM_E_INTERNAL;
  19935             }
  19936             break;
  19937         default:
  19938             return BCM_E_INTERNAL;
  19939     }
  19940 
  19941     flags |= _FP_STAT_ADD;
  19942     *out_flags = flags;
  19943     return BCM_E_NONE;
  19944 }
  19945 
  19946 /*
  19947  * Function:
  19948  *     _bcm_field_th_stat_index_get
  19949  * Purpose:
  19950  *      Get the indexes and flags needed to compose requested statistic.
  19951  *
  19952  * Parameters:
  19953  *   unit          - (IN)  BCM device number.
  19954  *   f_st          - (IN)  Field statistics entity.
  19955  *   stat          - (IN)  Counter type.
  19956  *   idx1          - (OUT)  Primary counter index.
  19957  *   idx2          - (OUT)  Secondary counter index.
  19958  *   out_flags     - (OUT)  Counter flags.
  19959  * Returns:
  19960  *    BCM_E_XXX
  19961  */
  19962 int
  19963 _bcm_field_th_stat_index_get(int unit,
  19964                              _field_stat_t *f_st,
  19965                              bcm_field_stat_t stat,
  19966                              int *idx1, int *idx2,
  19967                              int *idx3, uint32 *out_flags)
  19968 {
  19969     int rv;
  19970 
  19971     if (NULL == f_st ||
  19972         NULL == idx1 ||
  19973         NULL == idx2 ||
  19974         NULL == idx3 ||
  19975         NULL == out_flags) {
  19976         return BCM_E_PARAM;
  19977     }
  19978 
  19979     if ((_BCM_FIELD_STAGE_INGRESS == f_st->stage_id) ||
  19980         (_BCM_FIELD_STAGE_EXACTMATCH == f_st->stage_id)) {
  19981         rv = _bcm_field_th_flex_stat_index_get(unit, f_st, stat, idx1,
  19982                                                idx2, idx3, out_flags);
  19983     } else {
  19984         rv = _bcm_field_trx_stat_index_get(unit, f_st, stat, idx1,
  19985                                            idx2, idx3, out_flags);
  19986     }
  19987 
  19988     return rv;
  19989 }
  19990 
  19991 /*
  19992  * Function:
  19993  *    _field_th_flex_mode_get
  19994  * Purpose:
  19995  *    Get flex stat hardware counter mode information
  19996  * Parameters:
  19997  *     unit  - (IN) BCM device number
  19998  *     f_st  - (IN) Pointer to field stat structure
  19999  * Returns:
  20000  *     BCM_E_XXX
  20001  */
  20002 STATIC int
  20003 _field_th_flex_mode_get(int unit,
  20004                          _field_stat_t *f_st)
  20005 {
  20006     int     fp_stat_mode_max; /* Max stat modes.  */
  20007     uint8   idx;            /* HW counter modes iterator.      */
  20008     uint8   hw_entry_count; /* Number of counter table entries.*/
  20009     uint32  req_bmap;       /* Requested statistics bitmap.    */
  20010     uint32  hw_bmap;        /* HW supported statistics bitmap. */
  20011 
  20012     /* Input parameter check. */
  20013     if (NULL == f_st) {
  20014         return (BCM_E_PARAM);
  20015     }
  20016 
  20017     /* Get application requested bitmap. */
  20018     BCM_IF_ERROR_RETURN
  20019         (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap));
  20020 
  20021     /* If bitmap is zero - no mode selection is required. */
  20022     if (0 == req_bmap) {
  20023         f_st->hw_mode = 0;
  20024         f_st->hw_stat = 0;
  20025         f_st->hw_flags |= _FP_STAT_FLEX_CNTR;
  20026         f_st->flex_mode = 0;
  20027         f_st->hw_entry_count = 0;
  20028         return (BCM_E_NONE);
  20029     }
  20030 
  20031     fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl);
  20032     for (idx = 0; idx < fp_stat_mode_max; idx++) {
  20033         hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap;
  20034         hw_entry_count = th_ingress_cntr_hw_mode_tbl[idx].hw_entry_count;
  20035         if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) {
  20036             /*
  20037              * For maximizing utilization of hardware counters, this should
  20038              * select the hw_mode both supports the requested stats
  20039              * AND minimizes the number of required hardware counters.
  20040              */
  20041              break;
  20042         }
  20043     }
  20044 
  20045     if  (idx >= fp_stat_mode_max) {
  20046         return (BCM_E_RESOURCE);
  20047     }
  20048 
  20049      /* Initialize stat structure with flex stat parameter info. */
  20050      f_st->hw_stat   = req_bmap;
  20051      f_st->hw_flags |= _FP_STAT_FLEX_CNTR;
  20052      f_st->flex_mode = 0;
  20053      f_st->hw_entry_count = hw_entry_count;
  20054 
  20055      return (BCM_E_NONE);
  20056 }
  20057 
  20058 /*
  20059  * Function:
  20060  *    _bcm_field_th_stat_hw_mode_get
  20061  *
  20062  * Description:
  20063  *      Get hw counter mode which will satisfy requested statistics set.
  20064  * Parameters:
  20065  *      unit     - (IN) BCM device number.
  20066  *      f_st     - (IN) Field statistics entity.
  20067  *      stage_id - (IN) Field stage id.
  20068  * Returns:
  20069  *      BCM_E_XXX
  20070  */
  20071 int
  20072 _bcm_field_th_stat_hw_mode_get(int unit, _field_stat_t *f_st,
  20073                                   _field_stage_id_t stage_id)
  20074 {
  20075     /* Input parameters check. */
  20076     if (NULL == f_st) {
  20077         return (BCM_E_PARAM);
  20078     }
  20079 
  20080     /*
  20081      * Tomahawk supports advanced flex counters
  20082      * for both IFP and EM then get flex stat mode for this Stat.
  20083      */
  20084     if (soc_feature(unit, soc_feature_advanced_flex_counter)
  20085         && ((_BCM_FIELD_STAGE_INGRESS == stage_id) ||
  20086             (_BCM_FIELD_STAGE_EXACTMATCH == stage_id))) {
  20087         return (_field_th_flex_mode_get(unit, f_st));
  20088     }
  20089 
  20090     /* EFP still uses dedicated counter pools which can be used by only EFP.
  20091      * Tomahawk VFP uses advance flex counters but no change when compred to
  20092      * Trident2.
  20093      */
  20094     return _bcm_field_stat_hw_mode_get(unit, f_st, stage_id);
  20095 }
  20096 
  20097 /*
  20098  * Function:
  20099  *    _bcm_field_th_group_counter_pbm_clear
  20100  *
  20101  * Description:
  20102  *      Clear group counter pool bitmap based on used entries in
  20103  *      in the pool.
  20104  * Parameters:
  20105  *      unit     - (IN) BCM device number.
  20106  *      f_ent    - (IN) Field entry structure.
  20107  *      pool_id  - (IN) Counter pool id.
  20108  * Returns:
  20109  *      BCM_E_XXX
  20110  */
  20111 int
  20112 _bcm_field_th_group_counter_pbm_clear(int unit,
  20113                                       _field_entry_t *f_ent,
  20114                                       uint32 pool_id)
  20115 {
  20116     int rv; /* Operational Status. */
  20117     uint32 num_pools; /* Counter pool count. */
  20118     uint32 actual_num_pools; /* Actual Counter Pooll Count. */
  20119     bcm_stat_flex_direction_t direction; /* Flex Stat Module object to indicate
  20120                                           * Ingres/Egress Counter pools.
  20121                                           */
  20122     /* Flex Stat Object to carry counter pool info. */
  20123     bcm_stat_flex_pool_stat_info_t pool_info[_FIELD_MAX_COUNTER_POOLS];
  20124 
  20125     _field_stage_t       *stage_fc;  /* pipeline stage  */
  20126     int pipe_no = 0;
  20127 
  20128     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, f_ent->group->stage_id,
  20129                                                  &stage_fc));
  20130     if(stage_fc->oper_mode == bcmFieldGroupOperModePipeLocal) {
  20131         pipe_no = f_ent->group->instance;
  20132     } else {
  20133         pipe_no = 0;
  20134     }
  20135 
  20136     /* Though Tomahawk supports 20 flex counter pools , as of now only 16 pools
  20137      * are initialized and operating. Remain 4 pools are unused. num_pools has
  20138      * to be set to 20 once the remaining 4 pools are supported.
  20139      */
  20140     num_pools = _FIELD_MAX_COUNTER_POOLS;
  20141     direction = bcmStatFlexDirectionIngress;
  20142     rv = _bcm_esw_stat_flex_pipe_pool_info_multi_get(unit,
  20143                                                 direction,
  20144                                                 pipe_no,
  20145                                                 num_pools,
  20146                                                 pool_info,
  20147                                                 &actual_num_pools);
  20148     BCM_IF_ERROR_RETURN(rv);
  20149 
  20150     /*
  20151      * Attached entries in any pool is zero means no Field entry has associated stat
  20152      * in the cuurent Flex stat pool.
  20153      * Used entries in any pool is zero means flex stat module disassociated
  20154      * that pool from Field module and can be assigned to any other module.
  20155      * So field group should also disassociate the pool from its in use counter
  20156      * pool bitmap.
  20157      */
  20158     if (0 == pool_info[pool_id].attached_entries) {
  20159 
  20160         /* If the pool is in use for the group, disassocite it now. */
  20161         if (_FP_COUNTER_POOL_BMP_TEST(
  20162                             f_ent->group->counter_pool_bmp, pool_id)) {
  20163             _FP_COUNTER_POOL_BMP_REMOVE(
  20164                             f_ent->group->counter_pool_bmp, pool_id);
  20165         }
  20166     }
  20167 
  20168     return BCM_E_NONE;
  20169 }
  20170 /*
  20171  * Function:
  20172  *     _bcm_field_th_flex_counter_free
  20173  *
  20174  * Purpose:
  20175  *     Free flex counter resources used by field entry/entries.
  20176  * Parameters:
  20177  *     unit     - (IN) BCM device number.
  20178  *     f_ent    - (IN) Entry array policer belongs to.
  20179  *     f_st     - (IN) Statistics entity.
  20180  *     mem      - (IN) Policy Table name.
  20181  * Returns:
  20182  *     BCM_E_XXX
  20183  */
  20184 int
  20185 _bcm_field_th_flex_counter_free(int unit,
  20186                                 _field_entry_t *f_ent,
  20187                                 _field_stat_t *f_st, soc_mem_t mem)
  20188 {
  20189     int              rv; /* Operational status. */
  20190     int              entry_idx; /* Entry index in a slice. */
  20191     _field_control_t *fc; /* Field Control Structure. */
  20192     _field_stage_t   *stage_fc; /* Field Stage structure.*/
  20193     _field_entry_stat_t  *f_ent_st;  /* Field entry statistics structure. */
  20194 
  20195     if (NULL == f_ent || NULL == f_st || INVALIDm == mem) {
  20196         return BCM_E_PARAM;
  20197     }
  20198 
  20199     f_ent_st = &f_ent->statistic;
  20200 
  20201     /* Get pipeline stage information. */
  20202     BCM_IF_ERROR_RETURN
  20203         (_field_stage_control_get(unit,
  20204                                   f_ent->group->stage_id,
  20205                                   &stage_fc
  20206                                   )
  20207         );
  20208 
  20209     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  20210 
  20211 
  20212     /* Detach flex stat only if it has been created. */
  20213     if (f_st->flex_mode != 0) {
  20214         /*
  20215          * Get entry index at which flex STAT information
  20216          * has been programmed in policy table.
  20217          */
  20218         if (_FP_ENTRY_STAT_INSTALLED ==
  20219            (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) {
  20220             BCM_IF_ERROR_RETURN
  20221                 (_bcm_field_slice_offset_to_tcam_idx(unit,
  20222                                                  stage_fc,
  20223                                                  f_ent->group->instance,
  20224                                                  f_ent->fs->slice_number,
  20225                                                  f_ent->slice_idx,
  20226                                                  &entry_idx
  20227                                                  ));
  20228 
  20229             /*
  20230              * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes,
  20231              * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries.
  20232              * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and
  20233              * entries are 1:1 mapped.
  20234              */
  20235             if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) &&
  20236                 (f_ent->fs->stage_id == _BCM_FIELD_STAGE_INGRESS) &&
  20237                 (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE)
  20238                 || (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) {
  20239                 entry_idx = entry_idx + (f_ent->fs->slice_number * 256);
  20240             }
  20241 
  20242             /* Disassociate flex counters from the IFP policy table entry
  20243              * they are attached to. Once detached, the flex counters are
  20244              * no longer updated even if matching traffic
  20245              * hits the corresponding IFP policy table entry.
  20246              */
  20247             rv = _bcm_esw_stat_flex_detach_ingress_table_counters
  20248                     (unit,
  20249                      mem,
  20250                      entry_idx
  20251                      );
  20252             /*
  20253              * Flex STATs module initialized before field module, ignore
  20254              * error during bcm_field_detach().
  20255              */
  20256             if (BCM_FAILURE(rv) && (TRUE == fc->init)) {
  20257                 return (rv);
  20258             }
  20259         }
  20260 
  20261         if (!(f_st->hw_flags & _FP_STAT_CREATED_BY_FLEX_MODULE)) {
  20262           /*
  20263            * Release counter resources and perform associated cleanup in flex
  20264            * stat module. This function must be called, once the associated
  20265            * statistics collection function is no longer needed and the
  20266            * reserved counter resources can be freed for use by other
  20267            * applications. Once this function is called, the counters
  20268            * associated with the given stat counter id are no longer
  20269            * available for any further stat collection.
  20270            */
  20271            rv = bcm_esw_stat_group_destroy(unit, f_st->flex_mode);
  20272 
  20273           /*
  20274            * Flex STATs module initialized before field module, ignore
  20275            * error during bcm_field_detach().
  20276            * Ignore:BCM_E_INTERNAL(as multiple stat entries use same SingleMode
  20277            */
  20278            if (rv == BCM_E_INTERNAL) {
  20279               /* Doesn't look appropriate error code but */
  20280               rv = BCM_E_NONE;
  20281            }
  20282            if (BCM_FAILURE(rv) && (TRUE == fc->init)) {
  20283               return (rv);
  20284            }
  20285         }
  20286 
  20287         /* Check and if required disassociate counter pools from the group. */
  20288         rv = _bcm_field_th_group_counter_pbm_clear(unit, f_ent,
  20289                                                    f_st->pool_index);
  20290         BCM_IF_ERROR_RETURN(rv);
  20291 
  20292         /* decrement the group's counter count equal to
  20293            the hw counters used for this stat */
  20294         f_ent->group->group_status.counter_count =
  20295              f_ent->group->group_status.counter_count - f_st->hw_entry_count;
  20296 
  20297         /* Reset the field stat attributes. */
  20298         f_st->hw_index   = _FP_INVALID_INDEX;
  20299         f_st->pool_index = _FP_INVALID_INDEX;
  20300         f_st->hw_entry_count = 0;
  20301         f_st->flex_mode = 0;
  20302     }
  20303 
  20304     return (BCM_E_NONE);
  20305 }
  20306 
  20307 /*
  20308  * Function:
  20309  *  _bcm_field_th_em_flex_counter_free
  20310  * Purpose:
  20311  *  Free flex counter resources used by em field entry/entries.
  20312  * Parameters:
  20313  *  unit     - (IN) BCM device number.
  20314  *  f_ent    - (IN) Entry array policer belongs to.
  20315  *  f_st     - (IN) Statistics entity.
  20316  *  mem      - (IN) Policy Table name.
  20317  * Returns:
  20318  *  BCM_E_XXX
  20319  */
  20320 int
  20321 _bcm_field_th_em_flex_counter_free(int unit,
  20322                                    _field_entry_t *f_ent,
  20323                                    _field_stat_t *f_st, soc_mem_t mem)
  20324 {
  20325     int              rv; /* Operational status. */
  20326     _field_control_t *fc; /* Field Control Structure. */
  20327     _field_stage_t   *stage_fc; /* Field Stage structure.*/
  20328     _field_entry_stat_t  *f_ent_st;  /* Field entry statistics structure. */
  20329 
  20330     if (NULL == f_ent || NULL == f_st || INVALIDm == mem) {
  20331         return BCM_E_PARAM;
  20332     }
  20333 
  20334     f_ent_st = &f_ent->statistic;
  20335 
  20336     /* Get pipeline stage information. */
  20337     BCM_IF_ERROR_RETURN
  20338         (_field_stage_control_get(unit,
  20339                                   f_ent->group->stage_id,
  20340                                   &stage_fc));
  20341 
  20342     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  20343 
  20344     /* Detach flex stat only if it has been created. */
  20345     if (f_st->flex_mode != 0) {
  20346         if (_FP_ENTRY_STAT_INSTALLED ==
  20347            (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) {
  20348             rv = _bcm_esw_stat_flex_detach_ingress_table_counters_sw(unit,
  20349                            mem, 0, f_st->hw_mode, f_st->hw_index,
  20350                            f_st->pool_index);
  20351             /*
  20352              * Flex STATs module initialized before field module, ignore
  20353              * error during bcm_field_detach().
  20354              */
  20355             if (BCM_FAILURE(rv) && (TRUE == fc->init)) {
  20356                 return (rv);
  20357             }
  20358         }
  20359 
  20360         if (!(f_st->hw_flags & _FP_STAT_CREATED_BY_FLEX_MODULE)) {
  20361             /*
  20362              * Release counter resources and perform associated cleanup in flex
  20363              * stat module. This function must be called, once the associated
  20364              * statistics collection function is no longer needed and the reserved
  20365              * counter resources can be freed for use by other applications. Once
  20366              * this function is called, the counters associated with the given stat
  20367              * counter id are no longer available for any further stat collection.
  20368              */
  20369             rv = bcm_esw_stat_group_destroy(unit, f_st->flex_mode);
  20370 
  20371             /*
  20372              * Flex STATs module initialized before field module, ignore
  20373              * error during bcm_field_detach().
  20374              * Ignore:BCM_E_INTERNAL (as multiple stat entries use same SingleMode
  20375              */
  20376             if (rv == BCM_E_INTERNAL) {
  20377                 /* Doesn't look appropriate error code but */
  20378                 rv = BCM_E_NONE;
  20379             }
  20380             if (BCM_FAILURE(rv) && (TRUE == fc->init)) {
  20381                 return (rv);
  20382             }
  20383         }
  20384 
  20385         /* Check and if required disassociate counter pools from the group. */
  20386         rv = _bcm_field_th_group_counter_pbm_clear(unit, f_ent,
  20387                                                    f_st->pool_index);
  20388         BCM_IF_ERROR_RETURN(rv);
  20389 
  20390         /* decrement the group's counter count equal to
  20391            the hw counters used for this stat */
  20392         f_ent->group->group_status.counter_count =
  20393              f_ent->group->group_status.counter_count - f_st->hw_entry_count;
  20394 
  20395         /* Reset the field stat attributes. */
  20396         f_st->hw_index   = _FP_INVALID_INDEX;
  20397         f_st->pool_index = _FP_INVALID_INDEX;
  20398         f_st->hw_entry_count = 0;
  20399         f_st->flex_mode = 0;
  20400     }
  20401 
  20402     return (BCM_E_NONE);
  20403 }
  20404 
  20405 /*
  20406  * Function:
  20407  *     _field_th_stat_hw_free
  20408  *
  20409  * Purpose:
  20410  *     Deallocate hw counter from an entry for IFP and VFP stages.
  20411  *
  20412  * Parameters:
  20413  *     unit      - (IN) BCM device number.
  20414  *     f_ent     - (IN) Entry statistics belongs to.
  20415  * Returns:
  20416  *     BCM_E_XXX
  20417  */
  20418 STATIC int
  20419 _field_th_stat_hw_free (int unit, _field_entry_t *f_ent)
  20420 {
  20421     int                  rv;         /* Operation return status.          */
  20422     int                  idx;        /* Statistics iteration index.       */
  20423     int                  entry_idx;  /* Entry index at policy table       */
  20424     soc_mem_t            tcam_mem;   /* Tcam Table Name.                  */
  20425     soc_mem_t            policy_mem; /* Policy Table Name.                */
  20426     _field_stat_t        *f_st;      /* Statistics entity descriptor.     */
  20427     _field_stage_t       *stage_fc;  /* pipeline stage                    */
  20428     _field_control_t     *fc;        /* Field Control Structure.          */
  20429     _field_entry_stat_t  *f_ent_st;  /* Field entry statistics structure. */
  20430 
  20431     /* Input parameters check. */
  20432     if (NULL == f_ent) {
  20433         return (BCM_E_PARAM);
  20434     }
  20435 
  20436     f_ent_st = &f_ent->statistic;
  20437     /* Skip uninstalled statistics entity.*/
  20438     if (0 == (f_ent_st->flags & _FP_ENTRY_STAT_VALID)) {
  20439         return (BCM_E_NONE);
  20440     }
  20441 
  20442     /* Get pipeline stage information. */
  20443     BCM_IF_ERROR_RETURN
  20444         (_field_stage_control_get(unit,
  20445                                   f_ent->group->stage_id,
  20446                                   &stage_fc
  20447                                   )
  20448         );
  20449 
  20450     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  20451 
  20452     /* Read stat entity configuration. */
  20453     BCM_IF_ERROR_RETURN(_bcm_field_stat_get(unit, f_ent_st->sid, &f_st));
  20454 
  20455     BCM_IF_ERROR_RETURN(_bcm_field_th_tcam_policy_mem_get(unit, f_ent,
  20456                                                       &tcam_mem, &policy_mem));
  20457 
  20458     if (_FP_ENTRY_STAT_INSTALLED ==
  20459            (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) {
  20460         /* Decrement hw reference count. */
  20461         if (f_st->hw_ref_count > 0) {
  20462             f_st->hw_ref_count--;
  20463             if (f_st->flex_mode != 0 && f_st->hw_ref_count > 0) {
  20464                 /*
  20465                  * Get entry index at which flex STAT information
  20466                  * has been programmed in policy table.
  20467                  */
  20468                 BCM_IF_ERROR_RETURN
  20469                     (_bcm_field_slice_offset_to_tcam_idx(unit,
  20470                                                  stage_fc,
  20471                                                  f_ent->group->instance,
  20472                                                  f_ent->fs->slice_number,
  20473                                                  f_ent->slice_idx,
  20474                                                  &entry_idx
  20475                                                  ));
  20476 
  20477                /*
  20478                 * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes,
  20479                 * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries.
  20480                 * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and
  20481                 * entries are 1:1 mapped.
  20482                 */
  20483                if ((SOC_IS_TOMAHAWKX(unit) && (!SOC_IS_TOMAHAWK3(unit)) &&
  20484                    (f_ent->fs->stage_id == _BCM_FIELD_STAGE_INGRESS) &&
  20485                    (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE)
  20486                    || (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE))
  20487                    )) {
  20488                    entry_idx = entry_idx + (f_ent->fs->slice_number * 256);
  20489                }
  20490 
  20491                /* Disassociate flex counters from the IFP policy table entry
  20492                 * they are attached to. Once detached, the flex counters are
  20493                 * no longer updated even if matching traffic hits
  20494                 *  the corresponding IFP policy table entry.
  20495                 */
  20496                 rv = _bcm_esw_stat_flex_detach_ingress_table_counters
  20497                         (unit,
  20498                          policy_mem,
  20499                          entry_idx
  20500                          );
  20501                 /*
  20502                  * Flex STAT module detached before field module, ignore
  20503                  * error during bcm_field_detach().
  20504                  */
  20505                 if (BCM_FAILURE(rv) && (TRUE == fc->init)) {
  20506                     return (rv);
  20507                 }
  20508             }
  20509         }
  20510     }
  20511 
  20512     /* Statistics is not used by any other entry. */
  20513     if (f_st->hw_ref_count == 0) {
  20514         /*
  20515          * Retrieve the stat values only during run time.
  20516          * It doesn't need to be maintained during field init/detach.
  20517          */
  20518         if (_FP_ENTRY_STAT_INSTALLED ==
  20519                  (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) {
  20520             if (fc->init == TRUE) {
  20521                 /* Read & Reset  individual statistics. */
  20522                 for (idx = 0; idx < f_st->nstat; idx++) {
  20523                     rv = _field_stat_value_get(unit, 0, f_st,
  20524                                              f_st->stat_arr[idx],
  20525                                              f_st->stat_values + idx);
  20526                     if (BCM_FAILURE(rv)) {
  20527                         /* During system restart flex stat module
  20528                          * might be reinitialized before fp reinit. Hence
  20529                          * calls to the flex stat module will result in
  20530                          * BCM_E_NOT_FOUND * error code.
  20531                          */
  20532                         if (0 == (((_BCM_FIELD_STAGE_INGRESS ==
  20533                                   f_st->stage_id) ||
  20534                                   (_BCM_FIELD_STAGE_LOOKUP == f_st->stage_id))
  20535                                   && (BCM_E_NOT_FOUND == rv))) {
  20536                             return rv;
  20537                         }
  20538                     }
  20539                 }
  20540             }
  20541         }
  20542 
  20543         /* Mark hw resource as unused in sw. */
  20544         rv = _bcm_field_th_flex_counter_free(unit, f_ent, f_st, policy_mem);
  20545         BCM_IF_ERROR_RETURN(rv);
  20546     }
  20547 
  20548     /*
  20549      * If qualifiers have not been modified for this entry,
  20550      * set Action only dirty flag.
  20551      */
  20552     if (_FP_ENTRY_STAT_INSTALLED ==
  20553          (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) {
  20554         if (0 == (f_ent->flags & _FP_ENTRY_DIRTY)) {
  20555             f_ent->flags |= _FP_ENTRY_POLICY_TABLE_ONLY_DIRTY;
  20556         }
  20557 
  20558         f_ent_st->flags &= ~_FP_ENTRY_STAT_INSTALLED;
  20559 
  20560         /* Mark entry for reinstall. */
  20561         f_ent->flags |= _FP_ENTRY_DIRTY;
  20562     }
  20563     return (BCM_E_NONE);
  20564 }
  20565 
  20566 /*
  20567  * Function:
  20568  *  _field_th_em_stat_hw_free
  20569  * Purpose:
  20570  *  Deallocate hw counter from an entry for exact match stage.
  20571  * Parameters:
  20572  *  unit      - (IN) BCM device number.
  20573  *  f_ent     - (IN) Entry statistics belongs to.
  20574  * Returns:
  20575  *  BCM_E_XXX
  20576  */
  20577 STATIC int
  20578 _field_th_em_stat_hw_free (int unit, _field_entry_t *f_ent)
  20579 {
  20580     int                  rv;         /* Operation return status.          */
  20581     int                  idx;        /* Statistics iteration index.       */
  20582     soc_mem_t            tcam_mem;   /* Tcam Table Name.                  */
  20583     soc_mem_t            policy_mem; /* Policy Table Name.                */
  20584     _field_stat_t        *f_st;      /* Statistics entity descriptor.     */
  20585     _field_stage_t       *stage_fc;  /* pipeline stage                    */
  20586     _field_control_t     *fc;        /* Field Control Structure.          */
  20587     _field_entry_stat_t  *f_ent_st;  /* Field entry statistics structure. */
  20588 
  20589     /* Input parameters check. */
  20590     if (NULL == f_ent) {
  20591         return (BCM_E_PARAM);
  20592     }
  20593 
  20594     f_ent_st = &f_ent->statistic;
  20595     /* Skip uninstalled statistics entity. */
  20596     if (0 == (f_ent_st->flags & _FP_ENTRY_STAT_VALID)) {
  20597         return (BCM_E_NONE);
  20598     }
  20599 
  20600     /* Get pipeline stage information. */
  20601     BCM_IF_ERROR_RETURN
  20602         (_field_stage_control_get(unit,
  20603                                   f_ent->group->stage_id,
  20604                                   &stage_fc));
  20605 
  20606     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  20607 
  20608     /* Read stat entity configuration. */
  20609     BCM_IF_ERROR_RETURN(_bcm_field_stat_get(unit, f_ent_st->sid, &f_st));
  20610 
  20611     BCM_IF_ERROR_RETURN(_bcm_field_th_tcam_policy_mem_get(unit, f_ent,
  20612                                                 &tcam_mem, &policy_mem));
  20613     if (_FP_ENTRY_STAT_INSTALLED ==
  20614                (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) {
  20615         /* Decrement hw reference count. */
  20616         if (f_st->hw_ref_count > 0) {
  20617             f_st->hw_ref_count--;
  20618             if (f_st->flex_mode != 0 && f_st->hw_ref_count > 0) {
  20619 
  20620                 /* Disassociate flex counters from the EM table entry
  20621                  * they are attached to. Once detached, the flex counters are
  20622                  * no longer updated even if matching traffic
  20623                  *  hits the corresponding EM table entry.
  20624                  */
  20625                 rv = _bcm_esw_stat_flex_detach_ingress_table_counters_sw(unit,
  20626                             policy_mem, 0,
  20627                             f_st->hw_mode, f_st->hw_index, f_st->pool_index);
  20628                 /*
  20629                  * Flex STAT module detached before field module, ignore
  20630                  * error during bcm_field_detach().
  20631                  */
  20632                 if (BCM_FAILURE(rv) && (TRUE == fc->init)) {
  20633                     return (rv);
  20634                 }
  20635             }
  20636         }
  20637     }
  20638     /* Statistics is not used by any other entry. */
  20639     if (f_st->hw_ref_count == 0) {
  20640         /*
  20641          * Retrieve the stat values only during run time.
  20642          * It doesn't need to be maintained during field init/detach.
  20643          */
  20644         if (_FP_ENTRY_STAT_INSTALLED ==
  20645                  (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) {
  20646             if (fc->init == TRUE) {
  20647                 for (idx = 0; idx < f_st->nstat; idx++) {
  20648                     rv = _field_stat_value_get(unit, 0, f_st,
  20649                             f_st->stat_arr[idx],
  20650                             f_st->stat_values + idx);
  20651                     if (BCM_FAILURE(rv)) {
  20652                         /* During system restart flex stat module
  20653                          * might be reinitialized before fp reinit. Hence
  20654                          * calls to the flex stat module will result in
  20655                          * BCM_E_NOT_FOUND * error code.
  20656                          */
  20657                         if (0 == (((_BCM_FIELD_STAGE_INGRESS ==
  20658                                    f_st->stage_id) ||
  20659                                    (_BCM_FIELD_STAGE_EXACTMATCH ==
  20660                                    f_st->stage_id) ||
  20661                                    (_BCM_FIELD_STAGE_LOOKUP ==
  20662                                    f_st->stage_id))
  20663                                    && (BCM_E_NOT_FOUND == rv))) {
  20664                             return rv;
  20665                         }
  20666                     }
  20667                 }
  20668             }
  20669         }
  20670 
  20671         /* Mark hw resource as unused in sw. */
  20672         rv = _bcm_field_th_em_flex_counter_free(unit, f_ent, f_st, policy_mem);
  20673         BCM_IF_ERROR_RETURN(rv);
  20674     }
  20675 
  20676     /*
  20677      * If qualifiers have not been modified for this entry,
  20678      * set Action only dirty flag.
  20679      */
  20680     if (_FP_ENTRY_STAT_INSTALLED ==
  20681          (f_ent_st->flags & _FP_ENTRY_STAT_INSTALLED)) {
  20682         if (0 == (f_ent->flags & _FP_ENTRY_DIRTY)) {
  20683             f_ent->flags |= _FP_ENTRY_POLICY_TABLE_ONLY_DIRTY;
  20684         }
  20685 
  20686         f_ent_st->flags &= ~_FP_ENTRY_STAT_INSTALLED;
  20687 
  20688         /* Mark entry for reinstall. */
  20689         f_ent->flags |= _FP_ENTRY_DIRTY;
  20690     }
  20691     return (BCM_E_NONE);
  20692 }
  20693 
  20694 /*
  20695  * Function:
  20696  *     _bcm_field_th_stat_hw_free
  20697  *
  20698  * Purpose:
  20699  *     Deallocate hw counter from an entry.
  20700  *
  20701  * Parameters:
  20702  *     unit      - (IN) BCM device number.
  20703  *     f_ent     - (IN) Entry statistics belongs to.
  20704  * Returns:
  20705  *     BCM_E_XXX
  20706  */
  20707 int
  20708 _bcm_field_th_stat_hw_free(int unit, _field_entry_t *f_ent)
  20709 {
  20710     int rv = BCM_E_INTERNAL; /* Operational Status. */
  20711 
  20712     if (NULL == f_ent) {
  20713         return BCM_E_PARAM;
  20714     }
  20715 
  20716     switch (f_ent->fs->stage_id) {
  20717        case _BCM_FIELD_STAGE_INGRESS:
  20718          if (soc_feature(unit, soc_feature_ifp_action_profiling)) {
  20719              rv = _field_th_em_stat_hw_free(unit, f_ent);
  20720          } else {
  20721              rv = _field_th_stat_hw_free(unit, f_ent);
  20722          }
  20723          break;
  20724        case _BCM_FIELD_STAGE_LOOKUP:
  20725          rv = _field_th_stat_hw_free(unit, f_ent);
  20726          break;
  20727        case _BCM_FIELD_STAGE_EXACTMATCH:
  20728          rv = _field_th_em_stat_hw_free(unit, f_ent);
  20729          break;
  20730        case _BCM_FIELD_STAGE_EGRESS:
  20731 #if defined BCM_TRIDENT3_SUPPORT
  20732          if (soc_feature(unit, soc_feature_td3_style_fp)) {
  20733             rv = _bcm_field_td2plus_stat_hw_free(unit, f_ent);
  20734          } else
  20735 #endif /* BCM_TRIDENT3_SUPPORT */
  20736          {
  20737             rv = _bcm_field_stat_hw_free(unit, f_ent);
  20738          }
  20739          break;
  20740        default:
  20741          rv = _bcm_field_stat_hw_free(unit, f_ent);
  20742          break;
  20743     }
  20744     return rv;
  20745 }
  20746 /*
  20747  * Function:
  20748  *     _bcm_field_stat_array_get
  20749  *
  20750  * Purpose:
  20751  *     Get field stat types array from flex stat attribute array.
  20752  *
  20753  * Parameters:
  20754  *     unit        - (IN) BCM device number.
  20755  *     nattr       - (IN) Number of attributes.
  20756  *     stat_attr   - (IN) Flex stat attribute array.
  20757  *     nstat       - (OUT) Number of field stat types.
  20758  *     stata_arr   - (OUT) Field stat array.
  20759  * Returns:
  20760  *     BCM_E_XXX
  20761  */
  20762 int
  20763 _bcm_field_stat_array_get(int unit,
  20764                           uint32 nattr,
  20765                           bcm_stat_group_mode_attr_selector_t *stat_attr,
  20766                           int *nstat, bcm_field_stat_t *stat_arr)
  20767 {
  20768      int idx = 0; /* Index Variable. */
  20769      int packets = -1;  /* Al coloreed packets. */
  20770      int bytes = -1;    /* All colored bytes. */
  20771      int g_packets = -1; /* Green Packets. */
  20772      int y_packets = -1; /* Yellow Packets. */
  20773      int r_packets = -1; /* Red Packets. */
  20774      int g_bytes = -1; /* Green Bytes. */
  20775      int y_bytes = -1; /* Yellow Bytes. */
  20776      int r_bytes = -1; /* Red Bytes. */
  20777      int ng_packets = -1; /* Not Green Packets. */
  20778      int ny_packets = -1; /* Not Yellow Packets. */
  20779      int nr_packets = -1; /* Not Red Packets. */
  20780      int ng_bytes = -1; /* Not Green Bytes. */
  20781      int ny_bytes = -1; /* Not Yellow Bytes. */
  20782      int nr_bytes = -1; /* Not Red Bytes. */
  20783      int g_offset = -1; /* Green counter offset. */
  20784      int y_offset = -1; /* Yellow Counter Offset. */
  20785      int r_offset = -1; /* Red Counter Offset. */
  20786      int color = 0; /* Bitmap of G, Y and R colors. */
  20787      int g_present = 0; /* Green Packets Present. */
  20788      int y_present = 0; /* Yellow Packets Present. */
  20789      int r_present = 0; /* Red Packets Present. */
  20790 
  20791      /* Parameters Check. */
  20792 
  20793      /* Max number of attributes for any flex stat Id should not excced 3, as
  20794       * the max counters attached to an ifp entry doesnot exceed 3.
  20795       */
  20796      if (nattr <= 0 || nattr > 3) {
  20797          return BCM_E_PARAM;
  20798      }
  20799 
  20800      if (NULL == nstat || NULL == stat_attr || NULL == stat_arr) {
  20801          return BCM_E_PARAM;
  20802      }
  20803 
  20804      *nstat = 0;
  20805 
  20806      /* Get the flex stat Colors and flex stat counters offsets.  */
  20807      for (idx = 0; idx < nattr; idx++) {
  20808          if (NULL != (stat_attr + idx)) {
  20809              if (bcmColorGreen == (stat_attr + idx)->attr_value) {
  20810                  g_present = 1;
  20811                  g_offset = (stat_attr + idx)->counter_offset;
  20812              } else if (bcmColorYellow == (stat_attr + idx)->attr_value) {
  20813                  y_present = 1;
  20814                  y_offset = (stat_attr + idx)->counter_offset;
  20815              } else if (bcmColorRed == (stat_attr + idx)->attr_value) {
  20816                  r_present = 1;
  20817                  r_offset = (stat_attr + idx)->counter_offset;
  20818              }
  20819          }
  20820      }
  20821 
  20822      color = (r_present << 2) | (y_present << 1) | g_present;
  20823 
  20824      switch (color) {
  20825          case 1:
  20826              /* If flex Stat has bcmColorGreen, then include Green Packets and
  20827               * Green Bytes into field stat types.
  20828               */
  20829              if (-1 != g_offset) {
  20830                  g_packets = 1;
  20831                  g_bytes = 1;
  20832                  *nstat = 2;
  20833              } else {
  20834                  return BCM_E_INTERNAL;
  20835              }
  20836              break;
  20837          case 2:
  20838              /* If flex Stat has bcmColorYellow, then include Yellow Packets and
  20839               * Yellow Bytes into field stat types.
  20840               */
  20841              if (-1 != y_offset) {
  20842                  y_packets = 1;
  20843                  y_bytes = 1;
  20844                  *nstat = 2;
  20845              } else {
  20846                  return BCM_E_INTERNAL;
  20847              }
  20848              break;
  20849          case 3:
  20850              /* flex stat has both bcmColorGreen and bcmColorYellow. */
  20851              if (-1 != g_offset && -1 != y_offset) {
  20852                  /* If flex stat has both bcmColorGreen and bcmColorYellow,
  20853                   * and corrsponding counter offsets are same include
  20854                   * NotRedPackets and NotRedBytes into field stat types.
  20855                   */
  20856                  if (g_offset == y_offset) {
  20857                      nr_packets = 1;
  20858                      nr_bytes = 1;
  20859                      *nstat = 2;
  20860                  } else {
  20861                      /* If flex stat has both bcmColorGreen and bcmColorYellow,
  20862                       * and corrsponding counter offsets are not same include
  20863                       * GreenPackets, GreenBytes, YellowPackets and YellowBytes
  20864                       * into field stat types.
  20865                       */
  20866                      g_packets = 1;
  20867                      g_bytes = 1;
  20868                      y_packets = 1;
  20869                      y_bytes = 1;
  20870                      *nstat = 4;
  20871                  }
  20872              } else {
  20873                  return BCM_E_INTERNAL;
  20874              }
  20875              break;
  20876          case 4:
  20877              /* If flex Stat has bcmColorYellow, then include Yellow Packets and
  20878               * Yellow Bytes into field stat types.
  20879               */
  20880              if (-1 != r_offset) {
  20881                  r_packets = 1;
  20882                  r_bytes = 1;
  20883                  *nstat = 2;
  20884              } else {
  20885                  return BCM_E_INTERNAL;
  20886              }
  20887              break;
  20888          case 5:
  20889              /* flex stat has both bcmColorGreen and bcmColorRed. */
  20890              if (-1 != g_offset && -1 != r_offset) {
  20891                  if (g_offset == r_offset) {
  20892                      /* If flex stat has both bcmColorGreen and bcmColorRed,
  20893                       * and corrsponding counter offsets are same include
  20894                       * NotYellowPackets and NotYellowBytes into field stat
  20895                       * types.
  20896                       */
  20897                      ny_packets = 1;
  20898                      ny_bytes = 1;
  20899                      *nstat = 2;
  20900                  } else {
  20901                      /* If flex stat has both bcmColorGreen and bcmColorRed,
  20902                       * and corrsponding counter offsets are not same include
  20903                       * GreenPackets, GreenBytes, RedPackets and RedBytes
  20904                       * into field stat types.
  20905                       */
  20906                      g_packets = 1;
  20907                      g_bytes = 1;
  20908                      r_packets = 1;
  20909                      r_bytes = 1;
  20910                      *nstat = 4;
  20911                  }
  20912              } else {
  20913                  return BCM_E_INTERNAL;
  20914              }
  20915              break;
  20916          case 6:
  20917              /* flex stat has both bcmColorYellow and bcmColorRed. */
  20918              if (-1 != r_offset && -1 != y_offset) {
  20919                  if (r_offset == y_offset) {
  20920                      /* If flex stat has both bcmColorYellow and bcmColorRed,
  20921                       * and corrsponding counter offsets are same include
  20922                       * NotGreenPackets and NotGreenBytes into field stat
  20923                       * types.
  20924                       */
  20925                      ng_packets = 1;
  20926                      ng_bytes = 1;
  20927                      *nstat = 2;
  20928                  } else {
  20929                      /* If flex stat has both bcmColorGreen and bcmColorRed,
  20930                       * and corrsponding counter offsets are not same include
  20931                       * YellowPackets, YellowBytes, RedPackets and RedBytes
  20932                       * into field stat types.
  20933                       */
  20934                      r_packets = 1;
  20935                      r_bytes = 1;
  20936                      y_packets = 1;
  20937                      y_bytes = 1;
  20938                      *nstat = 4;
  20939                  }
  20940              } else {
  20941                  return BCM_E_INTERNAL;
  20942              }
  20943              break;
  20944          case 7:
  20945              /* flex stat has ColorGreen , ColorYellow and ColorRed. */
  20946              if (-1 != g_offset && -1 != y_offset && -1 != r_offset) {
  20947                  if (g_offset == y_offset && g_offset == r_offset) {
  20948                      /* Flex stat has bcmColorGreen ,bcmColorYellow and
  20949                       * bcmColorRed, and corrsponding counter offsets are same
  20950                       * include Packets and Bytes into field stat
  20951                       * types.
  20952                       */
  20953                      packets = 1;
  20954                      bytes = 1;
  20955                      *nstat = 2;
  20956                  } else if (g_offset == y_offset && g_offset != r_offset) {
  20957                      /* Flex stat has bcmColorGreen ,bcmColorYellow and
  20958                       * bcmColorRed. Green and Yellow counter offsets are same
  20959                       * but have different red counter offset then include
  20960                       * NotRedPackets, NotRedBytes, RedPackets and RedBytes into
  20961                       * field stat types.
  20962                       */
  20963                      nr_packets = 1;
  20964                      nr_bytes = 1;
  20965                      r_packets = 1;
  20966                      r_bytes = 1;
  20967                      *nstat = 4;
  20968                  } else if (g_offset != y_offset && g_offset == r_offset) {
  20969                      /* Flex stat has bcmColorGreen ,bcmColorYellow and
  20970                       * bcmColorRed. Green and Red counter offsets are same
  20971                       * but have different Yellow counter offset then include
  20972                       * NotYellowPackets, NotYellowBytes, YellowPackets and
  20973                       * YellowBytes into field stat types.
  20974                       */
  20975                      ny_packets = 1;
  20976                      ny_bytes = 1;
  20977                      y_packets = 1;
  20978                      y_bytes = 1;
  20979                      *nstat = 4;
  20980                  } else if(r_offset == y_offset && g_offset != r_offset) {
  20981                      /* Flex stat has bcmColorGreen ,bcmColorYellow and
  20982                       * bcmColorRed. Yellow and Red counter offsets are same
  20983                       * but have different Green counter offset then include
  20984                       * NotGreenPackets, NotGreenBytes, GreenPackets and
  20985                       * GreenBytes into field stat types.
  20986                       */
  20987                      ng_packets = 1;
  20988                      ng_bytes = 1;
  20989                      g_packets = 1;
  20990                      g_bytes = 1;
  20991                      *nstat = 4;
  20992                  } else if (r_offset != y_offset && g_offset != r_offset &&
  20993                             y_offset != g_offset) {
  20994                      /* Flex stat has bcmColorGreen ,bcmColorYellow and
  20995                       * bcmColorRed and corrsponding counter offsets are
  20996                       * different then include GreenPackets, GreenBytes,
  20997                       * YellowPackets, YellowBytes , NotGreenPackets,
  20998                       * NotGreenBytes, NotYellowPackets, NotYellowBYtes,
  20999                       * NoteRedPackets, NotRedBytes, Packets and Bytes into
  21000                       * field stat types.
  21001                       */
  21002                      g_packets = 1;
  21003                      g_bytes = 1;
  21004                      y_packets = 1;
  21005                      y_bytes = 1;
  21006                      r_packets = 1;
  21007                      r_bytes = 1;
  21008                      ng_packets = 1;
  21009                      ng_bytes = 1;
  21010                      ny_packets = 1;
  21011                      ny_bytes = 1;
  21012                      nr_packets = 1;
  21013                      nr_bytes = 1;
  21014                      packets = 1;
  21015                      bytes = 1;
  21016                      *nstat = 14;
  21017                  }
  21018              } else {
  21019                  return BCM_E_INTERNAL;
  21020              }
  21021              break;
  21022          default:
  21023              return BCM_E_INTERNAL;
  21024      }
  21025 
  21026      /* Number field stat types cannot exceed 14 */
  21027      if (*nstat > 14) {
  21028          return BCM_E_INTERNAL;
  21029      }
  21030 
  21031      /* Update the field stat types belongs given flex stat attributes. */
  21032      idx = 0;
  21033      if (-1 != g_packets) {
  21034          *(stat_arr+ idx) = bcmFieldStatGreenPackets;
  21035          idx++;
  21036      }
  21037 
  21038      if (-1 != y_packets) {
  21039          *(stat_arr+ idx) = bcmFieldStatYellowPackets;
  21040          idx++;
  21041      }
  21042 
  21043      if (-1 != r_packets) {
  21044          *(stat_arr+ idx) = bcmFieldStatRedPackets;
  21045          idx++;
  21046      }
  21047 
  21048      if (-1 != g_bytes) {
  21049          *(stat_arr+ idx) = bcmFieldStatGreenBytes;
  21050          idx++;
  21051      }
  21052 
  21053      if (-1 != y_bytes) {
  21054          *(stat_arr+ idx) = bcmFieldStatYellowBytes;
  21055          idx++;
  21056      }
  21057 
  21058      if (-1 != r_bytes) {
  21059          *(stat_arr+ idx) = bcmFieldStatRedBytes;
  21060          idx++;
  21061      }
  21062 
  21063      if (-1 != ng_packets) {
  21064          *(stat_arr+ idx) = bcmFieldStatNotGreenPackets;
  21065          idx++;
  21066      }
  21067 
  21068      if (-1 != ny_packets) {
  21069          *(stat_arr+ idx) = bcmFieldStatNotYellowPackets;
  21070          idx++;
  21071      }
  21072 
  21073      if (-1 != nr_packets) {
  21074          *(stat_arr+ idx) = bcmFieldStatNotRedPackets;
  21075          idx++;
  21076      }
  21077 
  21078      if (-1 != ng_bytes) {
  21079          *(stat_arr+ idx) = bcmFieldStatNotGreenBytes;
  21080          idx++;
  21081      }
  21082 
  21083      if (-1 != ny_bytes) {
  21084          *(stat_arr+ idx) = bcmFieldStatNotYellowBytes;
  21085          idx++;
  21086      }
  21087 
  21088      if (-1 != nr_bytes) {
  21089          *(stat_arr+ idx) = bcmFieldStatNotRedBytes;
  21090          idx++;
  21091      }
  21092 
  21093      if (-1 != packets) {
  21094          *(stat_arr+ idx) = bcmFieldStatPackets;
  21095          idx++;
  21096      }
  21097 
  21098      if (-1 != bytes) {
  21099          *(stat_arr+ idx) = bcmFieldStatBytes;
  21100          idx++;
  21101      }
  21102 
  21103      return BCM_E_NONE;
  21104 }
  21105 /*
  21106  * Function:
  21107  *     _bcm_field_th_stat_attach
  21108  *
  21109  * Purpose:
  21110  *     Attach flex counters created using flex stat API's to fie;ld group.
  21111  *
  21112  * Parameters:
  21113  *     unit        - (IN) BCM device number.
  21114  *     field_group - (IN) Field Group Id.
  21115  *     flex_sid    - (IN) Flex stat Id created using flex stat API's.
  21116  *     stat_id     - (OUT) Field stat id mapped to flex_sid.
  21117  * Returns:
  21118  *     BCM_E_XXX
  21119  */
  21120 int
  21121 _bcm_field_th_stat_attach(int unit,
  21122                           bcm_field_group_t field_group,
  21123                           uint32 flex_sid, uint32 *stat_id)
  21124 {
  21125     int rv; /* Operational Status. */
  21126     int nstat;  /* Number of stats attached to stat id. */
  21127     int fp_stat_mode_max;  /* Max stat modes. */
  21128     uint8  idx; /* Index variable to carry loop count. */
  21129     uint32 pool_num;          /* Flex Stat Hw Pool No. */
  21130     uint32 base_index;        /* Flex Stat counter base index. */
  21131     uint32 num_hw_cntrs;      /* Number of counters allocated.   */
  21132     uint32 req_bmap;          /* Requested statistics bitmap.    */
  21133     uint32 hw_bmap;           /* HW supported statistics bitmap. */
  21134     uint32 nattr;             /* Number of flex stat attribute types. */
  21135     _field_stat_t *f_st;      /* Field statistics descriptor.   */
  21136     bcm_field_stat_t stat_arr[14]; /* Allowable stat types to attach. */
  21137     bcm_stat_group_mode_t   stat_mode;   /* Stat type bcmStatGroupModeXXX. */
  21138     bcm_stat_object_t       stat_obj; /* Stat object type. */
  21139     bcm_stat_flex_mode_t    offset_mode; /* Counter mode.     */
  21140     bcm_stat_flex_direction_t direction; /* Ingress/Egress Flex Stats. */
  21141     bcm_stat_group_mode_attr_selector_t stat_attr[3]; /* Flex stat attrs. */
  21142 
  21143 
  21144     /* Null parameter Check */
  21145     if (NULL == stat_id) {
  21146         return BCM_E_PARAM;
  21147     }
  21148 
  21149     BCM_IF_ERROR_RETURN(_bcm_esw_stat_id_validate(unit, flex_sid));
  21150 
  21151     /* Get flex counter hardware details stored in flex stat ID.*/
  21152     _bcm_esw_stat_get_counter_id_info(unit,
  21153                                       flex_sid,
  21154                                       &stat_mode,
  21155                                       &stat_obj,
  21156                                       &offset_mode,
  21157                                       &pool_num,
  21158                                       &base_index);
  21159 
  21160     /* Validate the stat object is in range. */
  21161     BCM_IF_ERROR_RETURN(_bcm_esw_stat_validate_object(unit,
  21162                                                       stat_obj, &direction));
  21163     /* Validate the stat mode. */
  21164     BCM_IF_ERROR_RETURN(_bcm_esw_stat_validate_group(unit, stat_mode));
  21165 
  21166     /* Validate stat object. */
  21167     if ((bcmStatObjectIngFieldStageIngress != stat_obj) &&
  21168         (bcmStatObjectIngFieldStageLookup != stat_obj) &&
  21169         (bcmStatObjectIngExactMatch != stat_obj)) {
  21170         LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META_U(unit,
  21171               "Retrieved object need to be bcmStatObjectFieldStageIngress or"
  21172               " bcmStatObjectIngFieldStageLookup or"
  21173               " bcmStatObjectIngExactMatch\n\r")));
  21174         return BCM_E_PARAM;
  21175     }
  21176 
  21177     if ((bcmStatObjectIngFieldStageIngress == stat_obj) ||
  21178         (bcmStatObjectIngExactMatch == stat_obj)){
  21179        /* Get flex stat attributes array for the given flex stat Id. */
  21180        rv = _bcm_flex_ctr_field_stat_types_get(unit, flex_sid,
  21181                                                stat_attr, &nattr);
  21182        BCM_IF_ERROR_RETURN(rv);
  21183 
  21184        sal_memset(stat_arr, 0, sizeof(stat_arr));
  21185 
  21186        /* Get the field stat types from flex stat attributes array. */
  21187        rv = _bcm_field_stat_array_get(unit, nattr, stat_attr, &nstat, stat_arr);
  21188        BCM_IF_ERROR_RETURN(rv);
  21189     } else {
  21190        nstat = 2;
  21191        stat_arr[0] = bcmFieldStatBytes;
  21192        stat_arr[1] = bcmFieldStatPackets;
  21193     }
  21194 
  21195     FP_LOCK(unit);
  21196 
  21197     /* Create field stat corrsponding to flext stat id. */
  21198     rv = bcm_esw_field_stat_create(unit, field_group, nstat,
  21199                                    stat_arr, (int *)stat_id);
  21200 
  21201     if (BCM_FAILURE(rv)) {
  21202         FP_UNLOCK(unit);
  21203         return (rv);
  21204     }
  21205 
  21206     /* Get the newly created stat operational structure. */
  21207     rv = _bcm_field_stat_get(unit, *stat_id, &f_st);
  21208     if(BCM_FAILURE(rv)) {
  21209        FP_UNLOCK(unit);
  21210        bcm_esw_field_stat_destroy(unit,*stat_id);
  21211        return rv;
  21212     }
  21213 
  21214     if ((bcmStatObjectIngFieldStageIngress == stat_obj) ||
  21215         (bcmStatObjectIngExactMatch == stat_obj)){
  21216        /* Get application requested bitmap. */
  21217        BCM_IF_ERROR_RETURN
  21218            (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap));
  21219 
  21220        fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl);
  21221 
  21222        for (idx = 0; idx < fp_stat_mode_max; idx++) {
  21223           hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap;
  21224           num_hw_cntrs = th_ingress_cntr_hw_mode_tbl[idx].hw_entry_count;
  21225 
  21226           if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) {
  21227              /*
  21228               * For maximizing utilization of hardware counters, this should
  21229               * select the hw_mode both supports the requested stats
  21230               * AND minimizes the number of required hardware counters.
  21231               */
  21232               break;
  21233           }
  21234        }
  21235     } else {
  21236        num_hw_cntrs = 1;
  21237     }
  21238 
  21239     /* Update the flex mode with flex stat id so that during entry installs
  21240      * h/w resources will not be allocated again. Also update the other
  21241      * Stat attributes.
  21242      */
  21243     f_st->flex_mode = flex_sid;
  21244     f_st->pool_index = pool_num;
  21245     f_st->hw_index = base_index;
  21246     f_st->hw_mode = offset_mode;
  21247     f_st->hw_entry_count = num_hw_cntrs;
  21248     f_st->hw_flags |= _FP_STAT_CREATED_BY_FLEX_MODULE;
  21249     FP_UNLOCK(unit);
  21250 
  21251     return BCM_E_NONE;
  21252 }
  21253 /*
  21254  * Function:
  21255  *     _bcm_field_group_flex_ctr_info_get
  21256  * Purpose:
  21257  *     To get the miscellaenous information about field group.
  21258  * Parameters:
  21259  *     unit      - (IN) BCM device number.
  21260  *     group     - (IN) Field groups Id.
  21261  *     instance  - (OUT) Pipe to which Field groupd belongs to.
  21262  *     counter_pool_bmp - (OUT) Bitmap of flex Counter pools in which
  21263  *                              counters are allocated for field group.
  21264  * Returns:
  21265  *     BCM_E_XXX
  21266  */
  21267 int
  21268 _bcm_field_group_flex_ctr_info_get(int unit,
  21269                                bcm_field_group_t group, int *instance,
  21270                                _field_counter_pool_bmp_t *counter_pool_bmp)
  21271 {
  21272     int rv;                           /* Operation Status.             */
  21273     _field_group_t *fg = NULL;        /* Group Operational Structure.  */
  21274     bcm_field_group_oper_mode_t mode; /* Stage Group operational mode. */
  21275     bcm_field_qualify_t stage;
  21276 
  21277     if (NULL == instance || NULL == counter_pool_bmp) {
  21278         return BCM_E_PARAM;
  21279     }
  21280 
  21281     /* Get the group operational structure. */
  21282     BCM_IF_ERROR_RETURN(_field_group_get(unit, group, &fg));
  21283 
  21284 
  21285     if (fg->stage_id == _BCM_FIELD_STAGE_INGRESS) {
  21286         stage = bcmFieldQualifyStageIngress;
  21287     } else if (fg->stage_id == _BCM_FIELD_STAGE_LOOKUP) {
  21288         stage = bcmFieldQualifyStageLookup;
  21289     } else if (fg->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
  21290         stage = bcmFieldQualifyStageIngressExactMatch;
  21291     }
  21292 #if defined(BCM_TRIDENT3_SUPPORT)
  21293     else if (soc_feature(unit, soc_feature_td3_style_fp) &&
  21294             (fg->stage_id == _BCM_FIELD_STAGE_EGRESS)) {
  21295         stage = bcmFieldQualifyStageEgress;
  21296     }
  21297 #endif
  21298     else {
  21299         return (BCM_E_PARAM);
  21300     }
  21301 
  21302     /* Get the field stage's group operational mode. */
  21303     rv = _bcm_field_th_group_oper_mode_get(unit, stage, &mode);
  21304     BCM_IF_ERROR_RETURN(rv);
  21305 
  21306     if (bcmFieldGroupOperModePipeLocal == mode) {
  21307         /* Group instance holds pipe to which this group belongs to. */
  21308         *instance = fg->instance;
  21309     } else if (bcmFieldGroupOperModeGlobal == mode) {
  21310         /* In global mode group instance is set to _FP_DEF_INST(= 0), So to
  21311          * dis ambiguate from pipe 0 in PipeLocal mode, instance is given back
  21312          * as -1.
  21313          */
  21314         *instance = _FP_GLOBAL_INST;
  21315     } else {
  21316         /* No other mode are supported. */
  21317         return BCM_E_INTERNAL;
  21318     }
  21319 
  21320     /* Copy counter pool bitmap from group operational structure. */
  21321     sal_memcpy(counter_pool_bmp, &fg->counter_pool_bmp,
  21322                     sizeof(_field_counter_pool_bmp_t));
  21323 
  21324     return BCM_E_NONE;
  21325 }
  21326 /*
  21327  * Function:
  21328  *     _bcm_field_group_flex_ctr_pool_bmp_update
  21329  * Purpose:
  21330  *     Update the counter pool bitmap of field group.
  21331  * Parameters:
  21332  *     unit      - (IN) BCM device number.
  21333  *     group     - (IN) Field groups Id.
  21334  *     pool_number - (IN) Flex counter pool number.
  21335  * Returns:
  21336  *     BCM_E_XXX
  21337  */
  21338 int
  21339 _bcm_field_group_flex_ctr_pool_bmp_update(int unit,
  21340                                          bcm_field_group_t group,
  21341                                          int pool_number)
  21342 {
  21343     _field_group_t *fg = NULL; /* Group Operational Structure.  */
  21344 
  21345     /* Get the group operational structure. */
  21346     BCM_IF_ERROR_RETURN(_field_group_get(unit, group, &fg));
  21347 
  21348     /*Update the group's flex counter pool bitmap. */
  21349     _FP_COUNTER_POOL_BMP_ADD(fg->counter_pool_bmp, pool_number);
  21350 
  21351     return BCM_E_NONE;
  21352 }
  21353 
  21354 /*
  21355  * Function:
  21356  *  _bcm_field_th_em_color_offset_get
  21357  * Purpose:
  21358  *  Get Color offsets for given field stat entry.
  21359  * Parameters:
  21360  *  unit           - (IN) BCM device number.
  21361  *  f_st           - (IN) Field Stat Entry.
  21362  *  green_offset   - (OUT) Green Color Offset.
  21363  *  yellow_offset  - (OUT) Yellow Color Offset.
  21364  *  red_offset     - (OUT) Red Color Offset.
  21365  * Returns:
  21366  *  BCM_E_XXX
  21367  */
  21368 int
  21369 _bcm_field_th_em_color_offset_get(int unit, _field_stat_t *f_st,
  21370                                            uint32 *green_offset,
  21371                                           uint32 *yellow_offset,
  21372                                              uint32 *red_offset)
  21373 {
  21374     int rv = BCM_E_NONE;      /* Return Operational Status.      */
  21375     uint32 req_bmap;          /* Requested statistics bitmap.    */
  21376     uint8  idx;               /* HW counter modes iterator.      */
  21377     uint32 hw_bmap;           /* HW supported statistics bitmap. */
  21378     _field_stat_color_t  color;
  21379                               /* Flex Stat Mode in s/w.          */
  21380     int    fp_stat_mode_max;  /* Max stat modes.                 */
  21381 
  21382     /* Input Parameter Check. */
  21383     if ((f_st == NULL) ||
  21384         (green_offset == NULL) ||
  21385         (yellow_offset == NULL) ||
  21386         (red_offset == NULL)) {
  21387         return (BCM_E_INTERNAL);
  21388     }
  21389 
  21390     /* Get application requested bitmap. */
  21391     BCM_IF_ERROR_RETURN
  21392         (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap));
  21393 
  21394     /* If bitmap is zero - no mode selection is required. */
  21395     if (0 == req_bmap) {
  21396         LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  21397                         "FP(unit %d): No Valid stats.\n "), unit));
  21398         return BCM_E_INTERNAL;
  21399     }
  21400 
  21401     fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl);
  21402 
  21403     for (idx = 0; idx < fp_stat_mode_max; idx++) {
  21404         hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap;
  21405         color = th_ingress_cntr_hw_mode_tbl[idx].color;
  21406 
  21407         if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) {
  21408             /*
  21409              * For maximizing utilization of hardware counters, this should
  21410              * select the hw_mode both supports the requested stats
  21411              * AND minimizes the number of required hardware counters.
  21412              */
  21413             break;
  21414         }
  21415     }
  21416 
  21417     if (idx >= fp_stat_mode_max) {
  21418         return (BCM_E_INTERNAL);
  21419     }
  21420 
  21421     switch (color) {
  21422         case _bcmFieldStatColorGreen:
  21423             *green_offset = 1;
  21424             *yellow_offset = 0;
  21425             *red_offset = 0;
  21426             break;
  21427         case _bcmFieldStatColorYellow:
  21428             *green_offset = 0;
  21429             *yellow_offset = 1;
  21430             *red_offset = 0;
  21431             break;
  21432         case _bcmFieldStatColorRed:
  21433             *green_offset = 0;
  21434             *yellow_offset = 0;
  21435             *red_offset = 1;
  21436             break;
  21437         case _bcmFieldStatColorNotGreen:
  21438             *green_offset = 0;
  21439             *yellow_offset = 1;
  21440             *red_offset = 1;
  21441             break;
  21442         case _bcmFieldStatColorNotYellow:
  21443             *green_offset = 1;
  21444             *yellow_offset = 0;
  21445             *red_offset = 1;
  21446             break;
  21447         case _bcmFieldStatColorNotRed:
  21448             *green_offset = 1;
  21449             *yellow_offset = 1;
  21450             *red_offset = 0;
  21451             break;
  21452         case _bcmFieldStatColorGreenYellow:
  21453             *green_offset = 1;
  21454             *yellow_offset = 2;
  21455             *red_offset = 0;
  21456             break;
  21457         case _bcmFieldStatColorGreenRed:
  21458             *green_offset = 1;
  21459             *yellow_offset = 0;
  21460             *red_offset = 2;
  21461             break;
  21462         case _bcmFieldStatColorYellowRed:
  21463             *green_offset = 0;
  21464             *yellow_offset = 1;
  21465             *red_offset = 2;
  21466             break;
  21467         case _bcmFieldStatColorGreenNotGreen:
  21468             *green_offset = 1;
  21469             *yellow_offset = 2;
  21470             *red_offset = 2;
  21471             break;
  21472         case _bcmFieldStatColorYellowNotYellow:
  21473             *green_offset = 2;
  21474             *yellow_offset = 1;
  21475             *red_offset = 2;
  21476             break;
  21477         case _bcmFieldStatColorRedNotRed:
  21478             *green_offset = 2;
  21479             *yellow_offset = 2;
  21480             *red_offset = 1;
  21481             break;
  21482         case _bcmFieldStatColorNoColor:
  21483             *green_offset = 1;
  21484             *yellow_offset = 1;
  21485             *red_offset = 1;
  21486             break;
  21487         case _bcmFieldStatColorGreenYellowRed:
  21488             *green_offset = 1;
  21489             *yellow_offset = 2;
  21490             *red_offset = 3;
  21491             break;
  21492         default:
  21493             return (BCM_E_INTERNAL);
  21494     }
  21495 
  21496     return (rv);
  21497 }
  21498 /*
  21499  * Function:
  21500  *  _bcm_field_th_flex_counter_info_get
  21501  * Purpose:
  21502  *  Get the free and total flex counters available for group.
  21503  * Parameters:
  21504  *  unit           - (IN) BCM device number.
  21505  *  fg             - (IN) Field Group.
  21506  *  counters_total - (OUT) Total Flex counters available for this group.
  21507  *  counters_free  - (OUT) Free Flex counters available for this group.
  21508  * Returns:
  21509  *  BCM_E_XXX
  21510  */
  21511 int
  21512 _bcm_field_th_flex_counter_status_get(int unit,
  21513                                       _field_group_t *fg,
  21514                                       int *counters_total,
  21515                                       int *counters_free)
  21516 {
  21517     int rv = BCM_E_NONE; /* Operational Status. */
  21518     int pipe_no = 0;
  21519     _field_stage_t  *stage_fc;  /* pipeline stage  */
  21520     uint8 idx = 0; /* Index to iterate through flex counter pools. */
  21521     uint32 num_pools = 0; /* Number of flex counter Pools. */
  21522     bcm_stat_flex_pool_stat_info_t *flex_pool_info; /* Flex stat pool Info. */
  21523 
  21524     if (NULL == fg || NULL == counters_total || NULL == counters_free) {
  21525         return BCM_E_PARAM;
  21526     }
  21527 
  21528     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg->stage_id,
  21529                            &stage_fc));
  21530    if(stage_fc->oper_mode == bcmFieldGroupOperModePipeLocal) {
  21531        pipe_no = fg->instance;
  21532    } else {
  21533        pipe_no = 0;
  21534    }
  21535 
  21536     flex_pool_info = NULL;
  21537     rv =_bcm_esw_stat_flex_pipe_pool_info_multi_get(unit,
  21538                                                bcmStatFlexDirectionIngress,
  21539                                                pipe_no, 0, flex_pool_info,
  21540                                                &num_pools);
  21541     BCM_IF_ERROR_RETURN(rv);
  21542 
  21543     /* Tomahawk has only 20 Ingress flex counter pools(from pool-0 - pool-19) */
  21544     if (num_pools > 20) {
  21545         return BCM_E_INTERNAL;
  21546     }
  21547 
  21548     _FP_XGS3_ALLOC(flex_pool_info,
  21549                    num_pools * sizeof(bcm_stat_flex_pool_stat_info_t),
  21550                    "Ingress Flex Pool Information");
  21551 
  21552     if (NULL == flex_pool_info) {
  21553         return BCM_E_MEMORY;
  21554     }
  21555 
  21556     rv = _bcm_esw_stat_flex_pipe_pool_info_multi_get(unit,
  21557                                                 bcmStatFlexDirectionIngress,
  21558                                                 pipe_no, num_pools,
  21559                                                 flex_pool_info, &num_pools);
  21560     if (BCM_FAILURE(rv)) {
  21561         sal_free(flex_pool_info);
  21562         return rv;
  21563     }
  21564 
  21565     *counters_free = 0;
  21566     *counters_total = 0;
  21567 
  21568     for (idx = 0; idx < num_pools; idx++) {
  21569 
  21570         /* Pools 12 to 19 are only dedicated to IFP. */
  21571         if ((_BCM_FIELD_STAGE_LOOKUP == fg->stage_id) &&
  21572             (flex_pool_info[idx].pool_id > 11)) {
  21573             continue;
  21574         }
  21575 
  21576         if (!flex_pool_info[idx].used_entries) {
  21577             *counters_free += flex_pool_info[idx].free_entries;
  21578             *counters_total += flex_pool_info[idx].total_entries;
  21579         } else {
  21580             *counters_total += flex_pool_info[idx].total_entries;
  21581             if (_FP_COUNTER_POOL_BMP_TEST(fg->counter_pool_bmp,
  21582                                           flex_pool_info[idx].pool_id)) {
  21583                *counters_free += flex_pool_info[idx].free_entries;
  21584             }
  21585         }
  21586     }
  21587 
  21588     sal_free(flex_pool_info);
  21589     return BCM_E_NONE;
  21590 }
  21591 /*
  21592  * Function:
  21593  *     _field_th_ingress_stat_hw_alloc
  21594  *
  21595  * Purpose:
  21596  *     Allocate flex stat hardware resource for Ingress stage
  21597  *
  21598  * Parameters:
  21599  *     unit      - (IN) BCM device number.
  21600  *     f_ent     - (IN) Entry array policer belongs to.
  21601  * Returns:
  21602  *     BCM_E_XXX
  21603  */
  21604 STATIC int
  21605 _field_th_ingress_stat_hw_alloc(int unit, _field_entry_t *f_ent)
  21606 {
  21607     int    rv;                /* Return Operational Status.      */
  21608     int    fp_stat_mode_max;  /* Max stat modes.                 */
  21609     uint8  idx;               /* HW counter modes iterator.      */
  21610     uint32 flex_sid;          /* Flex Stat ID.                   */
  21611     uint32 num_hw_cntrs;      /* Number of counters allocated.   */
  21612     uint32 pool_num;          /* Flex Stat Hw Pool No.           */
  21613     uint32 base_index;        /* Flex Stat counter base index.   */
  21614     uint32 num_selectors;     /* NUmber of flex attr slectors.   */
  21615     uint32 req_bmap;          /* Requested statistics bitmap.    */
  21616     uint32 hw_bmap;           /* HW supported statistics bitmap. */
  21617     uint32 mode_id;           /* Flex Stat Mode. */
  21618     uint32 num_counters;      /* Number of flex counters required. */
  21619     _field_stat_color_t     color;        /* Flex Stat Mode in s/w.         */
  21620     _field_entry_stat_t     *f_ent_st;    /* Field entry stat collector.    */
  21621     _field_stat_t           *f_st;        /* Field statistics descriptor.   */
  21622     bcm_stat_flex_mode_t    offset_mode;  /* Counter mode.                  */
  21623     bcm_stat_group_mode_t   stat_mode;    /* Stat type bcmStatGroupModeXXX. */
  21624     bcm_stat_object_t       stat_obj;     /* Stat object type.              */
  21625     bcm_stat_group_mode_id_config_t stat_config; /* Flex stat configuration. */
  21626     bcm_stat_group_mode_attr_selector_t attr_sel[6]; /* Flext stat Attribute
  21627                                                       * selector structure. */
  21628     bcm_stat_object_t  object; /* Field stat object. */
  21629 
  21630     /* Input parameters check. */
  21631     if (NULL == f_ent) {
  21632         return (BCM_E_PARAM);
  21633     }
  21634 
  21635     /* Get field entry STAT structure. */
  21636     f_ent_st = &f_ent->statistic;
  21637 
  21638     /* Read STAT configuration. */
  21639     rv = (_bcm_field_stat_get(unit, f_ent_st->sid, &f_st));
  21640     if (rv == BCM_E_NOT_FOUND) {
  21641        /* No Stats attached */
  21642        return BCM_E_NONE;
  21643     } else if (BCM_FAILURE(rv)) {
  21644        return rv;
  21645     }
  21646 
  21647     /* If counter is disabled skip allocation. */
  21648     if (0 == f_st->hw_stat) {
  21649         LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  21650                                "FP(unit %d): Stat is not enabled.\n "), unit));
  21651         return (BCM_E_INTERNAL);
  21652     }
  21653 
  21654     /* Get application requested bitmap. */
  21655     BCM_IF_ERROR_RETURN
  21656         (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap));
  21657 
  21658     /* If bitmap is zero - no mode selection is required. */
  21659     if (0 == req_bmap) {
  21660         LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  21661                                   "FP(unit %d): No Valid stats.\n "), unit));
  21662         return BCM_E_INTERNAL;
  21663     }
  21664 
  21665 
  21666     if (_FP_INVALID_INDEX == f_st->hw_index) {
  21667         fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl);
  21668 
  21669         for (idx = 0; idx < fp_stat_mode_max; idx++) {
  21670 
  21671             hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap;
  21672             num_hw_cntrs = th_ingress_cntr_hw_mode_tbl[idx].hw_entry_count;
  21673             color = th_ingress_cntr_hw_mode_tbl[idx].color;
  21674 
  21675             if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) {
  21676                 /*
  21677                  * For maximizing utilization of hardware counters, this should
  21678                  * select the hw_mode both supports the requested stats
  21679                  * AND minimizes the number of required hardware counters.
  21680                  */
  21681                 break;
  21682             }
  21683         }
  21684 
  21685         if (idx >= fp_stat_mode_max) {
  21686             return (BCM_E_INTERNAL);
  21687         }
  21688 
  21689         for (idx = 0; idx < 6; idx++) {
  21690             /* Initialize attribute selectors to 0 */
  21691             bcm_stat_group_mode_attr_selector_t_init(&attr_sel[idx]);
  21692         }
  21693 
  21694         switch (color) {
  21695             case _bcmFieldStatColorGreen:
  21696                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21697                 attr_sel[0].attr_value = bcmColorGreen;
  21698                 attr_sel[0].counter_offset = 0;
  21699                 num_selectors = 1;
  21700                 num_counters = 1;
  21701                 break;
  21702             case _bcmFieldStatColorYellow:
  21703                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21704                 attr_sel[0].attr_value = bcmColorYellow;
  21705                 attr_sel[0].counter_offset = 0;
  21706                 num_selectors = 1;
  21707                 num_counters = 1;
  21708                 break;
  21709             case _bcmFieldStatColorRed:
  21710                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21711                 attr_sel[0].attr_value = bcmColorRed;
  21712                 attr_sel[0].counter_offset = 0;
  21713                 num_selectors = 1;
  21714                 num_counters = 1;
  21715                 break;
  21716             case _bcmFieldStatColorNotGreen:
  21717                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21718                 attr_sel[0].attr_value = bcmColorYellow;
  21719                 attr_sel[0].counter_offset = 0;
  21720                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21721                 attr_sel[1].attr_value = bcmColorRed;
  21722                 attr_sel[1].counter_offset = 0;
  21723                 num_selectors = 2;
  21724                 num_counters = 1;
  21725                 break;
  21726             case _bcmFieldStatColorNotYellow:
  21727                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21728                 attr_sel[0].attr_value = bcmColorGreen;
  21729                 attr_sel[0].counter_offset = 0;
  21730                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21731                 attr_sel[1].attr_value = bcmColorRed;
  21732                 attr_sel[1].counter_offset = 0;
  21733                 num_selectors = 2;
  21734                 num_counters = 1;
  21735                 break;
  21736             case _bcmFieldStatColorNotRed:
  21737                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21738                 attr_sel[0].attr_value = bcmColorGreen;
  21739                 attr_sel[0].counter_offset = 0;
  21740                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21741                 attr_sel[1].attr_value = bcmColorYellow;
  21742                 attr_sel[1].counter_offset = 0;
  21743                 num_selectors = 2;
  21744                 num_counters = 1;
  21745                 break;
  21746             case _bcmFieldStatColorGreenYellow:
  21747                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21748                 attr_sel[0].attr_value = bcmColorGreen;
  21749                 attr_sel[0].counter_offset = 0;
  21750                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21751                 attr_sel[1].attr_value = bcmColorYellow;
  21752                 attr_sel[1].counter_offset = 1;
  21753                 num_selectors = 2;
  21754                 num_counters = 2;
  21755                 break;
  21756             case _bcmFieldStatColorGreenRed:
  21757                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21758                 attr_sel[0].attr_value = bcmColorGreen;
  21759                 attr_sel[0].counter_offset = 0;
  21760                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21761                 attr_sel[1].attr_value = bcmColorRed;
  21762                 attr_sel[1].counter_offset = 1;
  21763                 num_selectors = 2;
  21764                 num_counters = 2;
  21765                 break;
  21766             case _bcmFieldStatColorYellowRed:
  21767                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21768                 attr_sel[0].attr_value = bcmColorYellow;
  21769                 attr_sel[0].counter_offset = 0;
  21770                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21771                 attr_sel[1].attr_value = bcmColorRed;
  21772                 attr_sel[1].counter_offset = 1;
  21773                 num_selectors = 2;
  21774                 num_counters = 2;
  21775                 break;
  21776             case _bcmFieldStatColorGreenNotGreen:
  21777                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21778                 attr_sel[0].attr_value = bcmColorGreen;
  21779                 attr_sel[0].counter_offset = 0;
  21780                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21781                 attr_sel[1].attr_value = bcmColorYellow;
  21782                 attr_sel[1].counter_offset = 1;
  21783                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  21784                 attr_sel[2].attr_value = bcmColorRed;
  21785                 attr_sel[2].counter_offset = 1;
  21786                 num_selectors = 3;
  21787                 num_counters = 2;
  21788                 break;
  21789             case _bcmFieldStatColorYellowNotYellow:
  21790                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21791                 attr_sel[0].attr_value = bcmColorYellow;
  21792                 attr_sel[0].counter_offset = 0;
  21793                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21794                 attr_sel[1].attr_value = bcmColorGreen;
  21795                 attr_sel[1].counter_offset = 1;
  21796                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  21797                 attr_sel[2].attr_value = bcmColorRed;
  21798                 attr_sel[2].counter_offset = 1;
  21799                 num_selectors = 3;
  21800                 num_counters = 2;
  21801                 break;
  21802             case _bcmFieldStatColorRedNotRed:
  21803                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21804                 attr_sel[0].attr_value = bcmColorRed;
  21805                 attr_sel[0].counter_offset = 0;
  21806                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21807                 attr_sel[1].attr_value = bcmColorGreen;
  21808                 attr_sel[1].counter_offset = 1;
  21809                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  21810                 attr_sel[2].attr_value = bcmColorYellow;
  21811                 attr_sel[2].counter_offset = 1;
  21812                 num_selectors = 3;
  21813                 num_counters = 2;
  21814                 break;
  21815             case _bcmFieldStatColorNoColor:
  21816                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21817                 attr_sel[0].attr_value = bcmColorGreen;
  21818                 attr_sel[0].counter_offset = 0;
  21819                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21820                 attr_sel[1].attr_value = bcmColorYellow;
  21821                 attr_sel[1].counter_offset = 0;
  21822                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  21823                 attr_sel[2].attr_value = bcmColorRed;
  21824                 attr_sel[2].counter_offset = 0;
  21825                 num_selectors = 3;
  21826                 num_counters = 1;
  21827                 break;
  21828             case _bcmFieldStatColorGreenYellowRed:
  21829                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21830                 attr_sel[0].attr_value = bcmColorGreen;
  21831                 attr_sel[0].counter_offset = 0;
  21832                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  21833                 attr_sel[1].attr_value = bcmColorYellow;
  21834                 attr_sel[1].counter_offset = 1;
  21835                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  21836                 attr_sel[2].attr_value = bcmColorRed;
  21837                 attr_sel[2].counter_offset = 2;
  21838                 num_selectors = 3;
  21839                 num_counters = 3;
  21840                 break;
  21841              default:
  21842                  return BCM_E_INTERNAL;
  21843         }
  21844 
  21845         /* Create custom counter update mode */
  21846         bcm_stat_group_mode_id_config_t_init(&stat_config);
  21847         stat_config.flags = BCM_STAT_GROUP_MODE_INGRESS;
  21848         stat_config.hint.type = bcmStatGroupAllocHintIngressFieldGroup;
  21849         object = bcmStatObjectIngFieldStageIngress;
  21850         stat_config.total_counters = num_counters;
  21851         stat_config.hint.value = f_ent->group->gid; /* group id returned by
  21852                                                      * field_group_create()*/
  21853         rv = bcm_esw_stat_group_mode_id_config_create(unit, 0, &stat_config,
  21854                                                       num_selectors, attr_sel,
  21855                                                       &mode_id);
  21856         BCM_IF_ERROR_RETURN(rv);
  21857 
  21858         /* Create custom stat group */
  21859         rv = bcm_esw_stat_custom_group_create(unit, mode_id, object,
  21860                                               &flex_sid, &num_hw_cntrs);
  21861         BCM_IF_ERROR_RETURN(rv);
  21862 
  21863         /* Get flex counter hardware details stored in flex stat ID.*/
  21864         _bcm_esw_stat_get_counter_id_info(unit, flex_sid,
  21865                                           &stat_mode,
  21866                                           &stat_obj,
  21867                                           &offset_mode,
  21868                                           &pool_num,
  21869                                           &base_index);
  21870 
  21871         /* If the pool is not set to in use for the group, set it now. */
  21872         if (!_FP_COUNTER_POOL_BMP_TEST(
  21873                             f_ent->group->counter_pool_bmp, pool_num)) {
  21874             _FP_COUNTER_POOL_BMP_ADD(f_ent->group->counter_pool_bmp, pool_num);
  21875         }
  21876 
  21877         /* Store flex stat hardware details in stat data structure. */
  21878         f_st->flex_mode = flex_sid;
  21879         f_st->pool_index = pool_num;
  21880         f_st->hw_index = base_index;
  21881         f_st->hw_mode = offset_mode;
  21882         f_st->hw_entry_count = num_hw_cntrs;
  21883         /* Increment the group counters count equal to
  21884            the hw entries count .*/
  21885         f_ent->group->group_status.counter_count =
  21886                f_ent->group->group_status.counter_count + num_hw_cntrs;
  21887     }
  21888 
  21889     return (BCM_E_NONE);
  21890 }
  21891 
  21892 /*
  21893  * Function:
  21894  *  _field_th_exactmatch_stat_hw_alloc
  21895  * Purpose:
  21896  *  Allocate flex stat hardware resource for Exact Match stage
  21897  * Parameters:
  21898  *  unit      - (IN) BCM device number.
  21899  *  f_ent     - (IN) Entry array policer belongs to.
  21900  * Returns:
  21901  *  BCM_E_XXX
  21902  */
  21903 STATIC int
  21904 _field_th_exactmatch_stat_hw_alloc(int unit, _field_entry_t *f_ent)
  21905 {
  21906     int    rv;                /* Return Operational Status.      */
  21907     int    fp_stat_mode_max;  /* Max stat modes.                 */
  21908     uint8  idx;               /* HW counter modes iterator.      */
  21909     uint32 flex_sid;          /* Flex Stat ID.                   */
  21910     uint32 num_hw_cntrs;      /* Number of counters allocated.   */
  21911     uint32 pool_num;          /* Flex Stat Hw Pool No.           */
  21912     uint32 base_index;        /* Flex Stat counter base index.   */
  21913     uint32 num_selectors;     /* NUmber of flex attr slectors.   */
  21914     uint32 req_bmap;          /* Requested statistics bitmap.    */
  21915     uint32 hw_bmap;           /* HW supported statistics bitmap. */
  21916     uint32 mode_id;           /* Flex Stat Mode. */
  21917     uint32 num_counters;      /* Number of flex counters required. */
  21918     _field_stat_color_t     color;        /* Flex Stat Mode in s/w.         */
  21919     _field_entry_stat_t     *f_ent_st;    /* Field entry stat collector.    */
  21920     _field_stat_t           *f_st;        /* Field statistics descriptor.   */
  21921     bcm_stat_flex_mode_t    offset_mode;  /* Counter mode.                  */
  21922     bcm_stat_group_mode_t   stat_mode;    /* Stat type bcmStatGroupModeXXX. */
  21923     bcm_stat_object_t       stat_obj;     /* Stat object type.              */
  21924     bcm_stat_group_mode_id_config_t stat_config; /* Flex stat configuration. */
  21925     bcm_stat_group_mode_attr_selector_t attr_sel[6]; /* Flext stat Attribute
  21926                                                       * selector structure. */
  21927     bcm_stat_object_t  object; /* Field stat object. */
  21928 
  21929     /* Input parameters check. */
  21930     if (NULL == f_ent) {
  21931         return (BCM_E_PARAM);
  21932     }
  21933 
  21934     /* Get field entry STAT structure. */
  21935     f_ent_st = &f_ent->statistic;
  21936 
  21937     /* Read STAT configuration. */
  21938     rv = (_bcm_field_stat_get(unit, f_ent_st->sid, &f_st));
  21939     if (rv == BCM_E_NOT_FOUND) {
  21940         /* No Stats attached */
  21941         return BCM_E_NONE;
  21942     } else if (BCM_FAILURE(rv)) {
  21943         return rv;
  21944     }
  21945 
  21946     /* If counter is disabled skip allocation. */
  21947     if (0 == f_st->hw_stat) {
  21948         LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  21949                         "FP(unit %d): Stat is not enabled.\n "), unit));
  21950         return (BCM_E_INTERNAL);
  21951     }
  21952 
  21953     /* Get application requested bitmap. */
  21954     BCM_IF_ERROR_RETURN
  21955         (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap));
  21956 
  21957     /* If bitmap is zero - no mode selection is required. */
  21958     if (0 == req_bmap) {
  21959         LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  21960                         "FP(unit %d): No Valid stats.\n "), unit));
  21961         return BCM_E_INTERNAL;
  21962     }
  21963 
  21964 
  21965     if (_FP_INVALID_INDEX == f_st->hw_index) {
  21966         fp_stat_mode_max = COUNTOF(th_ingress_cntr_hw_mode_tbl);
  21967 
  21968         for (idx = 0; idx < fp_stat_mode_max; idx++) {
  21969 
  21970             hw_bmap = th_ingress_cntr_hw_mode_tbl[idx].hw_bmap;
  21971             num_hw_cntrs = th_ingress_cntr_hw_mode_tbl[idx].hw_entry_count;
  21972             color = th_ingress_cntr_hw_mode_tbl[idx].color;
  21973 
  21974             if (0 == ((req_bmap | hw_bmap) & ~(hw_bmap))) {
  21975                 /*
  21976                  * For maximizing utilization of hardware counters, this should
  21977                  * select the hw_mode both supports the requested stats
  21978                  * AND minimizes the number of required hardware counters.
  21979                  */
  21980                 break;
  21981             }
  21982         }
  21983 
  21984         if (idx >= fp_stat_mode_max) {
  21985             return (BCM_E_INTERNAL);
  21986         }
  21987 
  21988         for (idx = 0; idx < 6; idx++) {
  21989             /* Initialize attribute selectors to 0 */
  21990             bcm_stat_group_mode_attr_selector_t_init(&attr_sel[idx]);
  21991         }
  21992 
  21993         switch (color) {
  21994             case _bcmFieldStatColorGreen:
  21995                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  21996                 attr_sel[0].attr_value = bcmColorGreen;
  21997                 attr_sel[0].counter_offset = 0;
  21998                 num_selectors = 1;
  21999                 num_counters = 1;
  22000                 break;
  22001             case _bcmFieldStatColorYellow:
  22002                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22003                 attr_sel[0].attr_value = bcmColorYellow;
  22004                 attr_sel[0].counter_offset = 0;
  22005                 num_selectors = 1;
  22006                 num_counters = 1;
  22007                 break;
  22008             case _bcmFieldStatColorRed:
  22009                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22010                 attr_sel[0].attr_value = bcmColorRed;
  22011                 attr_sel[0].counter_offset = 0;
  22012                 num_selectors = 1;
  22013                 num_counters = 1;
  22014                 break;
  22015             case _bcmFieldStatColorNotGreen:
  22016                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22017                 attr_sel[0].attr_value = bcmColorYellow;
  22018                 attr_sel[0].counter_offset = 0;
  22019                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22020                 attr_sel[1].attr_value = bcmColorRed;
  22021                 attr_sel[1].counter_offset = 0;
  22022                 num_selectors = 2;
  22023                 num_counters = 1;
  22024                 break;
  22025             case _bcmFieldStatColorNotYellow:
  22026                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22027                 attr_sel[0].attr_value = bcmColorGreen;
  22028                 attr_sel[0].counter_offset = 0;
  22029                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22030                 attr_sel[1].attr_value = bcmColorRed;
  22031                 attr_sel[1].counter_offset = 0;
  22032                 num_selectors = 2;
  22033                 num_counters = 1;
  22034                 break;
  22035             case _bcmFieldStatColorNotRed:
  22036                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22037                 attr_sel[0].attr_value = bcmColorGreen;
  22038                 attr_sel[0].counter_offset = 0;
  22039                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22040                 attr_sel[1].attr_value = bcmColorYellow;
  22041                 attr_sel[1].counter_offset = 0;
  22042                 num_selectors = 2;
  22043                 num_counters = 1;
  22044                 break;
  22045             case _bcmFieldStatColorGreenYellow:
  22046                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22047                 attr_sel[0].attr_value = bcmColorGreen;
  22048                 attr_sel[0].counter_offset = 0;
  22049                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22050                 attr_sel[1].attr_value = bcmColorYellow;
  22051                 attr_sel[1].counter_offset = 1;
  22052                 num_selectors = 2;
  22053                 num_counters = 2;
  22054                 break;
  22055             case _bcmFieldStatColorGreenRed:
  22056                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22057                 attr_sel[0].attr_value = bcmColorGreen;
  22058                 attr_sel[0].counter_offset = 0;
  22059                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22060                 attr_sel[1].attr_value = bcmColorRed;
  22061                 attr_sel[1].counter_offset = 1;
  22062                 num_selectors = 2;
  22063                 num_counters = 2;
  22064                 break;
  22065             case _bcmFieldStatColorYellowRed:
  22066                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22067                 attr_sel[0].attr_value = bcmColorYellow;
  22068                 attr_sel[0].counter_offset = 0;
  22069                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22070                 attr_sel[1].attr_value = bcmColorRed;
  22071                 attr_sel[1].counter_offset = 1;
  22072                 num_selectors = 2;
  22073                 num_counters = 2;
  22074                 break;
  22075             case _bcmFieldStatColorGreenNotGreen:
  22076                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22077                 attr_sel[0].attr_value = bcmColorGreen;
  22078                 attr_sel[0].counter_offset = 0;
  22079                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22080                 attr_sel[1].attr_value = bcmColorYellow;
  22081                 attr_sel[1].counter_offset = 1;
  22082                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  22083                 attr_sel[2].attr_value = bcmColorRed;
  22084                 attr_sel[2].counter_offset = 1;
  22085                 num_selectors = 3;
  22086                 num_counters = 2;
  22087                 break;
  22088             case _bcmFieldStatColorYellowNotYellow:
  22089                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22090                 attr_sel[0].attr_value = bcmColorYellow;
  22091                 attr_sel[0].counter_offset = 0;
  22092                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22093                 attr_sel[1].attr_value = bcmColorGreen;
  22094                 attr_sel[1].counter_offset = 1;
  22095                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  22096                 attr_sel[2].attr_value = bcmColorRed;
  22097                 attr_sel[2].counter_offset = 1;
  22098                 num_selectors = 3;
  22099                 num_counters = 2;
  22100                 break;
  22101             case _bcmFieldStatColorRedNotRed:
  22102                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22103                 attr_sel[0].attr_value = bcmColorRed;
  22104                 attr_sel[0].counter_offset = 0;
  22105                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22106                 attr_sel[1].attr_value = bcmColorGreen;
  22107                 attr_sel[1].counter_offset = 1;
  22108                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  22109                 attr_sel[2].attr_value = bcmColorYellow;
  22110                 attr_sel[2].counter_offset = 1;
  22111                 num_selectors = 3;
  22112                 num_counters = 2;
  22113                 break;
  22114             case _bcmFieldStatColorNoColor:
  22115                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22116                 attr_sel[0].attr_value = bcmColorGreen;
  22117                 attr_sel[0].counter_offset = 0;
  22118                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22119                 attr_sel[1].attr_value = bcmColorYellow;
  22120                 attr_sel[1].counter_offset = 0;
  22121                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  22122                 attr_sel[2].attr_value = bcmColorRed;
  22123                 attr_sel[2].counter_offset = 0;
  22124                 num_selectors = 3;
  22125                 num_counters = 1;
  22126                 break;
  22127             case _bcmFieldStatColorGreenYellowRed:
  22128                 attr_sel[0].attr = bcmStatGroupModeAttrFieldIngressColor;
  22129                 attr_sel[0].attr_value = bcmColorGreen;
  22130                 attr_sel[0].counter_offset = 0;
  22131                 attr_sel[1].attr = bcmStatGroupModeAttrFieldIngressColor;
  22132                 attr_sel[1].attr_value = bcmColorYellow;
  22133                 attr_sel[1].counter_offset = 1;
  22134                 attr_sel[2].attr = bcmStatGroupModeAttrFieldIngressColor;
  22135                 attr_sel[2].attr_value = bcmColorRed;
  22136                 attr_sel[2].counter_offset = 2;
  22137                 num_selectors = 3;
  22138                 num_counters = 3;
  22139                 break;
  22140             default:
  22141                 return BCM_E_INTERNAL;
  22142         }
  22143 
  22144         /* Create custom counter update mode */
  22145         bcm_stat_group_mode_id_config_t_init(&stat_config);
  22146         stat_config.flags = BCM_STAT_GROUP_MODE_INGRESS;
  22147         stat_config.hint.type = bcmStatGroupAllocHintExactMatchFieldGroup;
  22148         object = bcmStatObjectIngExactMatch;
  22149         stat_config.total_counters = num_counters;
  22150         stat_config.hint.value = f_ent->group->gid; /* group id returned by
  22151                                                        field_group_create()*/
  22152         rv = bcm_esw_stat_group_mode_id_config_create(unit, 0, &stat_config,
  22153                                                       num_selectors, attr_sel,
  22154                                                       &mode_id);
  22155         BCM_IF_ERROR_RETURN(rv);
  22156 
  22157         /* Create custom stat group */
  22158         rv = bcm_esw_stat_custom_group_create(unit, mode_id, object,
  22159                                               &flex_sid, &num_hw_cntrs);
  22160         BCM_IF_ERROR_RETURN(rv);
  22161 
  22162         /* Get flex counter hardware details stored in flex stat ID.*/
  22163         _bcm_esw_stat_get_counter_id_info(unit, flex_sid,
  22164                                           &stat_mode,
  22165                                           &stat_obj,
  22166                                           &offset_mode,
  22167                                           &pool_num,
  22168                                           &base_index);
  22169 
  22170         /* If the pool is not set to in use for the group, set it now. */
  22171         if (!_FP_COUNTER_POOL_BMP_TEST(
  22172                  f_ent->group->counter_pool_bmp, pool_num)) {
  22173             _FP_COUNTER_POOL_BMP_ADD(f_ent->group->counter_pool_bmp, pool_num);
  22174         }
  22175 
  22176         /* Store flex stat hardware details in stat data structure. */
  22177         f_st->flex_mode = flex_sid;
  22178         f_st->pool_index = pool_num;
  22179         f_st->hw_index = base_index;
  22180         f_st->hw_mode = offset_mode;
  22181         f_st->hw_entry_count = num_hw_cntrs;
  22182         /* Increment the group counters count equal to
  22183            the hw entries count .*/
  22184         f_ent->group->group_status.counter_count =
  22185                f_ent->group->group_status.counter_count + num_hw_cntrs;
  22186     }
  22187 
  22188     return (BCM_E_NONE);
  22189 }
  22190 
  22191 
  22192 /*
  22193  * Function:
  22194  *     _field_th_lookup_stat_hw_alloc
  22195  *
  22196  * Purpose:
  22197  *     Allocate flex stat hardware resource for lookup stage
  22198  *
  22199  * Parameters:
  22200  *     unit      - (IN) BCM device number.
  22201  *     f_ent     - (IN) Entry array policer belongs to.
  22202  * Returns:
  22203  *     BCM_E_XXX
  22204  */
  22205 STATIC int
  22206 _field_th_lookup_stat_hw_alloc(int unit, _field_entry_t *f_ent)
  22207 {
  22208     int    rv;                /* Return Operational Status.      */
  22209     uint8  idx;               /* HW counter modes iterator.      */
  22210     uint32 flex_sid;          /* Flex Stat ID.                   */
  22211     uint32 num_hw_cntrs;      /* Number of counters allocated.   */
  22212     uint32 pool_num;          /* Flex Stat Hw Pool No.           */
  22213     uint32 base_index;        /* Flex Stat counter base index.   */
  22214     uint32 num_selectors;     /* NUmber of flex attr slectors.   */
  22215     uint32 req_bmap;          /* Requested statistics bitmap.    */
  22216     uint32 mode_id;           /* Flex Stat Mode. */
  22217     uint32 num_counters;      /* Number of flex counters required. */
  22218     _field_entry_stat_t     *f_ent_st;    /* Field entry stat collector.    */
  22219     _field_stat_t           *f_st;        /* Field statistics descriptor.   */
  22220     bcm_stat_flex_mode_t    offset_mode;  /* Counter mode.                  */
  22221     bcm_stat_group_mode_t   stat_mode;    /* Stat type bcmStatGroupModeXXX. */
  22222     bcm_stat_object_t       stat_obj;     /* Stat object type.              */
  22223     bcm_stat_group_mode_id_config_t stat_config; /* Flex stat configuration. */
  22224     bcm_stat_group_mode_attr_selector_t attr_sel[6]; /* Flext stat Attribute
  22225                                                       * selector structure. */
  22226     bcm_stat_object_t  object; /* Field stat object. */
  22227 
  22228     /* Input parameters check. */
  22229     if (NULL == f_ent) {
  22230         return (BCM_E_PARAM);
  22231     }
  22232 
  22233     /* Get field entry STAT structure. */
  22234     f_ent_st = &f_ent->statistic;
  22235 
  22236     /* Read STAT configuration. */
  22237     rv = (_bcm_field_stat_get(unit, f_ent_st->sid, &f_st));
  22238     if (rv == BCM_E_NOT_FOUND) {
  22239        /* No Stats attached */
  22240        return BCM_E_NONE;
  22241     } else if (BCM_FAILURE(rv)) {
  22242        return rv;
  22243     }
  22244 
  22245     /* If counter is disabled skip allocation. */
  22246     if (0 == f_st->hw_stat) {
  22247         LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  22248                                "FP(unit %d): Stat is not enabled.\n "), unit));
  22249         return (BCM_E_INTERNAL);
  22250     }
  22251 
  22252     /* Get application requested bitmap. */
  22253     BCM_IF_ERROR_RETURN
  22254         (_bcm_field_stat_array_to_bmap(unit, f_st, &req_bmap));
  22255 
  22256     /* If bitmap is zero - no mode selection is required. */
  22257     if (0 == req_bmap) {
  22258         LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  22259                                   "FP(unit %d): No Valid stats.\n "), unit));
  22260         return BCM_E_INTERNAL;
  22261     }
  22262 
  22263 
  22264     if (_FP_INVALID_INDEX == f_st->hw_index) {
  22265         num_hw_cntrs = 1;
  22266 
  22267         for (idx = 0; idx < 6; idx++) {
  22268             /* Initialize attribute selectors to 0 */
  22269             bcm_stat_group_mode_attr_selector_t_init(&attr_sel[idx]);
  22270         }
  22271 
  22272         attr_sel[0].attr = bcmStatGroupModeAttrPktType;
  22273         attr_sel[0].attr_value = BCM_STAT_GROUP_MODE_ATTR_ALL_VALUES;
  22274         attr_sel[0].counter_offset = 0;
  22275         num_selectors = 1;
  22276         num_counters = 1;
  22277 
  22278         /* Create custom counter update mode */
  22279         bcm_stat_group_mode_id_config_t_init(&stat_config);
  22280         stat_config.flags = BCM_STAT_GROUP_MODE_INGRESS;
  22281         stat_config.hint.type = bcmStatGroupAllocHintVlanFieldGroup;
  22282         object = bcmStatObjectIngFieldStageLookup;
  22283         stat_config.total_counters = num_counters;
  22284         stat_config.hint.value = f_ent->group->gid; /* group id returned by
  22285                                                      * field_group_create()*/
  22286         rv = bcm_esw_stat_group_mode_id_config_create(unit, 0, &stat_config,
  22287                                                       num_selectors, attr_sel,
  22288                                                       &mode_id);
  22289         BCM_IF_ERROR_RETURN(rv);
  22290 
  22291         /* Create custom stat group */
  22292         rv = bcm_esw_stat_custom_group_create(unit, mode_id, object,
  22293                                               &flex_sid, &num_hw_cntrs);
  22294         BCM_IF_ERROR_RETURN(rv);
  22295 
  22296         /* Get flex counter hardware details stored in flex stat ID.*/
  22297         _bcm_esw_stat_get_counter_id_info(unit, flex_sid,
  22298                                           &stat_mode,
  22299                                           &stat_obj,
  22300                                           &offset_mode,
  22301                                           &pool_num,
  22302                                           &base_index);
  22303 
  22304         /* If the pool is not set to in use for the group, set it now. */
  22305         if (!_FP_COUNTER_POOL_BMP_TEST(
  22306                             f_ent->group->counter_pool_bmp, pool_num)) {
  22307             _FP_COUNTER_POOL_BMP_ADD(f_ent->group->counter_pool_bmp, pool_num);
  22308         }
  22309 
  22310         /* Store flex stat hardware details in stat data structure. */
  22311         f_st->flex_mode = flex_sid;
  22312         f_st->pool_index = pool_num;
  22313         f_st->hw_index = base_index;
  22314         f_st->hw_mode = offset_mode;
  22315         f_st->hw_entry_count = num_hw_cntrs;
  22316         /* Increment the group counters count equal to
  22317            the hw entries count .*/
  22318         f_ent->group->group_status.counter_count =
  22319                f_ent->group->group_status.counter_count + num_hw_cntrs;
  22320     }
  22321 
  22322     return (BCM_E_NONE);
  22323 }
  22324 
  22325 
  22326 /*
  22327  * Function:
  22328  *     _bcm_field_th_stat_hw_alloc
  22329  *
  22330  * Purpose:
  22331  *     Allocate Stat hardware resource
  22332  *
  22333  * Parameters:
  22334  *     unit      - (IN) BCM device number.
  22335  *     f_ent     - (IN) Entry array stat belongs to.
  22336  * Returns:
  22337  *     BCM_E_XXX
  22338  */
  22339 int
  22340 _bcm_field_th_stat_hw_alloc(int unit,
  22341                             _field_entry_t *f_ent)
  22342 {
  22343     int rv = BCM_E_INTERNAL; /* Operational Status. */
  22344 
  22345     if (NULL == f_ent) {
  22346         return BCM_E_PARAM;
  22347     }
  22348 
  22349     switch (f_ent->fs->stage_id) {
  22350        case _BCM_FIELD_STAGE_INGRESS:
  22351            rv = _field_th_ingress_stat_hw_alloc(unit, f_ent);
  22352            break;
  22353        case _BCM_FIELD_STAGE_EXACTMATCH:
  22354            rv = _field_th_exactmatch_stat_hw_alloc(unit, f_ent);
  22355            break;
  22356        case _BCM_FIELD_STAGE_LOOKUP:
  22357            rv = _field_th_lookup_stat_hw_alloc(unit, f_ent);
  22358            break;
  22359        case _BCM_FIELD_STAGE_EGRESS:
  22360 #if defined BCM_TRIDENT3_SUPPORT
  22361            if (soc_feature(unit, soc_feature_td3_style_fp)) {
  22362               rv = _bcm_field_td2plus_stat_hw_alloc(unit, f_ent);
  22363            } else
  22364 #endif /* BCM_TRIDENT3_SUPPORT */
  22365            {
  22366               rv = _bcm_field_stat_hw_alloc(unit, f_ent);
  22367            }
  22368            break;
  22369        default:
  22370            rv = _bcm_field_stat_hw_alloc(unit, f_ent);
  22371            break;
  22372     }
  22373 
  22374     return rv;
  22375 }
  22376 /*
  22377  * Function:
  22378  *     _bcm_field_th_flex_stat_action_set
  22379  * Purpose:
  22380  *     Install flex counter update action into policy table.
  22381  * Parameters:
  22382  *     unit         - (IN) BCM device number
  22383  *     f_ent        - (IN) entry structure to get policy info from
  22384  *     mem          - (IN) Policy table memory
  22385  *     tcam_idx     - (IN) Common index of various tables
  22386  *     buf          - (OUT) Field Policy table entry
  22387  * Returns:
  22388  *     BCM_E_XXX
  22389  */
  22390 int
  22391 _bcm_field_th_flex_stat_action_set(int unit,
  22392                                    _field_entry_t *f_ent,
  22393                                    soc_mem_t mem,
  22394                                    int tcam_idx,
  22395                                    uint32 *buf)
  22396 {
  22397     int rv; /* Return Operational Status. */
  22398     int idx; /* Stat array index. */
  22399     _field_stat_t *f_st; /* Field statistics descriptor. */
  22400 
  22401 
  22402     /* Increment statistics hw reference count. */
  22403     if ((f_ent->statistic.flags & _FP_ENTRY_STAT_VALID)
  22404         && !(f_ent->statistic.flags & _FP_ENTRY_STAT_INSTALLED)) {
  22405         /* Get statistics entity description structure. */
  22406         rv = _bcm_field_stat_get(unit, f_ent->statistic.sid, &f_st);
  22407         BCM_IF_ERROR_RETURN(rv);
  22408 
  22409         if (_FP_INVALID_INDEX != f_st->hw_index) {
  22410             /*
  22411              * For STATs that are shared by entries, hardware counters
  22412              * are not allocated again. But reference count is incremented
  22413              * for these counters.
  22414              */
  22415             f_st->hw_ref_count++;
  22416 
  22417             /*
  22418              *  Once flex counters have been allocated for the IFP/VFP, these
  22419              * counters need to be attached to the appropriate IFP/VFP policy
  22420              * table entry. Once flex counters have been attached by associating
  22421              * them with the appropriate IFP/VFP policy table entry, counters
  22422              * are now ready to be updated by corresponding packets.
  22423              */
  22424             rv = _bcm_esw_stat_flex_attach_ingress_table_counters1(unit, mem,
  22425                                                      tcam_idx, f_st->hw_mode,
  22426                                                               f_st->hw_index,
  22427                                                       f_st->pool_index, buf);
  22428             BCM_IF_ERROR_RETURN(rv);
  22429 
  22430             /* Mark entry as installed. */
  22431             f_ent->statistic.flags |=  _FP_ENTRY_STAT_INSTALLED;
  22432 
  22433             /*
  22434              * Write individual statistics previous value, first time
  22435              * entry is installed in hardware.
  22436              */
  22437             if (1 == f_st->hw_ref_count) {
  22438                 for (idx = 0; idx < f_st->nstat; idx++) {
  22439                     rv = _field_stat_value_set(unit, f_st, f_st->stat_arr[idx],
  22440                                                        f_st->stat_values[idx]);
  22441                     BCM_IF_ERROR_RETURN(rv);
  22442                 }
  22443             }
  22444         }
  22445     } else {
  22446         if (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP) {
  22447            /* Disable counters if it is not attached to the entry. */
  22448            PolicySet(unit, mem, buf, FLEX_CTR_OFFSET_MODEf, 0);
  22449            PolicySet(unit, mem, buf, FLEX_CTR_POOL_NUMBERf, 0);
  22450            PolicySet(unit, mem, buf, FLEX_CTR_BASE_COUNTER_IDXf, 0);
  22451         } else {
  22452           /* setting COUNTER_SETf to 0 will set FLEX_CTR_BASE_COUNTER_IDX,
  22453            * FLEX_CTR_OFFSET_MODE, FLEX_CTR_POOL_NUMBER, G_COUNT, Y_COUNT and
  22454            * R_COUNT fields to 0.
  22455            */
  22456            PolicySet(unit, mem, buf, COUNTER_SETf, 0);
  22457         }
  22458     }
  22459 
  22460     return (BCM_E_NONE);
  22461 }
  22462 
  22463 /*
  22464  * Function:
  22465  *     _bcm_field_th_stat_action_set
  22466  * Purpose:
  22467  *     Install counter update action into policy table.
  22468  * Parameters:
  22469  *     unit         - (IN) BCM device number
  22470  *     f_ent        - (IN) entry structure to get policy info from
  22471  *     mem          - (IN) Policy table memory
  22472  *     tcam_idx     - (IN) Common index of various tables
  22473  *     buf          - (OUT) Field Policy table entry
  22474  * Returns:
  22475  *     BCM_E_XXX
  22476  */
  22477 int
  22478 _bcm_field_th_stat_action_set(int unit, _field_entry_t *f_ent,
  22479                                soc_mem_t mem, int tcam_idx,
  22480                                uint32 *buf)
  22481 {
  22482     int rv = BCM_E_NONE;  /* Operation return status.     */
  22483 
  22484     if (NULL == f_ent || NULL == buf) {
  22485         return (BCM_E_PARAM);
  22486     }
  22487 
  22488     switch (f_ent->group->stage_id) {
  22489        case _BCM_FIELD_STAGE_INGRESS:
  22490        case _BCM_FIELD_STAGE_LOOKUP:
  22491        case _BCM_FIELD_STAGE_EXACTMATCH:
  22492           /* Tomahawk IFP/VFP uses Flex counters. */
  22493           rv = _bcm_field_th_flex_stat_action_set(unit, f_ent, mem,
  22494                                                   tcam_idx, buf);
  22495           break;
  22496        default:
  22497           rv = _bcm_field_trx_stat_action_set(unit, f_ent, mem,
  22498                                               tcam_idx, buf);
  22499     }
  22500 
  22501     return rv;
  22502 }
  22503 /*
  22504  * Function:
  22505  *     _bcm_field_th_multi_pipe_counter_mem_get
  22506  *
  22507  * Purpose:
  22508  *     To get the pipe specific counter memory names for a given
  22509  *     Field Processor stage(VFP/IFP/EFP).
  22510  * Parameters:
  22511  *     unit         - (IN)  BCM device number
  22512  *     stage_fc     - (IN)  Field Processor stage control structure.
  22513  *     counter_mem  - (OUT) pointer to array of counter memories.
  22514  * Returns:
  22515  *     BCM_E_XXX
  22516  */
  22517 int
  22518 _bcm_field_th_multi_pipe_counter_mem_get(int unit,
  22519                                          _field_stage_t *stage_fc,
  22520                                          soc_mem_t *counter_mem)
  22521 {
  22522     int              pipe;          /* XGS pipeline to operate on.        */
  22523     int              max_pipes;     /* Maximum XGS pipelines in the stage */
  22524 
  22525     /* Input parameters check. */
  22526     if ((NULL == stage_fc) ||
  22527         (NULL == counter_mem)) {
  22528         return BCM_E_PARAM;
  22529     }
  22530 
  22531     max_pipes = stage_fc->num_pipes;
  22532     for (pipe = 0; pipe < max_pipes; pipe++) {
  22533         counter_mem[pipe] = INVALIDm;
  22534     }
  22535 
  22536     switch(stage_fc->stage_id) {
  22537         case _BCM_FIELD_STAGE_EGRESS:
  22538             counter_mem[0] = EFP_COUNTER_TABLE_PIPE0m;
  22539             counter_mem[1] = EFP_COUNTER_TABLE_PIPE1m;
  22540             counter_mem[2] = EFP_COUNTER_TABLE_PIPE2m;
  22541             counter_mem[3] = EFP_COUNTER_TABLE_PIPE3m;
  22542             break;
  22543         case _BCM_FIELD_STAGE_LOOKUP:
  22544             break;
  22545         default:
  22546             return BCM_E_INTERNAL;
  22547     }
  22548 
  22549     return BCM_E_NONE;
  22550 }
  22551 
  22552 /*
  22553  * Function:
  22554  *     _bcm_field_th_counter_read
  22555  * Purpose:
  22556  *     Update accumulated sw counter and return current counter value.
  22557  * Parameters:
  22558  *   unit          - (IN)  BCM device number
  22559  *   stage_fc      - (IN)  Stage field control
  22560  *   mamacc_byte   - (IN)  Memory access cache for byte counters
  22561  *   memacc_pkt    - (IN)  Memory access cache for packet counters
  22562  *   buf           - (IN)  Memory table entry for FP counter
  22563  *   cntrs32_buf   - (IN)  s/w packet Counter value
  22564  *   cntrs64_buf   - (IN)  s/w byte Counter value
  22565  *   packet_count  - (OUT) Packet counter value
  22566  *   byte_count    - (OUT) Byte counter value
  22567  * Returns:
  22568  *    BCM_E_XXX
  22569  */
  22570 int
  22571 _bcm_field_th_counter_read(int unit, _field_stage_t *stage_fc,
  22572                         soc_memacc_t *memacc_byte,
  22573                         soc_memacc_t *memacc_pkt, uint32 *buf,
  22574                         _field_counter32_collect_t *cntrs32_buf,
  22575                         _field_counter64_collect_t *cntrs64_buf,
  22576                         uint64 *packet_count, uint64 *byte_count)
  22577 {
  22578     uint32  hw_val[2];     /* Parsed field counter value.*/
  22579 
  22580     if (NULL == buf ||
  22581         NULL == memacc_byte ||
  22582         NULL == memacc_pkt ||
  22583         NULL == cntrs32_buf ||
  22584         NULL == cntrs64_buf) {
  22585         return BCM_E_PARAM;
  22586     }
  22587 
  22588     /* Byte counter. */
  22589     hw_val[0] = hw_val[1] = 0;
  22590     soc_memacc_field_get(memacc_byte, buf, hw_val);
  22591 
  22592     _bcm_field_34bit_counter_update(unit, hw_val, cntrs64_buf);
  22593     if (NULL != byte_count) {
  22594         COMPILER_64_ADD_64(*byte_count, cntrs64_buf->accumulated_counter);
  22595     }
  22596     /* Packet counter. */
  22597     hw_val[0] = hw_val[1] = 0;
  22598     soc_memacc_field_get(memacc_pkt, buf, hw_val);
  22599     _bcm_field_26bit_counter_update(unit, hw_val, cntrs32_buf);
  22600     if (NULL != packet_count) {
  22601         COMPILER_64_ADD_64(*packet_count, cntrs32_buf->accumulated_counter);
  22602     }
  22603 
  22604     return BCM_E_NONE;
  22605 }
  22606 
  22607 /*
  22608  * Function:
  22609  *     _bcm_field_th_pipe_counter_get
  22610  * Purpose:
  22611  *     Update accumulated sw counter and return current counter value.
  22612  * Parameters:
  22613  *   unit          - (IN)  BCM device number
  22614  *   stage_fc      - (IN)  Stage field control
  22615  *   counter_mem   - (IN)  Memory name for FP counter
  22616  *   mem_buf       - (IN)  Memory table entry for FP counter
  22617  *   idx           - (IN)  Counter index
  22618  *   pipe          - (IN)  XGS pipeline to operate on
  22619  *   packet_count  - (OUT) Packet counter value
  22620  *   byte_count    - (OUT) Byte counter value
  22621  * Returns:
  22622  *    BCM_E_XXX
  22623  */
  22624 int
  22625 _bcm_field_th_pipe_counter_get(int unit,
  22626                             _field_stage_t *stage_fc,
  22627                             soc_mem_t counter_mem,
  22628                             uint32 *mem_buf,
  22629                             int idx,
  22630                             int pipe,
  22631                             uint64 *packet_count,
  22632                             uint64 *byte_count)
  22633 {
  22634     _field_counter32_collect_t *cntrs32_buf;  /* Sw packet counter value    */
  22635     _field_counter64_collect_t *cntrs64_buf;  /* Sw byte counter value      */
  22636     soc_memacc_t *memacc_pkt, *memacc_byte;   /* Memory access cache.   */
  22637 
  22638     /* Input parameters check. */
  22639     if (NULL == stage_fc) {
  22640         return BCM_E_PARAM;
  22641     }
  22642 
  22643     cntrs64_buf = &stage_fc->_field_64_counters[pipe][idx];
  22644     cntrs32_buf = &stage_fc->_field_32_counters[pipe][idx];
  22645     memacc_byte = &(stage_fc->_field_memacc_counters[(pipe * 2)]);
  22646     memacc_pkt  = &(stage_fc->_field_memacc_counters[((pipe * 2) + 1)]);
  22647     BCM_IF_ERROR_RETURN(_bcm_field_th_counter_read(unit, stage_fc,
  22648                                                    memacc_byte,
  22649                                                    memacc_pkt,
  22650                                                    mem_buf,
  22651                                                    cntrs32_buf, cntrs64_buf,
  22652                                                    packet_count, byte_count));
  22653 
  22654     return BCM_E_NONE;
  22655 }
  22656 
  22657 /*
  22658  * Function:
  22659  *    _field_th_multi_pipe_sw_counter_get
  22660  *
  22661  * Description:
  22662  *       Service routine used to retrieve 64-bit software accumulated counters.
  22663  * Parameters:
  22664  *   unit         - (IN) BCM device number.
  22665  *   stage_fc     - (IN) Stage field control structure.
  22666  *   stat_group_pipe - (IN) XGS Pipline associated to the field group.
  22667  *   idx          - (IN) Counter hw index.
  22668  *   packet_count - (OUT) Packet Counter value
  22669  *   byte_count   - (OUT) Byte Counter value
  22670  * Returns:
  22671  *    BCM_E_XXX
  22672  */
  22673 STATIC int
  22674 _field_th_multi_pipe_sw_counter_get(int unit,
  22675                                  _field_stage_t *stage_fc,
  22676                                  int stat_group_pipe,
  22677                                  int idx,
  22678                                  uint64 *packet_count,
  22679                                  uint64 *byte_count)
  22680 {
  22681     int                       rv;              /* Operation return status.    */
  22682     int                       pipe;            /* XGS pipeline to operate on. */
  22683     int                       max_pipes;       /* Maximum pipeline per stage. */
  22684     uint32                    *hw_buf;         /*  memory HW  buffer.         */
  22685     uint32                    *hw_buffer;      /*  memory HW  buffer.         */
  22686     _field_control_t          *fc;             /* Field control structure.    */
  22687     _field_counter32_collect_t *cntrs32_buf;   /* Sw packet counter value     */
  22688     _field_counter64_collect_t *cntrs64_buf;   /* Sw byte counter value       */
  22689     soc_mem_t counter_mem[_FP_MAX_NUM_PIPES];  /* FieldProcessor
  22690                                                      (IFP/EFP/VFP)
  22691                                                      counter memories */
  22692 
  22693 
  22694     hw_buf = hw_buffer = NULL;
  22695 
  22696     /* Get field control structure. */
  22697     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  22698 
  22699     /* Get counter memory. */
  22700     rv = _bcm_field_th_multi_pipe_counter_mem_get(unit, stage_fc,
  22701                                                     counter_mem);
  22702     BCM_IF_ERROR_RETURN(rv);
  22703 
  22704     /* HW index sanity check. */
  22705     if (idx < soc_mem_index_min(unit, counter_mem[0]) ||
  22706         idx > soc_mem_index_max(unit, counter_mem[0])) {
  22707         return (BCM_E_INTERNAL);
  22708     }
  22709 
  22710     max_pipes = stage_fc->num_pipes;
  22711     if (_BCM_FIELD_GLOBAL_GROUP != stat_group_pipe) {
  22712         for (pipe = 0; pipe < max_pipes; pipe++ ) {
  22713              if (pipe != stat_group_pipe) {
  22714                  counter_mem[pipe] = INVALIDm;
  22715              }
  22716         }
  22717     }
  22718 
  22719     if (0 == (fc->flags & _FP_STAT_SYNC_ENABLE)) {
  22720         for (pipe = 0; pipe < max_pipes; pipe++) {
  22721             if (INVALIDm != counter_mem[pipe]) {
  22722                 cntrs64_buf = &stage_fc->_field_64_counters[pipe][idx];
  22723                 COMPILER_64_ADD_64(*byte_count,
  22724                                    cntrs64_buf->accumulated_counter);
  22725                 cntrs32_buf = &stage_fc->_field_32_counters[pipe][idx];
  22726                 COMPILER_64_ADD_64(*packet_count,
  22727                                     cntrs32_buf->accumulated_counter);
  22728             }
  22729         }
  22730     } else {
  22731         /* Allocate buffer for counter values in HW.  */
  22732         _FP_XGS3_ALLOC(hw_buffer,
  22733                      max_pipes * WORDS2BYTES(SOC_MAX_MEM_FIELD_WORDS),
  22734                      "Counter buffers");
  22735         if (NULL == hw_buffer) {
  22736             return (BCM_E_MEMORY);
  22737         }
  22738 
  22739         for (pipe = 0; pipe < max_pipes; pipe++) {
  22740             if (INVALIDm != counter_mem[pipe]) {
  22741                 hw_buf = hw_buffer + (pipe * SOC_MAX_MEM_FIELD_WORDS);
  22742                 rv = soc_th_ifp_mem_read(unit,
  22743                                   counter_mem[pipe],
  22744                                   MEM_BLOCK_ANY,
  22745                                   idx, hw_buf);
  22746                 if (BCM_FAILURE(rv)) {
  22747                     sal_free(hw_buffer);
  22748                     return rv;
  22749                 }
  22750                 rv = _bcm_field_th_pipe_counter_get(unit, stage_fc,
  22751                                                  counter_mem[pipe],
  22752                                                  hw_buf, idx, pipe,
  22753                                                  packet_count, byte_count);
  22754                 if (BCM_FAILURE(rv)) {
  22755                     sal_free(hw_buffer);
  22756                     return rv;
  22757                 }
  22758 
  22759             }
  22760         }
  22761 
  22762         sal_free(hw_buffer);
  22763 
  22764     }
  22765 
  22766     return rv;
  22767 }
  22768 
  22769 /*
  22770  * Function:
  22771  *      _bcm_th_field_stat_value_set
  22772  *
  22773  * Description:
  22774  *      Set 64 bit counter value for specific statistic type.
  22775  * Parameters:
  22776  *      unit      - (IN) BCM device number.
  22777  *      f_st      - (IN) Statistics entity descriptor.
  22778  *      stat      - (IN) Collected statistics descriptor.
  22779  *      value     - (IN) Collected counters value.
  22780  * Returns:
  22781  *      BCM_E_XXX
  22782  */
  22783 int
  22784 _bcm_th_field_stat_value_set(int unit,
  22785                              _field_stat_t *f_st,
  22786                              bcm_field_stat_t stat,
  22787                              uint64 value)
  22788 {
  22789     int                 rv = BCM_E_NONE; /* Operation return status.          */
  22790     int                 idx1;            /* First counter index to read.      */
  22791     int                 idx2;            /* Second counter index to read.     */
  22792     int                 idx3;            /* Third counter index to read.      */
  22793     int                 len;             /* length of the h/w field.          */
  22794     uint32              flags;           /* _FP_STAT_XXX.                     */
  22795     uint64              hw_value;        /* h/w counter value to be written.  */
  22796     uint64              reset_val;       /* Value to be set on reset          */
  22797     _field_control_t    *fc;             /* Field control structure.          */
  22798     bcm_stat_value_t    stat_val;        /* Stat Values structure to SET.     */
  22799     soc_reg_t           reg;             /* Variable to hold SOC register.    */
  22800     soc_ctr_control_info_t ctrl_info;    /* Centralized counter information.  */
  22801 
  22802     /* Input parameters check. */
  22803     if (NULL == f_st) {
  22804         return (BCM_E_PARAM);
  22805     }
  22806 
  22807     /* Check that stat was requested during statistics entity creation. */
  22808     for (idx1 = 0; idx1 < f_st->nstat; idx1++) {
  22809         if (stat == f_st->stat_arr[idx1]) {
  22810             break;
  22811         }
  22812     }
  22813     if (idx1 == f_st->nstat) {
  22814         return (BCM_E_PARAM);
  22815     }
  22816 
  22817     /* Get field control structure. */
  22818     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  22819 
  22820     /* Get hw indexes and flags needed to compose requested statistic.*/
  22821     rv = fc->functions.fp_stat_index_get(unit, f_st, stat, &idx1,
  22822                                          &idx2, &idx3, &flags);
  22823     BCM_IF_ERROR_RETURN(rv);
  22824 
  22825     if (_FP_INVALID_INDEX == idx1) {
  22826         return (BCM_E_INTERNAL);
  22827     }
  22828 
  22829     if (_BCM_FIELD_STAGE_EGRESS == f_st->stage_id) {
  22830         int                 inst;            /* Pipe Instance.          */
  22831         _field_group_t      *fg;             /* Field Group structure.  */
  22832         _field_stage_t      *stage_fc;       /* Field Stage Structure.  */
  22833 
  22834         /* Get group descriptor. */
  22835         rv = _field_group_get (unit, f_st->gid, &fg);
  22836         BCM_IF_ERROR_RETURN(rv);
  22837 
  22838         /* Get Stage descriptor */
  22839         BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, f_st->stage_id,
  22840                                                  &stage_fc));
  22841 
  22842         if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  22843            inst = 0;
  22844         } else {
  22845            inst = fg->instance;
  22846         }
  22847 
  22848         if (flags & _FP_STAT_BYTES) {
  22849             reg = SOC_COUNTER_NON_DMA_EFP_BYTE;
  22850             /* For Tomahawk BYTE_COUNTERf field_length = 34*/
  22851             len = soc_mem_field_length(unit, EFP_COUNTER_TABLEm, BYTE_COUNTERf);
  22852         } else {
  22853             reg = SOC_COUNTER_NON_DMA_EFP_PKT;
  22854             /* For Tomahawk field_length = 26 */
  22855             len = soc_mem_field_length(unit, EFP_COUNTER_TABLEm,
  22856                                                 PACKET_COUNTERf);
  22857         }
  22858 
  22859         if (len < 32) {
  22860             COMPILER_64_SET(hw_value, 0,
  22861                             COMPILER_64_LO(value) & ((1 << len) - 1));
  22862         } else {
  22863             COMPILER_64_SET(hw_value,
  22864                             COMPILER_64_HI(value) & ((1 << (len - 32)) - 1),
  22865                                                      COMPILER_64_LO(value));
  22866         }
  22867 
  22868         
  22869         if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  22870             ctrl_info.instance = _FP_GLOBAL_INST;
  22871         } else {
  22872             ctrl_info.instance = inst;
  22873         }
  22874 
  22875         ctrl_info.instance_type = SOC_CTR_INSTANCE_TYPE_PIPE;
  22876         COMPILER_64_ZERO(reset_val);
  22877 
  22878         rv = soc_counter_generic_set(unit, reg,
  22879                                      ctrl_info, 0,
  22880                                      idx1, reset_val);
  22881         BCM_IF_ERROR_RETURN(rv);
  22882         /* Reset accumulated counter value at secondary index. */
  22883         if (_FP_INVALID_INDEX != idx2) {
  22884             rv = soc_counter_generic_set(unit, reg,
  22885                                          ctrl_info, 0,
  22886                                          idx2, reset_val);
  22887             BCM_IF_ERROR_RETURN(rv);
  22888         }
  22889 
  22890         if (_FP_INVALID_INDEX != idx3) {
  22891             rv = soc_counter_generic_set(unit, reg,
  22892                                          ctrl_info, 0,
  22893                                          idx3, reset_val);
  22894             BCM_IF_ERROR_RETURN(rv);
  22895         }
  22896 
  22897         /* Set accumulated counter value at primary index. */
  22898         ctrl_info.instance = inst;
  22899         rv = soc_counter_generic_set(unit, reg,
  22900                                      ctrl_info, 0,
  22901                                      idx1, hw_value);
  22902         BCM_IF_ERROR_RETURN(rv);
  22903     } else if ((_BCM_FIELD_STAGE_INGRESS == f_st->stage_id) ||
  22904                (_BCM_FIELD_STAGE_EXACTMATCH == f_st->stage_id)) {
  22905 
  22906         if (flags & _FP_STAT_BYTES) {
  22907             COMPILER_64_SET(stat_val.bytes,
  22908                             COMPILER_64_HI(value),
  22909                             COMPILER_64_LO(value));
  22910         } else {
  22911             stat_val.packets = 0;
  22912             COMPILER_64_SET(stat_val.packets64,
  22913                             COMPILER_64_HI(value),
  22914                             COMPILER_64_LO(value));
  22915         }
  22916 
  22917         /* Set accumulated counter value at primary index. */
  22918         /* coverity[uninit_use_in_call : FALSE] */
  22919         rv = _bcm_esw_stat_counter_raw_set(unit,
  22920                                            f_st->flex_mode,
  22921                                            (flags & _FP_STAT_BYTES) ? 1 : 0,
  22922                                            idx1 - f_st->hw_index,
  22923                                            &stat_val);
  22924         BCM_IF_ERROR_RETURN(rv);
  22925 
  22926         if (_FP_INVALID_INDEX != idx2) {
  22927             COMPILER_64_ZERO(stat_val.bytes);
  22928             stat_val.packets = 0;
  22929             COMPILER_64_ZERO(stat_val.packets64);
  22930             /* Reset accumulated counter value at secondary index. */
  22931             /* coverity[uninit_use_in_call : FALSE] */
  22932              rv = _bcm_esw_stat_counter_raw_set(unit,
  22933                                                f_st->flex_mode,
  22934                                                (flags & _FP_STAT_BYTES) ? 1 : 0,
  22935                                                idx2 - f_st->hw_index,
  22936                                                &stat_val);
  22937              BCM_IF_ERROR_RETURN(rv);
  22938         }
  22939 
  22940         if (_FP_INVALID_INDEX != idx3) {
  22941             COMPILER_64_ZERO(stat_val.bytes);
  22942             stat_val.packets = 0;
  22943             COMPILER_64_ZERO(stat_val.packets64);
  22944             /* Reset accumulated counter value at ternary index. */
  22945             /* coverity[uninit_use_in_call : FALSE] */
  22946              rv = _bcm_esw_stat_counter_raw_set(unit,
  22947                                                f_st->flex_mode,
  22948                                                (flags & _FP_STAT_BYTES) ? 1 : 0,
  22949                                                idx3 - f_st->hw_index,
  22950                                                &stat_val);
  22951              BCM_IF_ERROR_RETURN(rv);
  22952         }
  22953     } else {
  22954         return BCM_E_INTERNAL;
  22955     }
  22956 
  22957     return (rv);
  22958 }
  22959 
  22960 /*
  22961  * Function:
  22962  *      _bcm_th_field_stat_value_get
  22963  *
  22964  * Description:
  22965  *      Get 64 bit counter value for specific statistic type.
  22966  * Parameters:
  22967  *      unit      - (IN) BCM device number.
  22968  *      f_st      - (IN) Statistics entity descriptor.
  22969  *      stat      - (IN) Collected statistics descriptor.
  22970  *      value     - (OUT) Collected counters value.
  22971  * Returns:
  22972  *      BCM_E_XXX
  22973  */
  22974 int
  22975 _bcm_th_field_stat_value_get(int unit, int sync_mode,
  22976                              _field_stat_t *f_st,
  22977                              bcm_field_stat_t stat,
  22978                              uint64 *value)
  22979 {
  22980 
  22981     int                 idx1;     /* First counter index to read.      */
  22982     int                 idx2;     /* Second counter index to read.     */
  22983     int                 idx3;     /* Third counter index to read.      */
  22984     int                 rv;       /* Operation return status.          */
  22985     uint32              flags;    /* _FP_STAT_XXX.                     */
  22986     uint64              count_1;  /* Primary index packet count.       */
  22987     uint64              count_2;  /* Primary index byte count.         */
  22988     uint64              count_3;  /* Third counterindex byte count.    */
  22989     _field_control_t    *fc;      /* Field control structure.          */
  22990     soc_ctr_control_info_t ctrl_info;
  22991     soc_reg_t reg;
  22992     bcm_stat_value_t stat_val;
  22993 
  22994     if (NULL == f_st || NULL == value) {
  22995         return BCM_E_PARAM;
  22996     }
  22997 
  22998     /* Initialization. */
  22999     COMPILER_64_ZERO(count_1);
  23000     COMPILER_64_ZERO(count_2);
  23001     COMPILER_64_ZERO(count_3);
  23002     idx1 = idx2 = idx3 = _FP_INVALID_INDEX;
  23003     flags = 0;
  23004 
  23005     /* Check that stat was requested during statistics entity creation. */
  23006     for (idx1 = 0; idx1 < f_st->nstat; idx1++) {
  23007         if (stat == f_st->stat_arr[idx1]) {
  23008             break;
  23009         }
  23010     }
  23011     if (idx1 == f_st->nstat) {
  23012         return (BCM_E_PARAM);
  23013     }
  23014 
  23015     /* Get field control structure. */
  23016     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  23017 
  23018     /* If stat sync field control is enabled, get the status from h/w. */
  23019     if (fc->flags & _FP_STAT_SYNC_ENABLE) {
  23020         sync_mode = 1;
  23021     } else {
  23022         sync_mode = 0;
  23023     }
  23024 
  23025     /* Get hw indexes and flags needed to compose requested statistic.*/
  23026     rv = fc->functions.fp_stat_index_get(unit, f_st, stat, &idx1,
  23027                                          &idx2, &idx3, &flags);
  23028     BCM_IF_ERROR_RETURN(rv);
  23029 
  23030     if (!(f_st->hw_flags & _FP_STAT_FLEX_CNTR)) {
  23031         /* Fixed Counters - for stage BCM_FIELD_STAGE_EGRESS */
  23032         int                 inst;            /* Pipe Instance.          */
  23033         _field_stage_t      *stage_fc;       /* Field Stage Structure.  */
  23034         _field_group_t      *fg;             /* Field Group structure.  */
  23035 
  23036         /* Get group descriptor. */
  23037         rv = _field_group_get (unit, f_st->gid, &fg);
  23038         BCM_IF_ERROR_RETURN(rv);
  23039 
  23040         /* Get Stage descriptor */
  23041         BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, f_st->stage_id,
  23042                                                  &stage_fc));
  23043 
  23044         if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  23045            inst = _FP_GLOBAL_INST;
  23046         } else {
  23047            inst = fg->instance;
  23048         }
  23049 
  23050         ctrl_info.instance = inst;
  23051         ctrl_info.instance_type = SOC_CTR_INSTANCE_TYPE_PIPE;
  23052 
  23053         if (flags & _FP_STAT_BYTES) {
  23054             reg = SOC_COUNTER_NON_DMA_EFP_BYTE;
  23055         } else {
  23056             reg = SOC_COUNTER_NON_DMA_EFP_PKT;
  23057         }
  23058 
  23059         /* Get accumulated counter value at primary index. */
  23060         if (_FP_INVALID_INDEX != idx1) {
  23061             rv = soc_counter_generic_get (unit, reg,
  23062                                           ctrl_info, sync_mode,
  23063                                           idx1, &count_1);
  23064             BCM_IF_ERROR_RETURN(rv);
  23065         }
  23066 
  23067         /* Get accumulated counter value at secondary index. */
  23068         if (_FP_INVALID_INDEX != idx2) {
  23069             rv = soc_counter_generic_get (unit, reg,
  23070                                           ctrl_info, sync_mode,
  23071                                           idx2, &count_2);
  23072             BCM_IF_ERROR_RETURN(rv);
  23073         }
  23074 
  23075         /* Get accumulated counter value at secondary index. */
  23076         if (_FP_INVALID_INDEX != idx3) {
  23077             rv = soc_counter_generic_get (unit, reg,
  23078                                           ctrl_info, sync_mode,
  23079                                           idx3, &count_3);
  23080             BCM_IF_ERROR_RETURN(rv);
  23081         }
  23082 
  23083     } else if (((_BCM_FIELD_STAGE_INGRESS == f_st->stage_id) ||
  23084                 (_BCM_FIELD_STAGE_EXACTMATCH == f_st->stage_id) ||
  23085                 (_BCM_FIELD_STAGE_EGRESS == f_st->stage_id)) &&
  23086                (f_st->hw_flags & _FP_STAT_FLEX_CNTR) &&
  23087                (soc_feature(unit, soc_feature_advanced_flex_counter))) {
  23088 
  23089         /* Get accumulated counter value at primary index. */
  23090         if (_FP_INVALID_INDEX != idx1) {
  23091             rv = _bcm_esw_stat_counter_raw_get(unit, sync_mode, f_st->flex_mode,
  23092                                                (flags & _FP_STAT_BYTES) ? 1 : 0,
  23093                                                           idx1 - f_st->hw_index,
  23094                                                                      &stat_val);
  23095             /*
  23096              * Flex STAT module is initalized before field module during reset.
  23097              * Attempt to read flex stats by field module would result in
  23098              * error. Ignore these errors.
  23099              */
  23100             if (BCM_FAILURE(rv)) {
  23101                 if (TRUE == fc->init) {
  23102                     return (rv);
  23103                 } else {
  23104                     return (BCM_E_NOT_FOUND);
  23105                 }
  23106             } else {
  23107                 /* Store retrieved stat value in return variable. */
  23108                 if (flags & _FP_STAT_BYTES) {
  23109                     COMPILER_64_OR(count_1, stat_val.bytes);
  23110                 } else {
  23111                     COMPILER_64_OR(count_1, stat_val.packets64);
  23112                 }
  23113             }
  23114         }
  23115 
  23116         /* Get accumulated counter value at secondary index. */
  23117         if (_FP_INVALID_INDEX != idx2) {
  23118 
  23119             rv = _bcm_esw_stat_counter_raw_get(unit, sync_mode, f_st->flex_mode,
  23120                                                (flags & _FP_STAT_BYTES) ? 1 : 0,
  23121                                                           idx2 - f_st->hw_index,
  23122                                                                      &stat_val);
  23123             /*
  23124              * Flex STAT module is initalized before field module during reset.
  23125              * Attempt to read flex stats by field module would result in
  23126              * error. Ignore these errors.
  23127              */
  23128             if (BCM_FAILURE(rv)) {
  23129                 if (TRUE == fc->init) {
  23130                     return (rv);
  23131                 } else {
  23132                     return (BCM_E_NOT_FOUND);
  23133                 }
  23134             } else {
  23135                 /* Store retrieved stat value in return variable. */
  23136                 if (flags & _FP_STAT_BYTES) {
  23137                     COMPILER_64_OR(count_2, stat_val.bytes);
  23138                 } else {
  23139                     COMPILER_64_OR(count_2, stat_val.packets64);
  23140                 }
  23141             }
  23142 
  23143         }
  23144 
  23145         /* Get accumulated counter value at secondary index. */
  23146         if (_FP_INVALID_INDEX != idx3) {
  23147 
  23148             rv = _bcm_esw_stat_counter_raw_get(unit, sync_mode, f_st->flex_mode,
  23149                                                (flags & _FP_STAT_BYTES) ? 1 : 0,
  23150                                                           idx3 - f_st->hw_index,
  23151                                                                      &stat_val);
  23152             /*
  23153              * Flex STAT module is initalized before field module during reset.
  23154              * Attempt to read flex stats by field module would result in
  23155              * error. Ignore these errors.
  23156              */
  23157             if (BCM_FAILURE(rv)) {
  23158                 if (TRUE == fc->init) {
  23159                     return (rv);
  23160                 } else {
  23161                     return (BCM_E_NOT_FOUND);
  23162                 }
  23163             } else {
  23164                 /* Store retrieved stat value in return variable. */
  23165                 if (flags & _FP_STAT_BYTES) {
  23166                     COMPILER_64_OR(count_3, stat_val.bytes);
  23167                 } else {
  23168                     COMPILER_64_OR(count_3, stat_val.packets64);
  23169                 }
  23170             }
  23171         }
  23172 
  23173     } else {
  23174         return BCM_E_INTERNAL;
  23175     }
  23176 
  23177     /* Get final counter value. */
  23178     COMPILER_64_ZERO(*value);
  23179     if (flags & _FP_STAT_ADD) {
  23180         COMPILER_64_ADD_64(count_1, count_2);
  23181         COMPILER_64_ADD_64(count_1, count_3);
  23182     } else if (flags & _FP_STAT_SUBSTRACT) {
  23183         COMPILER_64_SUB_64(count_1, count_2);
  23184     }
  23185     COMPILER_64_OR(*value, count_1);
  23186     return (BCM_E_NONE);
  23187 }
  23188 
  23189 /*
  23190  * Function:
  23191  *      _bcm_field_th_multi_pipe_stat_value_get
  23192  *
  23193  * Description:
  23194  *      Get 64 bit counter value for specific statistic type.
  23195  * Parameters:
  23196  *      unit      - (IN) BCM device number.
  23197  *      f_st      - (IN) Statistics entity descriptor.
  23198  *      stat      - (IN) Collected statistics descriptor.
  23199  *      value     - (OUT) Collected counters value.
  23200  * Returns:
  23201  *      BCM_E_XXX
  23202  */
  23203 int
  23204 _bcm_field_th_multi_pipe_stat_value_get(int unit,
  23205                                  _field_stat_t *f_st,
  23206                                  bcm_field_stat_t stat,
  23207                                  uint64 *value)
  23208 {
  23209     int                 idx1;            /* First counter index to read.      */
  23210     int                 idx2;            /* Second counter index to read.     */
  23211     int                 idx3;            /* Third counter index to read.      */
  23212     int                 rv;              /* Operation return status.          */
  23213     int                 stat_group_pipe; /* XGS Pipline associated
  23214                                             to the field group.               */
  23215     uint32              flags;           /* _FP_STAT_XXX.                     */
  23216     uint64              packet_count_1;  /* Primary index packet count.       */
  23217     uint64              byte_count_1;    /* Primary index byte count.         */
  23218     uint64              packet_count_2;  /* Secondary index packet count.     */
  23219     uint64              byte_count_2;    /* Secondary index byte count.       */
  23220     uint64              packet_count_3;  /* Third counter index packet count. */
  23221     uint64              byte_count_3;    /* Third counterindex byte count.    */
  23222     _field_stage_t      *stage_fc;       /* Stage field control.              */
  23223     _field_control_t    *fc;             /* Field control structure.          */
  23224 
  23225     /* Initialization. */
  23226     COMPILER_64_ZERO(packet_count_1);
  23227     COMPILER_64_ZERO(packet_count_2);
  23228     COMPILER_64_ZERO(packet_count_3);
  23229     COMPILER_64_ZERO(byte_count_1);
  23230     COMPILER_64_ZERO(byte_count_2);
  23231     COMPILER_64_ZERO(byte_count_3);
  23232     idx1 = idx2 = idx3 = _FP_INVALID_INDEX;
  23233     flags = 0;
  23234 
  23235     /* Get field control. */
  23236     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  23237 
  23238     /* Stage field control structure. */
  23239     rv = _field_stage_control_get(unit, f_st->stage_id, &stage_fc);
  23240     BCM_IF_ERROR_RETURN(rv);
  23241 
  23242     /* Check that stat was requested during statistics entity creation. */
  23243     for (idx1 = 0; idx1 < f_st->nstat; idx1++) {
  23244         if (stat == f_st->stat_arr[idx1]) {
  23245             break;
  23246         }
  23247     }
  23248     if (idx1 == f_st->nstat) {
  23249         return (BCM_E_PARAM);
  23250     }
  23251 
  23252     /* Get hw indexes and flags needed to compose requested statistic.*/
  23253     rv = fc->functions.fp_stat_index_get(unit, f_st, stat, &idx1,
  23254                                          &idx2, &idx3, &flags);
  23255     BCM_IF_ERROR_RETURN(rv);
  23256 
  23257     stat_group_pipe = _BCM_FIELD_GLOBAL_GROUP;
  23258 
  23259     /* Get accumulated counter value at primary index. */
  23260     if (_FP_INVALID_INDEX != idx1) {
  23261         rv = _field_th_multi_pipe_sw_counter_get(unit, stage_fc,
  23262                                               stat_group_pipe, idx1,
  23263                                               &packet_count_1,
  23264                                               &byte_count_1);
  23265         BCM_IF_ERROR_RETURN(rv);
  23266     }
  23267 
  23268     /* Get accumulated counter value at secondary index. */
  23269     if (_FP_INVALID_INDEX != idx2) {
  23270         rv = _field_th_multi_pipe_sw_counter_get(unit, stage_fc,
  23271                                               stat_group_pipe, idx2,
  23272                                               &packet_count_2,
  23273                                               &byte_count_2);
  23274         BCM_IF_ERROR_RETURN(rv);
  23275     }
  23276 
  23277     /* Get accumulated counter value at secondary index. */
  23278     if (_FP_INVALID_INDEX != idx3) {
  23279         rv = _field_th_multi_pipe_sw_counter_get(unit, stage_fc,
  23280                                               stat_group_pipe, idx3,
  23281                                               &packet_count_3,
  23282                                               &byte_count_3);
  23283         BCM_IF_ERROR_RETURN(rv);
  23284     }
  23285 
  23286     /* Get final counter value. */
  23287     COMPILER_64_ZERO(*value);
  23288     if (flags & _FP_STAT_BYTES) {
  23289         if (flags & _FP_STAT_ADD) {
  23290             COMPILER_64_ADD_64(byte_count_1, byte_count_2);
  23291             COMPILER_64_ADD_64(byte_count_1, byte_count_3);
  23292         } else if (flags & _FP_STAT_SUBSTRACT) {
  23293             COMPILER_64_SUB_64(byte_count_1, byte_count_2);
  23294         }
  23295         COMPILER_64_OR(*value, byte_count_1);
  23296     } else {
  23297         if (flags & _FP_STAT_ADD) {
  23298             COMPILER_64_ADD_64(packet_count_1, packet_count_2);
  23299             COMPILER_64_ADD_64(packet_count_1, packet_count_3);
  23300         } else if (flags & _FP_STAT_SUBSTRACT) {
  23301             COMPILER_64_SUB_64(packet_count_1, packet_count_2);
  23302         }
  23303         COMPILER_64_OR(*value, packet_count_1);
  23304     }
  23305     return (BCM_E_NONE);
  23306 }
  23307 
  23308 /*
  23309  * Function:
  23310  *     _field_th_counter_multi_pipe_memacc_alloc
  23311  * Purpose:
  23312  *     Initialize software cached memory access info for field counters
  23313  *
  23314  * Parameters:
  23315  *     unit         - (IN) BCM device number.
  23316  *     mem          - (IN) Counter memory.
  23317  *     descr        - (IN) Counter descriptor.
  23318  *     ptr          - (OUT) Allocated pointer.
  23319  * Returns:
  23320  *     BCM_E_XXX
  23321  */
  23322 STATIC int
  23323 _field_th_counter_multi_pipe_memacc_alloc(int unit, soc_memacc_t **memacc_ptr)
  23324 {
  23325     int mem_size; /* Total memory size of memory access info of
  23326                      all different counter in all pipes */
  23327 
  23328     /* Input parameters check. */
  23329     if (NULL == memacc_ptr) {
  23330         return (BCM_E_PARAM);
  23331     }
  23332 
  23333     mem_size = _FIELD_COUNTER_MEMACC_PIPE_NUM * sizeof(soc_memacc_t);
  23334     *memacc_ptr = sal_alloc(mem_size, "FP counter memory access cache");
  23335     if (NULL == *memacc_ptr) {
  23336         return (BCM_E_MEMORY);
  23337     }
  23338     sal_memset(*memacc_ptr, 0, mem_size);
  23339     return (BCM_E_NONE);
  23340 }
  23341 
  23342 /*
  23343  * Function:
  23344  *     _bcm_field_th_counter_multi_pipe_collect_init
  23345  * Purpose:
  23346  *     Initialize software field 64bit counters.
  23347  *
  23348  * Parameters:
  23349  *     unit         - (IN) BCM device number.
  23350  *     fc           - (IN) Field control structure.
  23351  *     stage_fc     - (IN/OUT) Stage field control structure.
  23352  *
  23353  * Returns:
  23354  *     BCM_E_XXX
  23355  */
  23356 int
  23357 _bcm_field_th_counter_multi_pipe_collect_init(int unit,
  23358                                        _field_control_t *fc,
  23359                                        _field_stage_t *stage_fc)
  23360 {
  23361     int              rv = BCM_E_NONE; /* Operation return status.            */
  23362     int              pipe;            /* XGS pipeline to operate on.         */
  23363     int              max_pipes;       /* Maximum XGS pipelines in the stage. */
  23364     soc_memacc_t     *memacc_list;    /* Memory access cache list.           */
  23365     soc_mem_t        counter_mem[_FP_MAX_NUM_PIPES]; /* FieldProcessor
  23366                                                            (IFP/EFP/VFP)
  23367                                                            counter memories  */
  23368     /* Input parameters check. */
  23369     if (NULL == stage_fc) {
  23370         return (BCM_E_PARAM);
  23371     }
  23372 
  23373     rv = _bcm_field_th_multi_pipe_counter_mem_get(unit, stage_fc,
  23374                                                   counter_mem);
  23375     BCM_IF_ERROR_RETURN(rv);
  23376 
  23377 
  23378     max_pipes = stage_fc->num_pipes;
  23379 
  23380     /* Check if stage has counters. */
  23381     if (INVALIDm == counter_mem[0]) {
  23382         return (BCM_E_NONE);
  23383     }
  23384 
  23385     /* Allocate space for cached counter memory access info */
  23386     rv = _field_th_counter_multi_pipe_memacc_alloc(unit,
  23387                                    &(stage_fc->_field_memacc_counters));
  23388     if (BCM_FAILURE(rv)) {
  23389         return (rv);
  23390     }
  23391     memacc_list = stage_fc->_field_memacc_counters;
  23392 
  23393     for (pipe = 0; pipe < max_pipes; pipe++) {
  23394 
  23395         rv = _bcm_field_counter32_collect_alloc(unit, counter_mem[pipe],
  23396                                                "FP pipeline counters",
  23397                                            &stage_fc->_field_32_counters[pipe]);
  23398         if (BCM_FAILURE(rv)) {
  23399             _bcm_field_counter_collect_deinit(unit, stage_fc);
  23400             return (rv);
  23401         }
  23402 
  23403         rv = _bcm_field_counter64_collect_alloc(unit, counter_mem[pipe],
  23404                                             "FP pipeline byte counters",
  23405                                            &stage_fc->_field_64_counters[pipe]);
  23406         if (BCM_FAILURE(rv)) {
  23407             _bcm_field_counter_collect_deinit(unit, stage_fc);
  23408             return (rv);
  23409         }
  23410 
  23411         rv = soc_memacc_init(unit, counter_mem[pipe], BYTE_COUNTERf,
  23412                                  &(memacc_list[(pipe * 2)]));
  23413         if(BCM_FAILURE(rv)) {
  23414             _bcm_field_counter_collect_deinit(unit, stage_fc);
  23415             return (rv);
  23416         }
  23417 
  23418         rv = soc_memacc_init(unit, counter_mem[pipe], PACKET_COUNTERf,
  23419                             &(memacc_list[((pipe * 2) + 1)]));
  23420 
  23421         if(BCM_FAILURE(rv)) {
  23422             _bcm_field_counter_collect_deinit(unit, stage_fc);
  23423             return (rv);
  23424         }
  23425     }
  23426     return (rv);
  23427 }
  23428 
  23429 /*
  23430  * Function:
  23431  *  _bcm_field_th_multi_pipe_sw_counter_update
  23432  * Description:
  23433  *  Service routine used to update 64-bit software accumulated counters.
  23434  *  based on hw memory block.
  23435  * Parameters:
  23436  *   unit     - (IN) BCM device number.
  23437  *   stage_fc - (IN/OUT) Stage field control structure.
  23438  *   mem      - (IN) Counters memory.
  23439  *   idx_min  - (IN) First counter index in the buffer.
  23440  *   idx_max  - (IN) Last counter index in the buffer.
  23441  *   buf      - (IN) Counters buffer.
  23442  *   flags    - (IN) Device counters flags.
  23443  * Returns:
  23444  *  BCM_E_XXX
  23445  */
  23446 int
  23447 _bcm_field_th_multi_pipe_sw_counter_update(int unit, _field_stage_t *stage_fc,
  23448                                         soc_mem_t mem, int idx_min, int idx_max,
  23449                                         char *buf, int pipe)
  23450 {
  23451     int                    rv = BCM_E_NONE; /* Operartion return status.      */
  23452     int                    idx;             /* Iteration index.               */
  23453     int                    buf_offset;      /* Offset into counters buffer.   */
  23454     uint32                 *entry_p;        /* HW entry pointer.              */
  23455     _field_control_t       *fc;             /* Field control structure.       */
  23456 
  23457     if ((NULL == stage_fc) || (NULL == buf)) {
  23458         return BCM_E_PARAM;
  23459     }
  23460 
  23461     /* Get field control structure. */
  23462     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  23463     for (idx = idx_min, buf_offset = 0; idx <= idx_max; idx++, buf_offset++) {
  23464         /* Read counter value from the first memory. */
  23465         entry_p = soc_mem_table_idx_to_pointer(unit, mem, uint32 *,
  23466                                                buf, buf_offset);
  23467 
  23468         /* Process accumulated counter value. */
  23469         rv = _bcm_field_th_pipe_counter_get(unit, stage_fc, mem, entry_p,
  23470                                             idx, pipe, NULL, NULL);
  23471         if (BCM_FAILURE(rv)) {
  23472             break;
  23473         }
  23474     }
  23475     return rv;
  23476 }
  23477 
  23478 /*
  23479  * Function:
  23480  *    _field_th_multi_pipe_mem_counters_read
  23481  * Description:
  23482  *    Service routine used to coolect 64-bit software accumulated counters.
  23483  *    for a specific stage.
  23484  * Parameters:
  23485  *    unit     - (IN) BCM device number.
  23486  *    mem      - (IN) Counters memory.
  23487  *    pipe     - (IN) XGS pipeline to operate on.
  23488  *    stage_fc - (IN/OUT) Stage field control structure.
  23489  * Returns:
  23490  *  BCM_E_XXX
  23491  */
  23492 STATIC int
  23493 _field_th_multi_pipe_mem_counters_read(int unit,
  23494                                     soc_mem_t mem,
  23495                                     int pipe,
  23496                                     _field_stage_t *stage_fc)
  23497 {
  23498     int       rv = BCM_E_NONE;       /* Operation return value.   */
  23499     int       idx;                   /* Table iteration index.    */
  23500     int       buf_end_idx;           /* Buffer end index.         */
  23501     int       alloc_size;            /* DMA buffer size.          */
  23502     int       max_idx;               /* Counter memory index max. */
  23503     int       min_idx;               /* Counter memory index min. */
  23504     char      *buf;                  /* Buffer to read the table. */
  23505 
  23506 
  23507     /* Input parameters check. */
  23508     if (NULL == stage_fc) {
  23509         return (BCM_E_PARAM);
  23510     }
  23511 
  23512     /* Make sure memory is valid */
  23513     if (INVALIDm == mem) {
  23514         return BCM_E_INTERNAL;
  23515     }
  23516 
  23517     /* Get table boundaries. */
  23518     min_idx = soc_mem_index_min(unit, mem);
  23519     max_idx = soc_mem_index_max(unit, mem);
  23520 
  23521     /* Allocate memory buffer. */
  23522     alloc_size = (_FP_64_COUNTER_BUCKET * sizeof(fp_counter_table_entry_t));
  23523     buf = soc_cm_salloc(unit, alloc_size, "fp_64_bit_counter");
  23524     if (buf == NULL) {
  23525         return (BCM_E_MEMORY);
  23526     }
  23527 
  23528     /* Dma part of the table & update software counters. */
  23529     soc_mem_lock(unit, mem);
  23530     for (idx = min_idx; idx <= max_idx; idx += _FP_64_COUNTER_BUCKET) {
  23531         buf_end_idx = MIN(max_idx, (idx + _FP_64_COUNTER_BUCKET - 1));
  23532         /* Dma range of entries in counter table. */
  23533         rv = soc_mem_read_range(unit, mem, MEM_BLOCK_ANY, idx,
  23534                                     buf_end_idx, buf);
  23535         if (BCM_FAILURE(rv)) {
  23536             break;
  23537         }
  23538 
  23539         rv = _bcm_field_th_multi_pipe_sw_counter_update(unit, stage_fc,
  23540                                                      mem, idx,
  23541                                                      buf_end_idx,
  23542                                                      buf, pipe);
  23543         if (BCM_FAILURE(rv)) {
  23544             break;
  23545         }
  23546     }
  23547     soc_mem_unlock(unit, mem);
  23548     soc_cm_sfree(unit, buf);
  23549     return (rv);
  23550 }
  23551 
  23552 /*
  23553  * Function:
  23554  *  _bcm_field_th_stage_multi_pipe_counters_collect
  23555  * Description:
  23556  *  Service routine used to coolect  64-bit software accumulated counters.
  23557  *  for a specific stage.
  23558  * Parameters:
  23559  *   unit     - (IN) BCM device number.
  23560  *   fc       - (IN) Field control structure.
  23561  *   stage_fc - (IN/OUT) Stage field control structure.
  23562  * Returns:
  23563  *  BCM_E_XXX
  23564  * Notes:
  23565  *  None.
  23566  */
  23567 int
  23568 _bcm_field_th_stage_multi_pipe_counters_collect (int unit, _field_control_t *fc,
  23569                                _field_stage_t *stage_fc)
  23570 {
  23571     int              rv = BCM_E_NONE; /* Operation return value.            */
  23572     int              pipe;            /* XGS pipeline to operate on.        */
  23573     int              max_pipes;       /* Maximum XGS pipelines in the stage */
  23574     soc_mem_t        counter_mem[_FP_MAX_NUM_PIPES]; /* FieldProcessor
  23575                                                            (IFP/EFP/VFP)
  23576                                                            counter memories */
  23577     /* Input parameters check. */
  23578     if (NULL == stage_fc || NULL == fc) {
  23579         return (BCM_E_PARAM);
  23580     }
  23581 
  23582     max_pipes = stage_fc->num_pipes;
  23583     for (pipe = 0; pipe < max_pipes; pipe++ ) {
  23584         if (NULL == stage_fc->_field_32_counters[pipe] ||
  23585             NULL == stage_fc->_field_64_counters[pipe])
  23586             return BCM_E_UNAVAIL;
  23587     }
  23588 
  23589     /* Get counters memory for the stage. */
  23590     rv = _bcm_field_th_multi_pipe_counter_mem_get(unit, stage_fc,
  23591                                                      counter_mem);
  23592     BCM_IF_ERROR_RETURN(rv);
  23593 
  23594     for (pipe = 0; pipe < max_pipes; pipe++ ) {
  23595         if (INVALIDm != counter_mem[pipe]) {
  23596         BCM_IF_ERROR_RETURN
  23597             (_field_th_multi_pipe_mem_counters_read(unit, counter_mem[pipe],
  23598                                                  pipe, stage_fc));
  23599         }
  23600     }
  23601 
  23602     return BCM_E_NONE;
  23603 }
  23604 
  23605 /*
  23606  * Function:
  23607  *     _bcm_th_field_counter_config_set
  23608  * Description:
  23609  *     To set the SOC configuration for EFP counters.
  23610  * Parameters:
  23611  *     unit     - (IN) BCM device number.
  23612  * Returns:
  23613  *     BCM_E_XXX
  23614  * Notes:
  23615  *     Field module must perform 2 steps to start the counter module to
  23616  *     start performing the DMA.
  23617  *     1. Enable the DMA for the respective counter (Both PKT/BYTE)
  23618  *     2. Setup a DMA profile.
  23619  */
  23620 
  23621 int
  23622 _bcm_th_field_counter_config_set(int unit)
  23623 {
  23624     int rv;
  23625     int count;
  23626     soc_ctr_control_info_t ctrl_info;
  23627     soc_ctr_ctrl_config_t  ctrl_config;
  23628 
  23629     ctrl_info.instance_type = SOC_CTR_INSTANCE_TYPE_PIPE;
  23630     ctrl_info.instance = -1;
  23631     ctrl_config.config_type = SOC_CTR_CTRL_CONFIG_DMA_ENABLE;
  23632     ctrl_config.config_val = 1; /* Enable DMA */
  23633     count = 1;
  23634     rv = soc_counter_config_multi_set(unit, SOC_COUNTER_NON_DMA_EFP_PKT,
  23635                                       count, &ctrl_info, &ctrl_config);
  23636     BCM_IF_ERROR_RETURN(rv);
  23637 
  23638     rv = soc_counter_config_multi_set(unit, SOC_COUNTER_NON_DMA_EFP_BYTE,
  23639                                   count, &ctrl_info, &ctrl_config);
  23640 
  23641     BCM_IF_ERROR_RETURN(rv);
  23642 
  23643     ctrl_config.config_type = SOC_CTR_CTRL_CONFIG_DMA_RATE_PROFILE_ALL;
  23644     ctrl_config.config_val = 1; /* Enable ALL profiles for EFP_PKT */
  23645     rv = soc_counter_config_multi_set (unit, SOC_COUNTER_NON_DMA_EFP_PKT,
  23646                                        count, &ctrl_info, &ctrl_config);
  23647 
  23648     BCM_IF_ERROR_RETURN(rv);
  23649 
  23650     rv = soc_counter_config_multi_set(unit, SOC_COUNTER_NON_DMA_EFP_BYTE,
  23651                                   count, &ctrl_info, &ctrl_config);
  23652     return rv;
  23653 }
  23654 
  23655               /*  END OF COUNTER ROUTINES */
  23656 
  23657               /*  START OF POLICER ROUTINES */
  23658 /*
  23659  * Function:
  23660  *     _bcm_field_th_policer_mem_get
  23661  * Purpose:
  23662  *     Get policer table name.
  23663  * Parameters:
  23664  *     unit         - (IN)  BCM device number
  23665  *     stage_fc     - (IN)  Field Processor stage control structure.
  23666  *     counter_mem  - (OUT) pointer to array of counter memories.
  23667  * Returns:
  23668  *     BCM_E_XXX
  23669  */
  23670 int
  23671 _bcm_field_th_policer_mem_get(int unit,
  23672                               _field_stage_t *stage_fc,
  23673                               int instance,
  23674                               soc_mem_t *policer_mem)
  23675 {
  23676     int pipe;
  23677     soc_mem_t mem = INVALIDm;
  23678 
  23679     if (NULL == policer_mem || NULL == stage_fc) {
  23680         return (BCM_E_PARAM);
  23681     }
  23682 
  23683     pipe = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  23684                _FP_GLOBAL_INST : instance;
  23685 
  23686     *policer_mem = INVALIDm;
  23687 
  23688     switch (stage_fc->stage_id) {
  23689       case _BCM_FIELD_STAGE_INGRESS:
  23690       case _BCM_FIELD_STAGE_EXACTMATCH:
  23691           mem = IFP_METER_TABLEm;
  23692           break;
  23693       case _BCM_FIELD_STAGE_EGRESS:
  23694           mem = EFP_METER_TABLEm;
  23695           break;
  23696       default:
  23697           return (BCM_E_INTERNAL);
  23698     }
  23699 
  23700     /* Retrieve meter table name. */
  23701     return (_bcm_field_mem_instance_get(unit, mem, pipe, policer_mem));
  23702 }
  23703 
  23704 /*
  23705  * Function:
  23706  *     _bcm_field_th_policer_install
  23707  * Purpose:
  23708  *     Install a meter pair into the hardware tables.
  23709  * Parameters:
  23710  *     unit   - (IN) BCM device number.
  23711  *     f_ent  - (IN) Field entry.
  23712  *     f_pl   - (IN) Field policer descriptor.
  23713  * Returns:
  23714  *     BCM_E_XXX
  23715  */
  23716 int
  23717 _bcm_field_th_policer_install(int unit, _field_entry_t *f_ent,
  23718                                _field_policer_t *f_pl)
  23719 {
  23720     int       refresh_bitsize;          /* Number of bits for the
  23721                                            refresh rate field.                */
  23722     int       bucket_max_bitsize;       /* Number of bits for the
  23723                                            bucket max field.                  */
  23724     int       rv;                       /* Operation return status.           */
  23725     int       multi_factor;             /* Multiple Factor. */
  23726     uint32    bucketsize_peak = 0;      /* Bucket size.                       */
  23727     uint32    refresh_rate_peak = 0;    /* Policer refresh rate.              */
  23728     uint32    granularity_peak = 0;     /* Policer granularity.               */
  23729     uint32    bucketsize_commit = 0;    /* Bucket size.                       */
  23730     uint32    refresh_rate_commit = 0;  /* Policer refresh rate.              */
  23731     uint32    granularity_commit = 0;   /* Policer granularity.               */
  23732     uint32    flags;                    /* Policer flags.                     */
  23733     soc_mem_t policer_mem;              /* Meter table name.                  */
  23734     _field_stage_t *stage_fc;           /* Stage Field control structure.     */
  23735 
  23736     /* Input parameters check. */
  23737     if ((NULL == f_ent) || (NULL == f_pl)) {
  23738         return (BCM_E_PARAM);
  23739     }
  23740 
  23741     if (NULL == f_ent->group || NULL == f_ent->fs) {
  23742         return (BCM_E_INTERNAL);
  23743     }
  23744 
  23745     if (0 == (f_pl->hw_flags & _FP_POLICER_DIRTY)) {
  23746         return (BCM_E_NONE);
  23747     }
  23748 
  23749 
  23750     rv = _field_stage_control_get (unit, f_ent->fs->stage_id, &stage_fc);
  23751     BCM_IF_ERROR_RETURN(rv);
  23752 
  23753     /* Resolve meter table name. */
  23754     rv = _bcm_field_th_policer_mem_get(unit, stage_fc, f_ent->group->instance,
  23755                                        &policer_mem);
  23756     BCM_IF_ERROR_RETURN(rv);
  23757 
  23758     refresh_bitsize = soc_mem_field_length(unit, policer_mem, REFRESHCOUNTf);
  23759     bucket_max_bitsize = soc_mem_field_length(unit, policer_mem, BUCKETSIZEf);
  23760 
  23761     /* lookup bucket size from tables */
  23762     flags = _BCM_XGS_METER_FLAG_GRANULARITY | _BCM_XGS_METER_FLAG_FP_POLICER;
  23763 
  23764     /* TD2/TH has change in granularity calculation */
  23765     if (f_pl->cfg.flags & BCM_POLICER_MODE_PACKETS) {
  23766         flags = flags | _BCM_XGS_METER_FLAG_FP_TD2_POLICER;
  23767     }
  23768 
  23769     /* Set packet mode flags setting */
  23770     if (f_pl->cfg.flags & BCM_POLICER_MODE_PACKETS) {
  23771         flags |= _BCM_XGS_METER_FLAG_PACKET_MODE;
  23772     } else {
  23773         flags &= ~_BCM_XGS_METER_FLAG_PACKET_MODE;
  23774     }
  23775 
  23776     /* In Tomahawk EFP metering, Refresh tick duration has changed from
  23777      * 7.8125us to 15.625us ,but the RTL does not double the REFRESHCOUNT
  23778      * while putting the tokens into the bucket which is causing 50% lesser
  23779      * traffic rate than expected. So the work around is the value programmed
  23780      * from software in EFP meters needs to be doubled.
  23781      *
  23782      * In TH2, refresh tick is still 15.625 usec, but EFRESHCOUNT is doubled
  23783      * in HW before adding to the bucket per refresh
  23784      */
  23785 
  23786     multi_factor = 1;
  23787     if (SOC_IS_TOMAHAWK(unit) &&
  23788         (_BCM_FIELD_STAGE_EGRESS == stage_fc->stage_id)) {
  23789         multi_factor = 2;
  23790         refresh_bitsize--;
  23791     }
  23792 
  23793     if (f_pl->cfg.mode  != bcmPolicerModeSrTcm) {
  23794         if (f_pl->hw_flags & _FP_POLICER_COMMITTED_DIRTY) {
  23795             /* Calculate policer bucket size/refresh_rate/granularity. */
  23796             rv = _bcm_xgs_kbits_to_bucket_encoding(f_pl->cfg.ckbits_sec,
  23797                                                    f_pl->cfg.ckbits_burst,
  23798                                                    flags, refresh_bitsize,
  23799                                                    bucket_max_bitsize,
  23800                                                    &refresh_rate_commit,
  23801                                                    &bucketsize_commit,
  23802                                                    &granularity_commit);
  23803 
  23804             if ((INVALIDm != policer_mem) && BCM_SUCCESS(rv)) {
  23805                 /* Programm policer parameters into hw. */
  23806                 rv =  _bcm_field_trx_policer_hw_update(unit, f_ent, f_pl,
  23807                                                   BCM_FIELD_METER_COMMITTED,
  23808                                                   bucketsize_commit,
  23809                                                   (refresh_rate_commit *
  23810                                                    multi_factor),
  23811                                                   granularity_commit,
  23812                                                   policer_mem);
  23813                 BCM_IF_ERROR_RETURN(rv);
  23814 
  23815             }
  23816             f_pl->hw_flags &= ~_FP_POLICER_COMMITTED_DIRTY;
  23817         }
  23818 
  23819         if (f_pl->hw_flags & _FP_POLICER_PEAK_DIRTY) {
  23820 
  23821             if (_FP_POLICER_EXCESS_HW_METER(f_pl)) {
  23822                 /*
  23823                  * Rates are always set in committed variables,
  23824                  * for flow meters.
  23825                  */
  23826                 f_pl->cfg.pkbits_sec = f_pl->cfg.ckbits_sec;
  23827                 f_pl->cfg.pkbits_burst = f_pl->cfg.ckbits_burst;
  23828             }
  23829 
  23830             /* Calculate policer bucket size/refresh_rate/granularity. */
  23831             rv = _bcm_xgs_kbits_to_bucket_encoding(f_pl->cfg.pkbits_sec,
  23832                                                    f_pl->cfg.pkbits_burst,
  23833                                                    flags,
  23834                                                    refresh_bitsize,
  23835                                                    bucket_max_bitsize,
  23836                                                    &refresh_rate_peak,
  23837                                                    &bucketsize_peak,
  23838                                                    &granularity_peak);
  23839 
  23840             if ((INVALIDm != policer_mem) && BCM_SUCCESS(rv)) {
  23841                 /* Programm policer parameters into hw. */
  23842                 rv =  _bcm_field_trx_policer_hw_update(unit, f_ent, f_pl,
  23843                                                        BCM_FIELD_METER_PEAK,
  23844                                                        bucketsize_peak,
  23845                                                        (refresh_rate_peak *
  23846                                                         multi_factor),
  23847                                                        granularity_peak,
  23848                                                        policer_mem);
  23849                 BCM_IF_ERROR_RETURN(rv);
  23850 
  23851             }
  23852 
  23853             f_pl->hw_flags &= ~_FP_POLICER_PEAK_DIRTY;
  23854 
  23855             if (_FP_POLICER_EXCESS_HW_METER(f_pl)) {
  23856                 /* Reset peak meter rates. */
  23857                 f_pl->cfg.pkbits_sec = 0;
  23858                 f_pl->cfg.pkbits_burst = 0;
  23859             }
  23860         }
  23861     } else {
  23862         if (f_pl->hw_flags & _FP_POLICER_COMMITTED_DIRTY) {
  23863             /* Calculate policer bucket size/refresh_rate/granularity. */
  23864             rv = _bcm_xgs_kbits_to_bucket_encoding(f_pl->cfg.ckbits_sec,
  23865                                                    f_pl->cfg.ckbits_burst,
  23866                                                    flags, refresh_bitsize,
  23867                                                    bucket_max_bitsize,
  23868                                                    &refresh_rate_commit,
  23869                                                    &bucketsize_commit,
  23870                                                    &granularity_commit);
  23871             BCM_IF_ERROR_RETURN(rv);
  23872         }
  23873 
  23874         if (f_pl->hw_flags & _FP_POLICER_PEAK_DIRTY) {
  23875             /* Calculate policer bucket size/refresh_rate/granularity. */
  23876             rv = _bcm_xgs_kbits_to_bucket_encoding(f_pl->cfg.pkbits_sec,
  23877                                                    f_pl->cfg.pkbits_burst,
  23878                                                    flags,
  23879                                                    refresh_bitsize,
  23880                                                    bucket_max_bitsize,
  23881                                                    &refresh_rate_peak,
  23882                                                    &bucketsize_peak,
  23883                                                    &granularity_peak);
  23884             BCM_IF_ERROR_RETURN(rv);
  23885         }
  23886 
  23887         if (granularity_commit != granularity_peak) {
  23888             if (granularity_commit < granularity_peak) {
  23889                 rv = _bcm_xgs_kbits_to_dual_bucket_encoding(
  23890                                                          f_pl->cfg.ckbits_sec,
  23891                                                          f_pl->cfg.ckbits_burst,
  23892                                                          flags,
  23893                                                          refresh_bitsize,
  23894                                                          bucket_max_bitsize,
  23895                                                          granularity_peak,
  23896                                                          &refresh_rate_commit,
  23897                                                          &bucketsize_commit,
  23898                                                          &granularity_commit);
  23899             } else if (granularity_commit > granularity_peak) {
  23900                 rv = _bcm_xgs_kbits_to_dual_bucket_encoding(
  23901                                                          f_pl->cfg.pkbits_sec,
  23902                                                          f_pl->cfg.pkbits_burst,
  23903                                                          flags,
  23904                                                          refresh_bitsize,
  23905                                                          bucket_max_bitsize,
  23906                                                          granularity_commit,
  23907                                                          &refresh_rate_peak,
  23908                                                          &bucketsize_peak,
  23909                                                          &granularity_peak);
  23910             }
  23911             BCM_IF_ERROR_RETURN(rv);
  23912         }
  23913 
  23914 
  23915         if ((INVALIDm != policer_mem) && BCM_SUCCESS(rv)) {
  23916             /* Programm policer parameters into hw. */
  23917             rv =  _bcm_field_trx_policer_hw_update(unit, f_ent, f_pl,
  23918                                                   BCM_FIELD_METER_COMMITTED,
  23919                                                   bucketsize_commit,
  23920                                                   (refresh_rate_commit *
  23921                                                    multi_factor),
  23922                                                   granularity_commit,
  23923                                                   policer_mem);
  23924             BCM_IF_ERROR_RETURN(rv);
  23925         }
  23926 
  23927         f_pl->hw_flags &= ~_FP_POLICER_COMMITTED_DIRTY;
  23928 
  23929         if ((INVALIDm != policer_mem) && BCM_SUCCESS(rv)) {
  23930             /* Programm policer parameters into hw. */
  23931             rv =  _bcm_field_trx_policer_hw_update(unit, f_ent, f_pl,
  23932                                                  BCM_FIELD_METER_PEAK,
  23933                                                  bucketsize_peak,
  23934                                                  (refresh_rate_peak *
  23935                                                   multi_factor),
  23936                                                  granularity_peak,
  23937                                                  policer_mem);
  23938             BCM_IF_ERROR_RETURN(rv);
  23939         }
  23940 
  23941         f_pl->hw_flags &= ~_FP_POLICER_PEAK_DIRTY;
  23942     }
  23943 
  23944     /* Update current policer counters from hw */
  23945     rv = _field_entry_policer_update_actual_hw_rates(unit, policer_mem,
  23946             f_ent->group->instance, f_ent, f_pl);
  23947 
  23948     return BCM_E_NONE;
  23949 }
  23950 
  23951 /*
  23952  * Function:
  23953  *     _bcm_field_th_policer_meter_hw_free
  23954  *
  23955  * Purpose:
  23956  *     Clear the meter entries from the h/w associated with the policer
  23957  *
  23958  * Parameters:
  23959  *     unit      - (IN) BCM device number.
  23960  *     level     - (IN) Policer level.
  23961  *     f_ent     - (IN) Entry policer belongs to.
  23962  * Returns:
  23963  *     BCM_E_XXX
  23964  */
  23965 int
  23966 _bcm_field_th_policer_meter_hw_free(int unit, _field_entry_t *f_ent,
  23967                                  _field_entry_policer_t *f_ent_pl)
  23968 {
  23969     int                rv = BCM_E_NONE; /* Return value                  */
  23970     int                idx;             /* Meter hw index                */
  23971     soc_mem_t          policer_mem;     /* Meter table identifier.       */
  23972     _field_meter_pool_t *mp;            /* Meter pool pointer.           */
  23973     _field_slice_t *fs;                 /* Field slice pointer.          */
  23974     _field_stage_t    *stage_fc;        /* Stage field control structure */
  23975     _field_policer_t  *f_pl;            /* Policer descriptor            */
  23976     _field_stage_id_t stage_id;         /* Stage id used for metering.   */
  23977 
  23978     stage_id = (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id) ? \
  23979                    _BCM_FIELD_STAGE_INGRESS : f_ent->group->stage_id;
  23980 
  23981     /* Get field stage control structure. */
  23982     BCM_IF_ERROR_RETURN
  23983         (_field_stage_control_get(unit, stage_id,
  23984                                         &stage_fc));
  23985 
  23986     /* Resolve meter table name. */
  23987     rv = _bcm_field_th_policer_mem_get(unit, stage_fc, f_ent->group->instance, &policer_mem);
  23988     BCM_IF_ERROR_RETURN(rv);
  23989 
  23990     /* Read policer configuration.*/
  23991     BCM_IF_ERROR_RETURN
  23992         (_bcm_field_policer_get(unit, f_ent_pl->pid, &f_pl));
  23993 
  23994     /* Must be a valid meter index. */
  23995     if (f_pl->hw_index == _FP_INVALID_INDEX) {
  23996         return (BCM_E_INTERNAL);
  23997     }
  23998 
  23999     if (stage_fc->flags & _FP_STAGE_GLOBAL_METER_POOLS) {
  24000         mp = stage_fc->meter_pool[f_ent->group->instance][f_pl->pool_index];
  24001         /* Get slice policer installed in. */
  24002         idx =  (f_pl->pool_index * mp->pool_size) + (2 * f_pl->hw_index);
  24003 
  24004     } else {
  24005         fs = stage_fc->slices[f_ent->group->instance] + f_pl->pool_index;
  24006         idx = fs->start_tcam_idx +  (2 * f_pl->hw_index);
  24007     }
  24008 
  24009     if (idx < soc_mem_index_min(unit, policer_mem) ||
  24010         idx > soc_mem_index_max(unit, policer_mem)) {
  24011         return (BCM_E_INTERNAL);
  24012     }
  24013 
  24014     if (!_FP_POLICER_IS_FLOW_MODE(f_pl)) {
  24015         rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL,
  24016                 idx, soc_mem_entry_null(unit, policer_mem));
  24017         BCM_IF_ERROR_RETURN(rv);
  24018 
  24019         idx++;
  24020         rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL,
  24021                 idx, soc_mem_entry_null(unit, policer_mem));
  24022     } else {
  24023         if (_FP_POLICER_COMMITTED_HW_METER(f_pl)) {
  24024             idx ++;
  24025         }
  24026 
  24027         rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL,
  24028                 idx, soc_mem_entry_null(unit, policer_mem));
  24029     }
  24030 
  24031     return (BCM_E_NONE);
  24032 }
  24033 
  24034 /*
  24035  * Function:
  24036  *     _bcm_field_th_policer_meter_hw_free_old
  24037  *
  24038  * Purpose:
  24039  *     Clear the meter entries from the h/w associated with the policer
  24040  *     priori to calling bem_policer_set API
  24041  *
  24042  * Parameters:
  24043  *     unit      - (IN) BCM device number.
  24044  *     level     - (IN) Policer level.
  24045  *     f_ent     - (IN) Entry policer belongs to.
  24046  * Returns:
  24047  *     BCM_E_XXX
  24048  */
  24049 int
  24050 _bcm_field_th_policer_meter_hw_free_old(int unit, _field_entry_t *f_ent,
  24051                                  _field_entry_policer_t *f_ent_pl)
  24052 {
  24053     int                rv = BCM_E_NONE; /* Return value                  */
  24054     int                idx;             /* Meter hw index                */
  24055     soc_mem_t          policer_mem;     /* Meter table identifier.       */
  24056     _field_meter_pool_t *mp;            /* Meter pool pointer.           */
  24057     _field_slice_t *fs;                 /* Field slice pointer.          */
  24058     _field_stage_t    *stage_fc;        /* Stage field control structure */
  24059     _field_policer_t  *f_pl;            /* Policer descriptor            */
  24060     _field_stage_id_t stage_id;         /* Stage id used for metering.   */
  24061 
  24062     stage_id = (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id) ? \
  24063                    _BCM_FIELD_STAGE_INGRESS : f_ent->group->stage_id;
  24064 
  24065     /* Get field stage control structure. */
  24066     BCM_IF_ERROR_RETURN
  24067         (_field_stage_control_get(unit, stage_id,
  24068                                         &stage_fc));
  24069 
  24070     /* Resolve meter table name. */
  24071     rv = _bcm_field_th_policer_mem_get(unit, stage_fc, f_ent->group->instance, &policer_mem);
  24072     BCM_IF_ERROR_RETURN(rv);
  24073 
  24074     /* Read policer configuration.*/
  24075     BCM_IF_ERROR_RETURN
  24076         (_bcm_field_policer_get(unit, f_ent_pl->pid, &f_pl));
  24077 
  24078     /* Must be a valid meter index. */
  24079     if (f_pl->old_hw_index == _FP_INVALID_INDEX) {
  24080         return (BCM_E_INTERNAL);
  24081     }
  24082 
  24083     if (stage_fc->flags & _FP_STAGE_GLOBAL_METER_POOLS) {
  24084         mp = stage_fc->meter_pool[f_ent->group->instance][f_pl->old_pool_index];
  24085         /* Get slice policer installed in. */
  24086         idx =  (f_pl->old_pool_index * mp->pool_size) + (2 * f_pl->old_hw_index);
  24087 
  24088     } else {
  24089         fs = stage_fc->slices[f_ent->group->instance] + f_pl->old_pool_index;
  24090         idx = fs->start_tcam_idx +  (2 * f_pl->old_hw_index);
  24091     }
  24092 
  24093     if (idx < soc_mem_index_min(unit, policer_mem) ||
  24094         idx > soc_mem_index_max(unit, policer_mem)) {
  24095         return (BCM_E_INTERNAL);
  24096     }
  24097 
  24098     if (bcmPolicerModeCommitted != (f_pl)->old_mode) {
  24099         rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL,
  24100                 idx, soc_mem_entry_null(unit, policer_mem));
  24101         BCM_IF_ERROR_RETURN(rv);
  24102 
  24103         idx++;
  24104         rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL,
  24105                 idx, soc_mem_entry_null(unit, policer_mem));
  24106     } else {
  24107         if ((bcmPolicerModeCommitted == (f_pl)->old_mode) &&
  24108                   (!((f_pl)->old_hw_flags & _FP_POLICER_EXCESS_METER))) {
  24109             idx ++;
  24110         }
  24111         rv = soc_th_ifp_mem_write(unit, policer_mem, MEM_BLOCK_ALL,
  24112                 idx, soc_mem_entry_null(unit, policer_mem));
  24113     }
  24114 
  24115     return (BCM_E_NONE);
  24116 }
  24117          /* END OF POLICER ROUTINES */
  24118 
  24119 
  24120 /*
  24121  * Function:
  24122  *    _field_th_hw_clear
  24123  *
  24124  * Purpose:
  24125  *    Clear hardware memories for the requested stage.
  24126  *
  24127  * Parameters:
  24128  *    unit - (IN) BCM device number.
  24129  *    stage_fc - (IN) Field Processor stage control structure.
  24130  *
  24131  * Returns:
  24132  *    BCM_E_INTERNAL - Invalid CAP stage.
  24133  *    BCM_E_NONE - Success.
  24134  */
  24135 STATIC int
  24136 _field_th_hw_clear(int unit, _field_stage_t *stage_fc, _field_control_t *fc)
  24137 {
  24138     int pipe = 0;
  24139     soc_mem_t fp_tcam;
  24140 
  24141     /* Input parameters check. */
  24142     if (NULL == stage_fc) {
  24143         return (BCM_E_NONE);
  24144     }
  24145 
  24146     /*
  24147      * Note: DO NOT CLEAR HW tables when in warm boot mode.
  24148      * If HW tables are cleared, there is no configuration available in hardware
  24149      * to perform Level2 or Level1 WB recovery
  24150      */
  24151     if (SOC_WARM_BOOT(unit)) {
  24152         return (BCM_E_NONE);
  24153     }
  24154 
  24155     switch (stage_fc->stage_id) {
  24156         case _BCM_FIELD_STAGE_INGRESS:
  24157             if (soc_feature(unit, soc_feature_udf_support) && UDF_CTRL(unit)) {
  24158                 if (UDF_CTRL(unit)->udf_used_by_module == UDF_USED_BY_FIELD_MODULE) {
  24159                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit, FP_UDF_TCAMm, COPYNO_ALL,
  24160                                 TRUE));
  24161                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit, FP_UDF_OFFSETm, COPYNO_ALL,
  24162                                 TRUE));
  24163                 }
  24164             }
  24165 
  24166             if (RANGE_CTRL(unit)) {
  24167                 if (!RANGE_CTRL(unit)->range_used_by_module) {
  24168                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_RANGE_CHECKm,
  24169                                                           COPYNO_ALL, TRUE));
  24170                 }
  24171             } else {
  24172                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_RANGE_CHECKm,
  24173                                                       COPYNO_ALL, TRUE));
  24174             }
  24175 
  24176             if (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == TRUE) {
  24177 #if defined (BCM_TOMAHAWK3_SUPPORT)
  24178                if (SOC_IS_TOMAHAWK3(unit)) {
  24179                    BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_TCAMm,
  24180                                        COPYNO_ALL, TRUE));
  24181                } else
  24182 #endif
  24183                {
  24184                    BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_TCAM_WIDEm,
  24185                                        COPYNO_ALL, TRUE));
  24186                }
  24187 
  24188             } else {
  24189                for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24190                    if (!(fc->pipe_map & (1 << pipe))) {
  24191                         continue;
  24192                    }
  24193 #if defined (BCM_TOMAHAWK3_SUPPORT)
  24194                    if (soc_feature(unit, soc_feature_th3_style_fp)) {
  24195                        BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24196                                                            IFP_TCAMm,
  24197                                                            pipe,
  24198                                                            &fp_tcam));
  24199                    } else
  24200 #endif
  24201                    {
  24202                        BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24203                                                            IFP_TCAM_WIDEm,
  24204                                                            pipe,
  24205                                                            &fp_tcam));
  24206                    }
  24207                    BCM_IF_ERROR_RETURN(soc_mem_clear(unit, fp_tcam,
  24208                                        COPYNO_ALL, TRUE));
  24209                }
  24210             }
  24211             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_POLICY_TABLEm,
  24212                 COPYNO_ALL, TRUE));
  24213             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IFP_LOGICAL_TABLE_SELECTm,
  24214                 COPYNO_ALL, TRUE));
  24215             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24216                 IFP_KEY_GEN_PROGRAM_PROFILEm, COPYNO_ALL, TRUE));
  24217             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24218                 IFP_KEY_GEN_PROGRAM_PROFILE2m, COPYNO_ALL, TRUE));
  24219             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24220                 IFP_LOGICAL_TABLE_ACTION_PRIORITYm, COPYNO_ALL, TRUE));
  24221             break;
  24222         case _BCM_FIELD_STAGE_LOOKUP:
  24223             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, VFP_TCAMm, COPYNO_ALL,
  24224                 TRUE));
  24225             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, VFP_POLICY_TABLEm,
  24226                 COPYNO_ALL, TRUE));
  24227             /*
  24228              * Group destroy done as part of Field Deinit "bcm_esw_field_detach"
  24229              * clears following registers:
  24230              *     VFP_KEY_CONTROL_1
  24231              *     VFP_KEY_CONTROL_2
  24232              *     VFP_SLICE_MAP
  24233              */
  24234             break;
  24235         case _BCM_FIELD_STAGE_EGRESS:
  24236              for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24237                    if (!(fc->pipe_map & (1 << pipe))) {
  24238                         continue;
  24239                    }
  24240                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, EFP_COUNTER_TABLEm,
  24241                                                                pipe,
  24242                                                                &fp_tcam));
  24243                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, fp_tcam,
  24244                     COPYNO_ALL, TRUE));
  24245             }
  24246             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, EFP_TCAMm, COPYNO_ALL,
  24247                 TRUE));
  24248             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, EFP_POLICY_TABLEm,
  24249                 COPYNO_ALL, TRUE));
  24250             if (soc_feature(unit, soc_feature_field_egress_metering)) {
  24251                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, EFP_METER_TABLEm,
  24252                     COPYNO_ALL, TRUE));
  24253             }
  24254 
  24255             break;
  24256         case _BCM_FIELD_STAGE_CLASS:
  24257             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, TCP_FNm, COPYNO_ALL,
  24258                         TRUE));
  24259             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, TOS_FNm, COPYNO_ALL,
  24260                         TRUE));
  24261             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, TTL_FNm, COPYNO_ALL,
  24262                         TRUE));
  24263             if (!SOC_IS_TOMAHAWK3(unit)) {
  24264                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, SRC_COMPRESSIONm, COPYNO_ALL,
  24265                             TRUE));
  24266                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, DST_COMPRESSIONm, COPYNO_ALL,
  24267                             TRUE));
  24268             }
  24269             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, IP_PROTO_MAPm, COPYNO_ALL,
  24270                         TRUE));
  24271             break;
  24272         case _BCM_FIELD_STAGE_EXACTMATCH:
  24273             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24274                         EXACT_MATCH_LOGICAL_TABLE_SELECTm, COPYNO_ALL, TRUE));
  24275             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24276                         EXACT_MATCH_KEY_GEN_MASKm, COPYNO_ALL, TRUE));
  24277             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24278                         EXACT_MATCH_DEFAULT_POLICYm, COPYNO_ALL, TRUE));
  24279             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24280                         EXACT_MATCH_KEY_GEN_PROGRAM_PROFILEm, COPYNO_ALL, TRUE));
  24281             if(!SAL_BOOT_PLISIM) {
  24282                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24283                                     EXACT_MATCH_2m, COPYNO_ALL, TRUE));
  24284             }
  24285             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24286                         EXACT_MATCH_ACTION_PROFILEm, COPYNO_ALL, TRUE));
  24287             BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24288                         EXACT_MATCH_QOS_ACTIONS_PROFILEm, COPYNO_ALL, TRUE));
  24289             break;
  24290 #if defined(BCM_FLOWTRACKER_SUPPORT)
  24291         case _BCM_FIELD_STAGE_FLOWTRACKER:
  24292             if (!soc_feature(unit, soc_feature_field_flowtracker_support)) {
  24293                 break;
  24294             }
  24295             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_LOGICAL_TBL_SEL_TCAMm,
  24296                         COPYNO_ALL, TRUE));
  24297             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_LOGICAL_TBL_SEL_SRAMm,
  24298                         COPYNO_ALL, TRUE));
  24299             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MUX_CTRL_0m,
  24300                         COPYNO_ALL, TRUE));
  24301             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MASK_0m,
  24302                         COPYNO_ALL, TRUE));
  24303             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MUX_CTRL_1m,
  24304                         COPYNO_ALL, TRUE));
  24305             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MASK_1m,
  24306                         COPYNO_ALL, TRUE));
  24307             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_LTS_MUX_CTRL_2_PLUS_MASKm,
  24308                         COPYNO_ALL, TRUE));
  24309             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_TCAMm,
  24310                         COPYNO_ALL, TRUE));
  24311             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_FTFP_POLICYm,
  24312                         COPYNO_ALL, TRUE));
  24313             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MUX_CTRL_0m,
  24314                         COPYNO_ALL, TRUE));
  24315             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MASK_0m,
  24316                         COPYNO_ALL, TRUE));
  24317             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MUX_CTRL_1m,
  24318                         COPYNO_ALL, TRUE));
  24319             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MASK_1m,
  24320                         COPYNO_ALL, TRUE));
  24321             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_KEY_LTS_MUX_CTRL_2_PLUS_MASKm,
  24322                         COPYNO_ALL, TRUE));
  24323             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_DATA_LTS_MUX_CTRL_0m,
  24324                         COPYNO_ALL, TRUE));
  24325             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_DATA_LTS_MASK_0m,
  24326                         COPYNO_ALL, TRUE));
  24327             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_SESSION_DATA_LTS_MUX_CTRL_1_PLUS_MASKm,
  24328                         COPYNO_ALL, TRUE));
  24329             BCM_IF_ERROR_RETURN(soc_mem_clear(unit, BSK_ALU_DATA_LTS_MUX_CTRL_PLUS_MASKm,
  24330                         COPYNO_ALL, TRUE));
  24331             break;
  24332 #endif
  24333         default:
  24334             /* Should never hit this default condition. */
  24335             return (BCM_E_INTERNAL);
  24336 
  24337     } /* end switch */
  24338 
  24339     return (BCM_E_NONE);
  24340 }
  24341 
  24342 /*
  24343  * Function:
  24344  *    _field_th_pipes_hw_clear
  24345  *
  24346  * Purpose:
  24347  *    Clear hardware memories for a requested stage on all pipes.
  24348  *
  24349  * Parameters:
  24350  *    unit - (IN) BCM device number
  24351  *    stage_fc - (IN) Field Processor stage control structure.
  24352  *
  24353  * Returns:
  24354  *    BCM_E_INTERNAL - Invalid CAP stage.
  24355  *    BCM_E_NONE - Success.
  24356  */
  24357 STATIC int
  24358 _field_th_pipes_hw_clear(int unit, _field_stage_t *stage_fc,
  24359                          _field_control_t *fc)
  24360 {
  24361     int pipe; /* Pipe iterator. */
  24362     soc_mem_t vfp_tcam; /* VFP TCAM memory names. */
  24363     soc_mem_t vfp_policy; /* VFP POLICY table memory names. */
  24364     soc_mem_t rcheck; /* IFP range checker memory names. */
  24365     soc_mem_t fp_tcam;/* IFP TCAM memory names. */
  24366     soc_mem_t fp_policy;  /* IFP POLICY memory names. */
  24367     soc_mem_t lt_tcam; /* LT selection TCAM memory names. */
  24368     soc_mem_t kgen_prof1; /* Keygen program memory names. */
  24369     soc_mem_t kgen_prof2; /* Keygen program memory names. */
  24370     soc_mem_t action_pri; /* LT priority memory names. */
  24371     soc_mem_t efp_tcam; /* EFP TCAM memory names. */
  24372     soc_mem_t efp_policy;  /* EFP policy memory names. */
  24373     soc_mem_t efp_meter; /* EFP meter memory names. */
  24374     soc_mem_t efp_cntr; /* EFP counter memory names. */
  24375     soc_mem_t ttl_fn ; /* Class TTL memory names. */
  24376     soc_mem_t tos_fn; /* Class TOS memory names. */
  24377     soc_mem_t tcp_fn; /* Class TCP memory names. */
  24378     soc_mem_t src_compress; /* Class Src Compression memory names. */
  24379     soc_mem_t dst_compress; /* Class Dst Compression memory names. */
  24380     soc_mem_t ip_proto_map; /* IP Protocol Map Memory names. */
  24381     soc_mem_t lt_em_tcam;
  24382     soc_mem_t lt_em_kgen_mask;
  24383     soc_mem_t lt_em_def_policy;
  24384     soc_mem_t kgen_em_prof;
  24385     soc_mem_t em_act_prof;
  24386     soc_mem_t em_qos_act_prof;
  24387     soc_mem_t em_uft_wide;
  24388     soc_mem_t em_uft_narrow;
  24389 
  24390     /* Input parameters check. */
  24391     if (NULL == stage_fc) {
  24392         return (BCM_E_NONE);
  24393     }
  24394 
  24395     /*
  24396      * Note: DO NOT CLEAR HW tables when in warm boot mode.
  24397      * If HW tables are cleared, there is no configuration available in hardware
  24398      * to perform Level2 or Level1 WB recovery
  24399      */
  24400     if (SOC_WARM_BOOT(unit)) {
  24401         return (BCM_E_NONE);
  24402     }
  24403 
  24404     switch (stage_fc->stage_id) {
  24405         case _BCM_FIELD_STAGE_INGRESS:
  24406             if (RANGE_CTRL(unit)) {
  24407                 if (!RANGE_CTRL(unit)->range_used_by_module) {
  24408                     for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24409                         if (!(fc->pipe_map & (1 << pipe))) {
  24410                              continue;
  24411                         }
  24412                         BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24413                                                             IFP_RANGE_CHECKm,
  24414                                                             pipe,
  24415                                                             &rcheck));
  24416                         BCM_IF_ERROR_RETURN(soc_mem_clear(unit, rcheck,
  24417                                                           COPYNO_ALL, TRUE));
  24418                     }
  24419                 }
  24420             } else {
  24421                 for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24422                     if (!(fc->pipe_map & (1 << pipe))) {
  24423                          continue;
  24424                     }
  24425                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24426                                                         IFP_RANGE_CHECKm,
  24427                                                         pipe,
  24428                                                         &rcheck));
  24429                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit, rcheck,
  24430                                                        COPYNO_ALL, TRUE));
  24431                 }
  24432             }
  24433 
  24434             for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24435                 if (!(fc->pipe_map & (1 << pipe))) {
  24436                      continue;
  24437                 }
  24438 #if defined (BCM_TOMAHAWK3_SUPPORT)
  24439                 if (soc_feature(unit, soc_feature_th3_style_fp)) {
  24440                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24441                                                            IFP_TCAMm,
  24442                                                            pipe,
  24443                                                            &fp_tcam));
  24444                 } else
  24445 #endif
  24446                 {
  24447                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24448                                                            IFP_TCAM_WIDEm,
  24449                                                            pipe,
  24450                                                            &fp_tcam));
  24451                 }
  24452                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, fp_tcam,
  24453                     COPYNO_ALL, TRUE));
  24454                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24455                                                        IFP_POLICY_TABLEm,
  24456                                                        pipe,
  24457                                                        &fp_policy));
  24458                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, fp_policy,
  24459                     COPYNO_ALL, TRUE));
  24460                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24461                                                      IFP_LOGICAL_TABLE_SELECTm,
  24462                                                      pipe,
  24463                                                      &lt_tcam));
  24464                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, lt_tcam,
  24465                     COPYNO_ALL, TRUE));
  24466                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24467                                                    IFP_KEY_GEN_PROGRAM_PROFILEm,
  24468                                                    pipe,
  24469                                                    &kgen_prof1));
  24470                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, kgen_prof1,
  24471                     COPYNO_ALL, TRUE));
  24472                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24473                                                   IFP_KEY_GEN_PROGRAM_PROFILE2m,
  24474                                                   pipe,
  24475                                                   &kgen_prof2));
  24476                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, kgen_prof2,
  24477                     COPYNO_ALL, TRUE));
  24478                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24479                                              IFP_LOGICAL_TABLE_ACTION_PRIORITYm,
  24480                                              pipe,
  24481                                              &action_pri));
  24482                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, action_pri,
  24483                     COPYNO_ALL, TRUE));
  24484             }
  24485             /*
  24486              * Currently Field module doesn't support per-pipe mode for UDF.
  24487              * Hence, accessing the memory globally.
  24488              */
  24489             if (soc_feature(unit, soc_feature_udf_support) && UDF_CTRL(unit)) {
  24490                 if (UDF_CTRL(unit)->udf_used_by_module
  24491                     == UDF_USED_BY_FIELD_MODULE) {
  24492                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24493                                 FP_UDF_TCAMm, COPYNO_ALL,
  24494                                 TRUE));
  24495                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24496                                 FP_UDF_OFFSETm, COPYNO_ALL,
  24497                                 TRUE));
  24498                 }
  24499             }
  24500             break;
  24501         case _BCM_FIELD_STAGE_LOOKUP:
  24502             for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24503                 if (!(fc->pipe_map & (1 << pipe))) {
  24504                      continue;
  24505                 }
  24506                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24507                                                        VFP_TCAMm,
  24508                                                        pipe, &vfp_tcam));
  24509                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24510                                                        VFP_POLICY_TABLEm,
  24511                                                        pipe,
  24512                                                        &vfp_policy));
  24513                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, vfp_tcam,
  24514                     COPYNO_ALL, TRUE));
  24515                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, vfp_policy,
  24516                     COPYNO_ALL, TRUE));
  24517             }
  24518             break;
  24519         case _BCM_FIELD_STAGE_EGRESS:
  24520             for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24521                 if (!(fc->pipe_map & (1 << pipe))) {
  24522                      continue;
  24523                 }
  24524                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24525                                                        EFP_TCAMm,
  24526                                                        pipe, &efp_tcam));
  24527                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24528                                                        EFP_POLICY_TABLEm,
  24529                                                        pipe,
  24530                                                        &efp_policy));
  24531                 if (soc_feature(unit, soc_feature_field_egress_metering)) {
  24532 
  24533                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24534                                                            EFP_METER_TABLEm,
  24535                                                            pipe, &efp_meter));
  24536                 }
  24537                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24538                                                        EFP_COUNTER_TABLEm,
  24539                                                        pipe,
  24540                                                        &efp_cntr));
  24541                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, efp_tcam,
  24542                     COPYNO_ALL, TRUE));
  24543                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, efp_policy,
  24544                     COPYNO_ALL, TRUE));
  24545                 if (soc_feature(unit, soc_feature_field_egress_metering)) {
  24546                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit, efp_meter,
  24547                         COPYNO_ALL, TRUE));
  24548                 }
  24549                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, efp_cntr,
  24550                     COPYNO_ALL, TRUE));
  24551             }
  24552             break;
  24553         case _BCM_FIELD_STAGE_CLASS:
  24554             for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24555                 if (!(fc->pipe_map & (1 << pipe))) {
  24556                      continue;
  24557                 }
  24558                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24559                                                        TTL_FNm,
  24560                                                        pipe,
  24561                                                        &ttl_fn));
  24562                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, ttl_fn,
  24563                             COPYNO_ALL, TRUE));
  24564                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24565                                                        TOS_FNm,
  24566                                                        pipe,
  24567                                                        &tos_fn));
  24568                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, tos_fn,
  24569                             COPYNO_ALL, TRUE));
  24570                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24571                                                        TCP_FNm,
  24572                                                        pipe,
  24573                                                        &tcp_fn));
  24574                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, tcp_fn,
  24575                             COPYNO_ALL, TRUE));
  24576                 if (!(SOC_IS_TOMAHAWK3(unit))) {
  24577                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24578                                                            SRC_COMPRESSIONm,
  24579                                                            pipe,
  24580                                                            &src_compress));
  24581                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit, src_compress,
  24582                                 COPYNO_ALL, TRUE));
  24583                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24584                                                            DST_COMPRESSIONm,
  24585                                                            pipe,
  24586                                                            &dst_compress));
  24587                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit, dst_compress,
  24588                                 COPYNO_ALL, TRUE));
  24589                 }
  24590                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24591                                                        IP_PROTO_MAPm,
  24592                                                        pipe,
  24593                                                        &ip_proto_map));
  24594                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit, ip_proto_map,
  24595                             COPYNO_ALL, TRUE));
  24596             }
  24597             break;
  24598         case _BCM_FIELD_STAGE_EXACTMATCH:
  24599             for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24600                 if (!(fc->pipe_map & (1 << pipe))) {
  24601                      continue;
  24602                 }
  24603                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24604                                            EXACT_MATCH_LOGICAL_TABLE_SELECTm,
  24605                                            pipe,
  24606                                            &lt_em_tcam));
  24607                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24608                             lt_em_tcam, COPYNO_ALL, TRUE));
  24609                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24610                                            EXACT_MATCH_KEY_GEN_MASKm,
  24611                                            pipe,
  24612                                            &lt_em_kgen_mask));
  24613                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24614                             lt_em_kgen_mask, COPYNO_ALL, TRUE));
  24615                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24616                                            EXACT_MATCH_DEFAULT_POLICYm,
  24617                                            pipe,
  24618                                            &lt_em_def_policy));
  24619                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24620                             lt_em_def_policy, COPYNO_ALL, TRUE));
  24621                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24622                                            EXACT_MATCH_KEY_GEN_PROGRAM_PROFILEm,
  24623                                            pipe,
  24624                                            &kgen_em_prof));
  24625                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24626                             kgen_em_prof, COPYNO_ALL, TRUE));
  24627 #if defined (BCM_TOMAHAWK3_SUPPORT)
  24628                 if (soc_feature(unit, soc_feature_th3_style_fp)) {
  24629                     
  24630                 } else
  24631 #endif
  24632                 {
  24633                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24634                                         EXACT_MATCH_2m,
  24635                                         pipe,
  24636                                         &em_uft_narrow));
  24637                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24638                                         em_uft_narrow, COPYNO_ALL, TRUE));
  24639                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24640                                         EXACT_MATCH_4m,
  24641                                         pipe,
  24642                                         &em_uft_wide));
  24643                     BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24644                                         em_uft_wide, COPYNO_ALL, TRUE));
  24645                 }
  24646                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24647                                     EXACT_MATCH_ACTION_PROFILEm,
  24648                                     pipe,
  24649                                     &em_act_prof));
  24650                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24651                                     em_act_prof, COPYNO_ALL, TRUE));
  24652                 BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  24653                                     EXACT_MATCH_QOS_ACTIONS_PROFILEm,
  24654                                     pipe,
  24655                                     &em_qos_act_prof));
  24656                 BCM_IF_ERROR_RETURN(soc_mem_clear(unit,
  24657                             em_qos_act_prof, COPYNO_ALL, TRUE));
  24658             }
  24659             break;
  24660         default:
  24661             /* Should never hit this default condition. */
  24662             return (BCM_E_INTERNAL);
  24663 
  24664     } /* end switch */
  24665 
  24666     return (BCM_E_NONE);
  24667 }
  24668 
  24669 /*
  24670  * Function:
  24671  *    _field_th_pipes_meter_refresh_enable
  24672  *
  24673  * Purpose:
  24674  *    Enable meters refresh cycle on all pipes.
  24675  *
  24676  * Parameters:
  24677  *    unit - (IN) BCM device number.
  24678  *    fc - (IN) Field control structure.
  24679  *    state  - (IN) On/Off boolean.
  24680  *
  24681  * Returns:
  24682  *    BCM_E_PARAM - Null field control structure or invalid value for "state".
  24683  *    BCM_E_INTERNAL - Null field stage control structure.
  24684  *    BCM_E_NONE - Success.
  24685  */
  24686 STATIC int
  24687 _field_th_pipes_meter_refresh_enable(int unit,
  24688                                      _field_control_t *fc,
  24689                                      uint32 state)
  24690 {
  24691     int pipe; /* Pipe iterator. */
  24692     _field_stage_t *stage_fc; /* Pointer to Stage control structure. */
  24693     soc_reg_t reg; /* FP IP auxilary arbiter control register. */
  24694 
  24695       /* Input parameters check. */
  24696     if (NULL == fc || ((TRUE != state) && (FALSE != state))) {
  24697         return (BCM_E_PARAM);
  24698     }
  24699 
  24700 
  24701     /* Get the stage control handle. */
  24702     stage_fc = fc->stages;
  24703 
  24704     /* Ensure stage data structure is initialized. */
  24705     if (NULL == stage_fc) {
  24706         return (BCM_E_INTERNAL);
  24707     }
  24708 
  24709     /* Enable FP meter refresh in each pipe */
  24710     for (pipe = 0; pipe < stage_fc->num_pipes; pipe++) {
  24711         if (!(fc->pipe_map & (1 << pipe))) {
  24712               continue;
  24713          }
  24714          BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24715                                                             AUX_ARB_CONTROLr,
  24716                                                             pipe, &reg));
  24717          BCM_IF_ERROR_RETURN(soc_reg_field32_modify(unit, reg,
  24718             REG_PORT_ANY, FP_REFRESH_ENABLEf, state));
  24719     }
  24720     return (BCM_E_NONE);
  24721 }
  24722 
  24723 /*
  24724  * Function:
  24725  *    _field_th_detach
  24726  *
  24727  * Purpose:
  24728  *    Clears field module hardware tables based on Group operational mode.
  24729  *    Also disables FP meter refresh and FP lookup control on ports.
  24730  *
  24731  * Parameters:
  24732  *    unit - (IN) BCM device number
  24733  *    fc - (IN) Field control structure.
  24734  *
  24735  * Returns:
  24736  *    BCM_E_PARAM - Null field control structure.
  24737  *    BCM_E_INTERNAL - Invalid CAP stage ID.
  24738  *    BCM_E_NONE - Success.
  24739  */
  24740 STATIC int
  24741 _field_th_detach(int unit, _field_control_t *fc)
  24742 {
  24743     _field_stage_t *stage_fc; /* Stage control structure pointer. */
  24744 
  24745     /* Input parameters check. */
  24746     if (NULL == fc) {
  24747         return (BCM_E_PARAM);
  24748     }
  24749 
  24750     /* Get the stage control handle. */
  24751     stage_fc = fc->stages;
  24752 
  24753     /*
  24754      * Initialize FP hardware tables based on the device Group Oper mode
  24755      * settings.
  24756      */
  24757     switch (stage_fc->oper_mode) {
  24758         case bcmFieldGroupOperModeGlobal:
  24759             /* Legacy global mode, use DUPLICATE view to clear FP HW tables. */
  24760             while (stage_fc) {
  24761 
  24762                 /*
  24763                  * Note : DO NOT CLEAR Exact Match HW tables if ExactMatch SKIP detach flag is set.
  24764                  * Retaining ExactMatch groups during bcm_field_init for retaining ExactMatch stage.
  24765                  */
  24766                 if ((fc->flags & _FP_EXACTMATCH_STAGE_SKIP_DETACH) &&
  24767                     (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)) {
  24768                     /* Goto next stage */
  24769                     stage_fc = stage_fc->next;
  24770                     continue;
  24771                 }
  24772                 /* Clear hardware table */
  24773                 BCM_IF_ERROR_RETURN(_field_th_hw_clear(unit, stage_fc, fc));
  24774 
  24775                 /* Goto next stage */
  24776                 stage_fc = stage_fc->next;
  24777             }
  24778 
  24779             /* Disable FP meter refresh on all pipes. */
  24780             if (!(soc_feature(unit, soc_feature_th3_style_fp))) {
  24781                 BCM_IF_ERROR_RETURN(_field_meter_refresh_enable_set(unit, fc,
  24782                                                                     FALSE));
  24783             }
  24784             break;
  24785 
  24786         case bcmFieldGroupOperModePipeLocal:
  24787             while (stage_fc) {
  24788                 /*
  24789                  * Note : DO NOT CLEAR Exact Match HW tables if ExactMatch SKIP detach flag is set.
  24790                  * Retaining ExactMatch groups during bcm_field_init for retaining ExactMatch stage.
  24791                  */
  24792                 if ((fc->flags & _FP_EXACTMATCH_STAGE_SKIP_DETACH) &&
  24793                     (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id)) {
  24794                     /* Goto next stage */
  24795                     stage_fc = stage_fc->next;
  24796                     continue;
  24797                 }
  24798                 /* Clear hardware table */
  24799                 BCM_IF_ERROR_RETURN(_field_th_pipes_hw_clear(unit, stage_fc, fc));
  24800 
  24801                 /* Goto next stage */
  24802                 stage_fc = stage_fc->next;
  24803             }
  24804 
  24805             /* Enable FP meter refresh on all pipes. */
  24806             if (!(soc_feature(unit, soc_feature_th3_style_fp))) {
  24807                 BCM_IF_ERROR_RETURN(_field_th_pipes_meter_refresh_enable(unit, fc,
  24808                                                                          FALSE));
  24809             }
  24810             break;
  24811         default:
  24812             break;
  24813     }
  24814 
  24815     /* Don't disable port controls during Warmboot or Reloading state */
  24816     if (0 == SOC_HW_ACCESS_DISABLE(unit)) {
  24817         /* Disable filter processor */
  24818         BCM_IF_ERROR_RETURN(_field_port_filter_enable_set(unit, fc, FALSE));
  24819     }
  24820 
  24821     /* Murthy: Check and disable any counter ejection support here. */
  24822 
  24823     return (BCM_E_NONE);
  24824 }
  24825 /*
  24826  * Function:
  24827  *     _field_th_egress_slice_clear
  24828  *
  24829  * Purpose:
  24830  *     Reset slice configuraton on group deletion event.
  24831  *
  24832  * Parameters:
  24833  *     unit       - (IN) BCM device number.
  24834  *     fg         - (IN) Reference to Field Group Structure.
  24835  *     slice_numb - (IN) Slice number to set mode for.
  24836  *
  24837  * Returns:
  24838  *     BCM_E_XXX
  24839  */
  24840 STATIC int
  24841 _field_th_egress_slice_clear(int unit, _field_group_t *fg, uint8 slice_numb)
  24842 {
  24843     int rv;  /* Operation return status. */
  24844     int inst; /* Pipe Instance. */
  24845     uint32 mode_val[2] =  {0, 0}; /* Mode values for slice control. */
  24846     uint32 class_mode_val[7] = {0, 0, 0, 0, 0, 0, 0}; /* Mode values for
  24847                                                        * class select register
  24848                                                        */
  24849     _field_stage_t     *stage_fc; /* Ref. to Stage control structure. */
  24850     soc_reg_t efp_classid_sel_r;
  24851     soc_reg_t efp_key4_dvp_reg;
  24852     soc_reg_t efp_key4_mdl_reg;
  24853     soc_reg_t efp_slice_control_reg;
  24854     soc_reg_t efp_key8_dvp_reg;
  24855     soc_reg_t efp_dst_port_reg;
  24856     soc_reg_t efp_key4_class_reg;
  24857     soc_reg_t efp_key8_class_reg;
  24858 
  24859 #if defined (BCM_TRIDENT3_SUPPORT)
  24860     soc_reg_t efp_classid_b_sel_reg;
  24861     int idx = 0;
  24862     static const soc_field_t efp_dest_port_selector_flds[][2] = {
  24863              {SLICE_0_F1_DEST_SELf, SLICE_0_F5_DEST_SELf},
  24864              {SLICE_1_F1_DEST_SELf, SLICE_1_F5_DEST_SELf},
  24865              {SLICE_2_F1_DEST_SELf, SLICE_2_F5_DEST_SELf},
  24866              {SLICE_3_F1_DEST_SELf, SLICE_3_F5_DEST_SELf},
  24867         };
  24868 #endif
  24869 
  24870     /* Input parameters check. */
  24871     if (slice_numb >= COUNTOF(_th_efp_slice_mode)) {
  24872         return (BCM_E_PARAM);
  24873     }
  24874 
  24875     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit,
  24876                         fg->stage_id, &stage_fc));
  24877 
  24878     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  24879        inst = _FP_GLOBAL_INST;
  24880     } else {
  24881        inst = fg->instance;
  24882     }
  24883 
  24884     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24885                                                    EFP_KEY4_DVP_SELECTORr,
  24886                                                    inst, &efp_key4_dvp_reg));
  24887     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24888                                                    EFP_KEY8_DVP_SELECTORr,
  24889                                                    inst, &efp_key8_dvp_reg));
  24890     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24891                                                    EFP_KEY4_MDL_SELECTORr,
  24892                                                    inst, &efp_key4_mdl_reg));
  24893 
  24894     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr,
  24895                                                    inst,
  24896                                                    &efp_slice_control_reg));
  24897 
  24898     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24899                                                        EFP_DEST_PORT_SELECTORr,
  24900                                                        inst,
  24901                                                        &efp_dst_port_reg));
  24902 
  24903     if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  24904         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24905                                                         EFP_KEY4_L3_CLASSID_SELECTORr,
  24906                                                         inst,
  24907                                                         &efp_key4_class_reg));
  24908         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24909                                                         EFP_KEY8_L3_CLASSID_SELECTORr,
  24910                                                         inst,
  24911                                                         &efp_key8_class_reg));
  24912     }
  24913 
  24914 #if defined (BCM_TRIDENT3_SUPPORT)
  24915     if (soc_feature(unit, soc_feature_td3_style_fp)) {
  24916         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24917                                                    EFP_CLASSID_SELECTOR_Ar,
  24918                                                    inst, &efp_classid_sel_r));
  24919     } else
  24920 #endif
  24921     {
  24922         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24923                                                   EFP_CLASSID_SELECTORr,
  24924                                                   inst, &efp_classid_sel_r));
  24925      }
  24926     rv = soc_reg_fields32_modify(unit, efp_slice_control_reg, REG_PORT_ANY,
  24927                                   2, _th_efp_slice_mode[slice_numb], mode_val);
  24928     BCM_IF_ERROR_RETURN(rv);
  24929 
  24930     rv = soc_reg_fields32_modify(unit, efp_classid_sel_r, REG_PORT_ANY,
  24931                                  7, classfldtbl[slice_numb], class_mode_val);
  24932     BCM_IF_ERROR_RETURN(rv);
  24933 
  24934 #if defined (BCM_TRIDENT3_SUPPORT)
  24935     if (soc_feature(unit, soc_feature_td3_style_fp)) {
  24936         uint32 const0 = 0;
  24937         uint32 reg_val;
  24938 
  24939         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  24940                     EFP_CLASSID_B_SELECTOR_KEY_TYPEr,
  24941                     inst, &efp_classid_b_sel_reg));
  24942 
  24943         /* Reset class id b values to 0 */
  24944         for (idx =0; idx<=7; idx++) {
  24945             BCM_IF_ERROR_RETURN(soc_reg32_get(unit,
  24946                                       efp_classid_b_sel_reg,
  24947                                       REG_PORT_ANY,
  24948                                       idx,
  24949                                       &reg_val
  24950                                       )
  24951                         );
  24952             soc_reg_field_set(unit,
  24953                           efp_classid_b_sel_reg,
  24954                           &reg_val,
  24955                           classIdBfldtbl[slice_numb],
  24956                           const0
  24957                           );
  24958             BCM_IF_ERROR_RETURN(soc_reg32_set(unit,
  24959                                       efp_classid_b_sel_reg,
  24960                                       REG_PORT_ANY,
  24961                                       idx,
  24962                                       reg_val
  24963                                       )
  24964                         );
  24965          }
  24966     }
  24967 #endif
  24968     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  24969         rv = soc_reg_field32_modify(unit, efp_key4_dvp_reg, REG_PORT_ANY,
  24970                                                        dvpfldtbl[slice_numb], 0);
  24971         BCM_IF_ERROR_RETURN(rv);
  24972     }
  24973 
  24974     if (0 == soc_feature(unit, soc_feature_td3_style_fp)) {
  24975         rv = soc_reg_field32_modify(unit, efp_key4_mdl_reg, REG_PORT_ANY,
  24976                                                        mdlfldtbl[slice_numb], 0);
  24977         BCM_IF_ERROR_RETURN(rv);
  24978     }
  24979 
  24980     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  24981         rv = soc_reg_field32_modify(unit, efp_key8_dvp_reg, REG_PORT_ANY,
  24982                                                        mdlfldtbl[slice_numb], 0);
  24983         BCM_IF_ERROR_RETURN(rv);
  24984     }
  24985 
  24986 #if defined (BCM_TOMAHAWK3_SUPPORT)
  24987     if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  24988         rv = soc_reg_field32_modify(unit, efp_key4_class_reg, REG_PORT_ANY,
  24989                                                 classIdBfldtbl[slice_numb], 0);
  24990         BCM_IF_ERROR_RETURN(rv);
  24991         rv = soc_reg_field32_modify(unit, efp_key8_class_reg, REG_PORT_ANY,
  24992                                                 classIdBfldtbl[slice_numb], 0);
  24993         BCM_IF_ERROR_RETURN(rv);
  24994     }
  24995 #endif
  24996 
  24997 #if defined (BCM_TRIDENT3_SUPPORT)
  24998     /* SELECTOR CODES for EFP_DEST_PORT_SELECTORr */
  24999     if (SOC_REG_IS_VALID(unit, EFP_DEST_PORT_SELECTORr)) {
  25000             rv = soc_reg_field32_modify(unit,
  25001                         efp_dst_port_reg,
  25002                         REG_PORT_ANY,
  25003                         efp_dest_port_selector_flds[slice_numb][0],
  25004                         0
  25005                         );
  25006             BCM_IF_ERROR_RETURN(rv);
  25007 
  25008             rv = soc_reg_field32_modify(unit,
  25009                         efp_dst_port_reg,
  25010                         REG_PORT_ANY,
  25011                         efp_dest_port_selector_flds[slice_numb][1],
  25012                         0
  25013                         );
  25014             BCM_IF_ERROR_RETURN(rv);
  25015     }
  25016 #endif
  25017 
  25018     return (rv);
  25019 }
  25020 
  25021 /*
  25022  * Function:
  25023  *     _field_th_slice_clear
  25024  *
  25025  * Purpose:
  25026  *     Clear slice configuration on group removal
  25027  *
  25028  * Parameters:
  25029  *     unit  - BCM device number
  25030  *     fg    - Field group slice belongs to
  25031  *     fs    - Field slice structure.
  25032  *
  25033  * Returns:
  25034  *     BCM_E_XXX
  25035  */
  25036 STATIC int
  25037 _field_th_slice_clear(int unit, _field_group_t *fg, _field_slice_t *fs)
  25038 {
  25039     int rv;
  25040 
  25041     switch (fs->stage_id) {
  25042       case _BCM_FIELD_STAGE_INGRESS:
  25043           rv = _bcm_field_th_ingress_slice_clear(unit, fg, fs);
  25044           break;
  25045       case _BCM_FIELD_STAGE_LOOKUP:
  25046           rv = _field_th_lookup_slice_clear(unit, fg, fs);
  25047           break;
  25048       case _BCM_FIELD_STAGE_EGRESS:
  25049           rv = _field_th_egress_slice_clear(unit, fg, fs->slice_number);
  25050           break;
  25051       default:
  25052           rv = BCM_E_INTERNAL;
  25053     }
  25054     return (rv);
  25055 }
  25056 
  25057 /*
  25058  * Function:
  25059  *     _bcm_field_th_slice_clear
  25060  *
  25061  * Purpose:
  25062  *     Clear slice configuration on group removal
  25063  *
  25064  * Parameters:
  25065  *     unit  - BCM device number
  25066  *     fg    - Field group slice belongs to
  25067  *     fs    - Field slice structure.
  25068  *
  25069  * Returns:
  25070  *     BCM_E_XXX
  25071  */
  25072 int
  25073 _bcm_field_th_slice_clear(int unit, _field_group_t *fg, _field_slice_t *fs)
  25074 {
  25075     return _field_th_slice_clear(unit, fg, fs);
  25076 }
  25077 
  25078 /*
  25079  * Function:
  25080  *    _bcm_field_th_functions_init
  25081  *
  25082  * Purpose:
  25083  *    Set up functions pointers
  25084  *
  25085  * Parameters:
  25086  *    functions - (IN/OUT) Pointer to device specific field module utility
  25087  *                         routines.
  25088  *
  25089  * Returns:
  25090  *     Nothing
  25091  */
  25092 void
  25093 _bcm_field_th_functions_init(_field_funct_t *functions)
  25094 {
  25095     functions->fp_detach               = _field_th_detach;
  25096     functions->fp_group_install        = _bcm_field_th_group_install;
  25097     functions->fp_selcodes_install     = _bcm_field_th_selcodes_install;
  25098     functions->fp_slice_clear          = _bcm_field_th_slice_clear;
  25099     functions->fp_entry_remove         = _bcm_field_th_entry_remove;
  25100     functions->fp_entry_move           = _bcm_field_th_entry_move;
  25101     functions->fp_entry_enable         = _bcm_field_th_entry_enable_set;
  25102     functions->fp_selcode_get          = _bcm_field_th_selcode_get;
  25103     functions->fp_selcode_to_qset      = _bcm_field_selcode_to_qset;
  25104     functions->fp_qual_list_get        = _bcm_field_qual_lists_get;
  25105     functions->fp_tcam_policy_clear    = NULL;
  25106     functions->fp_tcam_policy_install  = _bcm_field_th_entry_install;
  25107     functions->fp_tcam_policy_reinstall = _bcm_field_th_entry_reinstall;
  25108     functions->fp_policer_install      = _bcm_field_th_policer_install;
  25109     functions->fp_write_slice_map      = _bcm_field_th_write_slice_map;
  25110     functions->fp_qualify_ip_type      = _bcm_field_td2_qualify_ip_type;
  25111     functions->fp_qualify_ip_type_get  = _bcm_field_td2_qualify_ip_type_get;
  25112     functions->fp_action_support_check = _bcm_field_th_action_support_check;
  25113     functions->fp_action_conflict_check = _bcm_field_th_action_conflict_check;
  25114     functions->fp_counter_get          = _bcm_field_td_counter_get;
  25115     functions->fp_counter_set          = _bcm_field_td_counter_set;
  25116     functions->fp_stat_value_get       = _bcm_th_field_stat_value_get;
  25117     functions->fp_stat_value_set       = _bcm_th_field_stat_value_set;
  25118     functions->fp_stat_index_get       = _bcm_field_th_stat_index_get;
  25119     functions->fp_action_params_check  = _bcm_field_th_action_params_check;
  25120     functions->fp_action_depends_check = NULL;
  25121     functions->fp_egress_key_match_type_set
  25122                                     = _bcm_field_th_egress_key_match_type_set;
  25123     functions->fp_external_entry_install  = NULL;
  25124     functions->fp_external_entry_reinstall  = NULL;
  25125     functions->fp_external_entry_remove   = NULL;
  25126     functions->fp_external_entry_prio_set = NULL;
  25127     functions->fp_data_qualifier_ethertype_add
  25128                           = _bcm_field_trx2_data_qualifier_ethertype_add;
  25129     functions->fp_data_qualifier_ethertype_delete
  25130                           = _bcm_field_trx2_data_qualifier_ethertype_delete;
  25131     functions->fp_data_qualifier_ip_protocol_add
  25132                           = _bcm_field_trx2_data_qualifier_ip_protocol_add;
  25133     functions->fp_data_qualifier_ip_protocol_delete
  25134                           = _bcm_field_trx2_data_qualifier_ip_protocol_delete;
  25135     functions->fp_data_qualifier_packet_format_add
  25136                           = _bcm_field_trx2_data_qualifier_packet_format_add;
  25137     functions->fp_data_qualifier_packet_format_delete
  25138                           = _bcm_field_trx2_data_qualifier_packet_format_delete;
  25139     functions->fp_control_set = _bcm_field_th_control_set;
  25140     functions->fp_control_get = _bcm_field_th_control_get;
  25141     functions->fp_stat_hw_mode_get = _bcm_field_th_stat_hw_mode_get;
  25142     functions->fp_stat_hw_alloc    = _bcm_field_th_stat_hw_alloc;
  25143     functions->fp_stat_hw_free     = _bcm_field_th_stat_hw_free;
  25144     functions->fp_group_add        = _bcm_field_th_group_add;
  25145     functions->fp_qualify_svp      = _bcm_field_th_qualify_svp;
  25146     functions->fp_qualify_dvp      = _bcm_field_th_qualify_dvp;
  25147     functions->fp_qualify_trunk    = _bcm_field_th_qualify_trunk;
  25148     functions->fp_qualify_trunk_get = _bcm_field_th_qualify_trunk_get;
  25149     functions->fp_qualify_inports = _bcm_field_th_qualify_InPorts;
  25150     functions->fp_entry_stat_extended_attach = NULL;
  25151     functions->fp_entry_stat_extended_get = NULL;
  25152     functions->fp_entry_stat_detach = _bcm_field_entry_stat_detach;
  25153     functions->fp_class_size_get = _bcm_field_th_qual_class_size_get;
  25154     functions->fp_eh_mask_profile_hw_alloc =
  25155                                      _bcm_field_th_eh_mask_profile_hw_alloc;
  25156     functions->fp_eh_mask_profile_hw_free =
  25157                                      _bcm_field_th_eh_mask_profile_hw_free;
  25158     functions->fp_qualify_packet_res = _bcm_field_th_qualify_PacketRes;
  25159     functions->fp_qualify_packet_res_get = _bcm_field_th_qualify_PacketRes_get;
  25160     functions->fp_ddrop_action_alloc = _bcm_field_th_ddrop_profile_alloc;
  25161     functions->fp_dredirect_action_alloc = _bcm_field_th_dredirect_profile_alloc;
  25162 }
  25163 
  25164 /*
  25165  * Function:
  25166  *    _field_th_stage_extractors_init
  25167  * Purpose:
  25168  *    Initialize extractor section hierarcy structure for the IFP stage.
  25169  * Parameters:
  25170  *    unit     - (IN) BCM device number.
  25171  *    stage_fc - (IN) Stage field control structure pointer.
  25172  * Returns:
  25173  *    BCM_E_PARAM   - Invalid parameter.
  25174  *    BCM_E_MEMORY  - Memory allocation failure.
  25175  *    BCM_E_NONE    - Success.
  25176  */
  25177 STATIC int
  25178 _field_th_stage_extractors_init(int unit, _field_stage_t *stage_fc)
  25179 {
  25180     int idx = 0;                     /* Index iterator.                     */
  25181     int level = 0;                   /* Extractor hierarchy level.          */
  25182     int gran = 0;                    /* Extractor granularity.              */
  25183     int ext_num = 0;                 /* Extractor number.                   */
  25184     int part;                        /* Entry part number.                  */
  25185     bcmi_keygen_ext_attrs_t ext_attrs;
  25186     bcmi_keygen_ext_attrs_t temp_attrs;
  25187     bcmi_keygen_ext_attrs_t *attrs = &temp_attrs;
  25188     uint32 ext_attrs_size = 0;
  25189     BCMI_KEYGEN_EXT_CFG_DECL;       /* Extractors config declaration.      */
  25190     bcmi_keygen_ext_cfg_db_t *ext_cfg_db = NULL;
  25191     BCMI_KEYGEN_FUNC_ENTER(unit);
  25192 
  25193     BCMI_KEYGEN_NULL_CHECK(stage_fc, BCM_E_PARAM);
  25194 
  25195     ext_attrs_size = sizeof(bcmi_keygen_ext_attrs_t);
  25196     sal_memset(attrs, 0, ext_attrs_size);
  25197 
  25198     _FP_XGS3_ALLOC(stage_fc->ext_cfg_db_arr,
  25199                    (BCMI_KEYGEN_MODE_COUNT * sizeof(bcmi_keygen_ext_cfg_db_t *)),
  25200                     "Field Extractors Data base Array");
  25201     if (NULL == stage_fc->ext_cfg_db_arr) {
  25202         return (BCM_E_MEMORY);
  25203     }
  25204 
  25205     _FP_XGS3_ALLOC(ext_cfg_db,
  25206                    sizeof(bcmi_keygen_ext_cfg_db_t), "Field Extractors DB");
  25207     if (NULL == ext_cfg_db) {
  25208         return (BCM_E_MEMORY);
  25209     }
  25210     stage_fc->ext_cfg_db_arr[BCMI_KEYGEN_MODE_DBLINTRA] = ext_cfg_db;
  25211     /* Initialize Level_1 32-bit extractor section. */
  25212     level = 1;
  25213     gran = 32;
  25214     ext_num = 0;
  25215     part = 0;
  25216     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25217         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2S1, 0, attrs);
  25218     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25219         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2S1, 32, attrs);
  25220     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25221         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2S1, 64, attrs);
  25222     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25223         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2S1, 96, attrs);
  25224 
  25225     /* Initialize Level_1 16-bit extractors section. */
  25226     level = 1;
  25227     gran = 16;
  25228     ext_num = 0;
  25229     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25230         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 128, attrs);
  25231     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25232         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 144, attrs);
  25233     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25234         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 160, attrs);
  25235     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25236         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 176, attrs);
  25237     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25238         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 192, attrs);
  25239     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25240         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 208, attrs);
  25241     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25242         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2S1, 224, attrs);
  25243 
  25244     /* Initialize Level_1 8-bit extractors section. */
  25245     level = 1;
  25246     gran = 8;
  25247     ext_num = 0;
  25248     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25249         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 0, attrs);
  25250     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25251         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 8, attrs);
  25252     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25253         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 16, attrs);
  25254     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25255         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 24, attrs);
  25256     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25257         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 32, attrs);
  25258     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25259         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 40, attrs);
  25260 
  25261     ext_num = 6;
  25262     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25263     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  25264     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num ,
  25265         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2S2, 48, &ext_attrs);
  25266 
  25267     /* Initialize Level_1 4-bit extractors section. */
  25268     level = 1;
  25269     gran = 4;
  25270     ext_num = 0;
  25271     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25272         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 56, attrs);
  25273     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25274         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 60, attrs);
  25275     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25276         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 64, attrs);
  25277     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25278         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 68, attrs);
  25279     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25280         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 72, attrs);
  25281     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25282         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 76, attrs);
  25283     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25284         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 80, attrs);
  25285     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25286         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2S2, 84, attrs);
  25287 
  25288     /* Initialize Level1 2-bit extractors section. */
  25289     level = 1;
  25290     gran = 2;
  25291     ext_num = 0;
  25292     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25293         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 88, attrs);
  25294     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25295         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 90, attrs);
  25296     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25297         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 92, attrs);
  25298     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25299         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 94, attrs);
  25300     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25301         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 96, attrs);
  25302     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25303         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 98, attrs);
  25304     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25305         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 100, attrs);
  25306     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25307         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2S2, 102, attrs);
  25308 
  25309     /* Initialize Level_2 16-bit extractors section. */
  25310     level = 2;
  25311     gran = 16;
  25312     ext_num = 0;
  25313     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25314     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  25315     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF);
  25316     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25317         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S1, 0, &ext_attrs);
  25318     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25319         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S1, 16, &ext_attrs);
  25320     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25321     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_SINGLE_ASET_WIDE);
  25322     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF);
  25323     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  25324     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25325         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S1, 32, &ext_attrs);
  25326     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25327     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_SINGLE_ASET_WIDE);
  25328     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF);
  25329     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  25330     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25331         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S1, 48, &ext_attrs);
  25332 
  25333     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25334         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 0, attrs);
  25335     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25336         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 16, attrs);
  25337     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25338         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 32, attrs);
  25339     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25340         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 48, attrs);
  25341     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 8),
  25342         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 64, attrs);
  25343     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 9),
  25344         BCMI_KEYGEN_EXT_SECTION_L2S1, BCMI_KEYGEN_EXT_SECTION_L3S2, 80, attrs);
  25345 
  25346     /* Initialize Level_2 8-bit extractors section. */
  25347     level = 2;
  25348     gran = 8;
  25349     ext_num = 0;
  25350     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25351     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25352     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25353         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 96, &ext_attrs);
  25354     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25355         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 104, &ext_attrs);
  25356     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25357         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 112, &ext_attrs);
  25358     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25359         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 120, &ext_attrs);
  25360     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25361         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 128, &ext_attrs);
  25362     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25363         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 136, &ext_attrs);
  25364     ext_num = 6;
  25365     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25366     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  25367     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num ,
  25368         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 144, &ext_attrs);
  25369 
  25370     /* Initialize Level_2 4-bit extractors section. */
  25371     level = 2;
  25372     gran = 4;
  25373     ext_num = 0;
  25374     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25375     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25376     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25377         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 152, &ext_attrs);
  25378     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25379         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 156, &ext_attrs);
  25380     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25381         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 160, &ext_attrs);
  25382     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25383         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 164, &ext_attrs);
  25384     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25385         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 168, &ext_attrs);
  25386     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25387         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 172, &ext_attrs);
  25388     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25389         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 176, &ext_attrs);
  25390     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25391         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 180, &ext_attrs);
  25392 
  25393     /* Initialize Level2 2-bit extractors section. */
  25394     level = 2;
  25395     gran = 2;
  25396     ext_num = 0;
  25397     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25398     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25399     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25400         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 184, &ext_attrs);
  25401     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25402         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 186, &ext_attrs);
  25403     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25404         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 188, &ext_attrs);
  25405     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25406         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 190, &ext_attrs);
  25407     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25408         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 192, &ext_attrs);
  25409     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25410         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 194, &ext_attrs);
  25411     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25412         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 196, &ext_attrs);
  25413     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25414         BCMI_KEYGEN_EXT_SECTION_L2S2, BCMI_KEYGEN_EXT_SECTION_L3S2, 198, &ext_attrs);
  25415 
  25416     /* Initialize two Level_3 16-bit extractors section. */
  25417     level = 3;
  25418     gran = 16;
  25419     ext_num = 0;
  25420     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25421     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  25422     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF);
  25423     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25424     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25425         BCMI_KEYGEN_EXT_SECTION_L3S1, BCMI_KEYGEN_EXT_SECTION_FK, 0, &ext_attrs);
  25426     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25427         BCMI_KEYGEN_EXT_SECTION_L3S1, BCMI_KEYGEN_EXT_SECTION_FK, 20, &ext_attrs);
  25428 
  25429     /* Initialize four Level_3 4-bit extractors section. */
  25430     level = 3;
  25431     gran = 4;
  25432     ext_num = 0;
  25433     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25434     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  25435     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF);
  25436     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25437         BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 16, &ext_attrs);
  25438     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25439     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF);
  25440     for (idx = 1; idx < 4; idx++) {
  25441         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25442             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25443             36 + (gran * (idx - 1)) , &ext_attrs);
  25444     }
  25445 
  25446     /* Initialize Level_3 16-bit extractors section. */
  25447     level = 3;
  25448     gran = 16;
  25449     ext_num = 2;
  25450     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25451     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_SINGLE_ASET_WIDE);
  25452     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF);
  25453     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  25454     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25455     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25456         BCMI_KEYGEN_EXT_SECTION_L3S1, BCMI_KEYGEN_EXT_SECTION_FK, 48, &ext_attrs);
  25457     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25458     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25459     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_SINGLE_ASET_WIDE);
  25460     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_MODE_HALF);
  25461     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  25462     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25463         BCMI_KEYGEN_EXT_SECTION_L3S1, BCMI_KEYGEN_EXT_SECTION_FK, 64, &ext_attrs);
  25464 
  25465     /* Initialize seventeen Level_3 4-bit extractors section. */
  25466     level = 3;
  25467     gran = 4;
  25468     ext_num = 4;
  25469     for (idx = 0; idx < 2; idx++) {
  25470         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25471             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25472             80 + (idx * gran), attrs);
  25473     }
  25474     ext_num = 4;
  25475     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25476     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0_HM);
  25477     for (idx = 2; idx < 6; idx++) {
  25478         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25479             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25480             80 + (idx * gran), &ext_attrs);
  25481     }
  25482     ext_num = 4;
  25483     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25484     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1_HM);
  25485     for (idx = 6; idx < 10; idx++) {
  25486         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25487             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25488             80 + (idx * gran), &ext_attrs);
  25489     }
  25490     ext_num = 4;
  25491     idx = 10;
  25492     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25493     SHR_BITSET(ext_attrs.w,
  25494        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_0_3);
  25495     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25496         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25497         80 + (idx * gran), &ext_attrs);
  25498     idx = 11;
  25499     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25500     SHR_BITSET(ext_attrs.w,
  25501        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_4_7);
  25502     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25503         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25504         80 + (idx * gran), &ext_attrs);
  25505     idx = 12;
  25506     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25507     SHR_BITSET(ext_attrs.w,
  25508        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_8_11);
  25509     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25510         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25511         80 + (idx * gran), &ext_attrs);
  25512 
  25513     ext_num = 4;
  25514     idx = 13;
  25515     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25516     SHR_BITSET(ext_attrs.w,
  25517        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_0_3);
  25518     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25519         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25520         80 + (idx * gran), &ext_attrs);
  25521 
  25522     idx = 14;
  25523     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25524     SHR_BITSET(ext_attrs.w,
  25525        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_4_7);
  25526     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25527         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25528         80 + (idx * gran), &ext_attrs);
  25529 
  25530     idx = 15;
  25531     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25532     SHR_BITSET(ext_attrs.w,
  25533        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_8_11);
  25534     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25535         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25536         80 + (idx * gran), &ext_attrs);
  25537 
  25538     idx = 16;
  25539     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25540     SHR_BITSET(ext_attrs.w,BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  25541     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran,
  25542         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25543         80 + (idx * gran), &ext_attrs);
  25544 
  25545     /* Initialize 5 Level_3 2-bit extractors section. */
  25546     level = 3;
  25547     gran = 2;
  25548 
  25549     for (ext_num = 0; ext_num < 1; ext_num++) {
  25550         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25551             BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK,
  25552             148 + (ext_num * gran), attrs);
  25553     }
  25554 
  25555     ext_num = 1;
  25556     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25557     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  25558     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num ,
  25559         BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 150, &ext_attrs);
  25560 
  25561     /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */
  25562     ext_num = 0;
  25563     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25564     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB);
  25565     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB_HM);
  25566     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num + 2,
  25567         BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 152, &ext_attrs);
  25568 
  25569     ext_num = 0;
  25570     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25571     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_HIT);
  25572     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_HIT);
  25573     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num + 3,
  25574         BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 154, &ext_attrs);
  25575 
  25576     /* Overlay with NAT_DST_REALM_ID. */
  25577     ext_num = 0;
  25578     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25579     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_DST_REALM_ID);
  25580     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num + 4,
  25581         BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 156, &ext_attrs);
  25582 
  25583     /* Initialize 2 Level_3 1-bit extractors section. */
  25584     level = 3;
  25585     gran = 1;
  25586     ext_num = 0;
  25587     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25588     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_NEEDED);
  25589     /* Overlay with NAT_NEEDED. */
  25590     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25591         BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 158, &ext_attrs);
  25592 
  25593     /* Overlay with DROP. */
  25594     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25595     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_DROP);
  25596     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num + 1,
  25597         BCMI_KEYGEN_EXT_SECTION_L3S2, BCMI_KEYGEN_EXT_SECTION_FK, 159, &ext_attrs);
  25598 
  25599     /* Initialize Level_4 extractor section. */
  25600     level = 4;
  25601     gran = 160;
  25602     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, 0,
  25603         BCMI_KEYGEN_EXT_SECTION_FK, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs);
  25604 
  25605     /* 320 bits mode - Initialize Level_1 32-bit extractor section. */
  25606     ext_cfg_db = NULL;
  25607     _FP_XGS3_ALLOC(ext_cfg_db,
  25608                    sizeof(bcmi_keygen_ext_cfg_db_t), "Field Extractors DB");
  25609     if (NULL == ext_cfg_db) {
  25610         return (BCM_E_MEMORY);
  25611     }
  25612     stage_fc->ext_cfg_db_arr[BCMI_KEYGEN_MODE_DBLINTER] = ext_cfg_db;
  25613     level = 1;
  25614     gran = 32;
  25615     ext_num = 0;
  25616 
  25617     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  25618         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 0, attrs);
  25619     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  25620         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 0, attrs);
  25621     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  25622         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 32, attrs);
  25623     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  25624         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 32, attrs);
  25625 
  25626     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  25627         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 64, attrs);
  25628     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  25629         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 64, attrs);
  25630     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  25631         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 96, attrs);
  25632     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  25633         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 96, attrs);
  25634 
  25635     /* Initialize Level_1 16-bit extractor section. */
  25636     level = 1;
  25637     gran = 16;
  25638     ext_num = 0;
  25639     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  25640         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 128, attrs);
  25641     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  25642         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 128, attrs);
  25643     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  25644         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 144, attrs);
  25645     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  25646         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 144, attrs);
  25647 
  25648     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  25649         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 160, attrs);
  25650     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  25651         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 160, attrs);
  25652     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  25653         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 176, attrs);
  25654     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  25655         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 176, attrs);
  25656 
  25657     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  25658         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 192, attrs);
  25659     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  25660         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 192, attrs);
  25661     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  25662         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 208, attrs);
  25663     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5,
  25664         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 208, attrs);
  25665 
  25666     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  25667         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 224, attrs);
  25668     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6,
  25669         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 224, attrs);
  25670 
  25671     /* Initialize Level_1 8-bit extractor section. */
  25672     level = 1;
  25673     gran = 8;
  25674     ext_num = 0;
  25675 
  25676     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  25677         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 0, attrs);
  25678     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  25679         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 8, attrs);
  25680     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  25681         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 0, attrs);
  25682     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  25683         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 8, attrs);
  25684 
  25685 
  25686     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  25687         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 16, attrs);
  25688     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  25689         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 16, attrs);
  25690     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  25691         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 24, attrs);
  25692     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  25693         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 24, attrs);
  25694 
  25695     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  25696         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 32, attrs);
  25697     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  25698         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 32, attrs);
  25699     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  25700         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 40, attrs);
  25701     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5,
  25702         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 40, attrs);
  25703 
  25704     ext_num = 6;
  25705     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  25706         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 48, attrs);
  25707     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25708     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  25709     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num ,
  25710         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 48, &ext_attrs);
  25711 
  25712     /* Initialize Level_1 4-bit extractor section. */
  25713     level = 1;
  25714     gran = 4;
  25715     ext_num = 0;
  25716 
  25717     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  25718         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 56, attrs);
  25719     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  25720         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 56, attrs);
  25721     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  25722         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 60, attrs);
  25723     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  25724         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 60, attrs);
  25725 
  25726     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  25727         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 64, attrs);
  25728     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  25729         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 64, attrs);
  25730     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  25731         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 68, attrs);
  25732     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  25733         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 68, attrs);
  25734 
  25735     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  25736         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 72, attrs);
  25737     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  25738         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 72, attrs);
  25739     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  25740         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 76, attrs);
  25741     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5,
  25742         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 76, attrs);
  25743 
  25744     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  25745         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 80, attrs);
  25746     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6,
  25747         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 80, attrs);
  25748     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7,
  25749         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 84, attrs);
  25750     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 7,
  25751         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 84, attrs);
  25752 
  25753     /* Initialize Level_1 2-bit extractor section. */
  25754     level = 1;
  25755     gran = 2;
  25756     ext_num = 0;
  25757 
  25758     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  25759         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 88, attrs);
  25760     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  25761         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 88, attrs);
  25762     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  25763         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 90, attrs);
  25764     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  25765         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 90, attrs);
  25766 
  25767     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  25768         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 92, attrs);
  25769     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  25770         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 92, attrs);
  25771     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  25772         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 94, attrs);
  25773     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  25774         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 94, attrs);
  25775 
  25776     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  25777         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 96, attrs);
  25778     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  25779         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 96, attrs);
  25780     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  25781         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 98, attrs);
  25782     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5,
  25783         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 98, attrs);
  25784 
  25785     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  25786         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 100, attrs);
  25787     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6,
  25788         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 100, attrs);
  25789     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7,
  25790         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 102, attrs);
  25791     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 7,
  25792         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 102, attrs);
  25793 
  25794     /* Initialize Level_2 16-bit extractors section. */
  25795     level = 2;
  25796     gran = 16;
  25797     ext_num = 0;
  25798     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25799     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  25800     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  25801         BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 0, &ext_attrs);
  25802     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  25803         BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 16, &ext_attrs);
  25804 
  25805     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25806     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  25807     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  25808         BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 32, &ext_attrs);
  25809     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25810     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  25811     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  25812         BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 48, &ext_attrs);
  25813 
  25814     for (ext_num = 4; ext_num < 10; ext_num++) {
  25815         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  25816             BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS2,
  25817             ((ext_num - 4) * gran), attrs);
  25818     }
  25819 
  25820     level = 2;
  25821     gran = 16;
  25822     ext_num = 0;
  25823     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  25824         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 0, attrs);
  25825     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  25826         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 16, attrs);
  25827     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25828     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  25829     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  25830         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 32, &ext_attrs);
  25831     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25832     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  25833     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  25834         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 48, &ext_attrs);
  25835 
  25836     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  25837             BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 0, attrs);
  25838     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  25839             BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 16, attrs);
  25840     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  25841             BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 32, attrs);
  25842     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7,
  25843             BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 48, attrs);
  25844     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 8,
  25845             BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 64, attrs);
  25846     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 9,
  25847             BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 80, attrs);
  25848 
  25849 
  25850     /* Initialize Level_2 8-bit extractors section. */
  25851     level = 2;
  25852     gran = 8;
  25853     ext_num = 0;
  25854     part = 0;
  25855     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25856     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25857     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25858         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 96, &ext_attrs);
  25859     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25860         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2,104, &ext_attrs);
  25861     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25862         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 112, &ext_attrs);
  25863     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25864         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 120, &ext_attrs);
  25865     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25866         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 128, &ext_attrs);
  25867     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25868         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 136, &ext_attrs);
  25869 
  25870     ext_num = 6;
  25871     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25872     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  25873     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num ,
  25874         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 144, &ext_attrs);
  25875 
  25876     /* Initialize Level_2 4-bit extractors section. */
  25877     level = 2;
  25878     gran = 4;
  25879     ext_num = 0;
  25880     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25881     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25882     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25883         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 152, &ext_attrs);
  25884     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25885         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 156, &ext_attrs);
  25886     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25887         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 160, &ext_attrs);
  25888     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25889         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 164, &ext_attrs);
  25890     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25891         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 168, &ext_attrs);
  25892     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25893         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 172, &ext_attrs);
  25894     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25895         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 176, &ext_attrs);
  25896     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25897         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 180, &ext_attrs);
  25898 
  25899     /* Initialize Level2 2-bit extractors section. */
  25900     level = 2;
  25901     gran = 2;
  25902     ext_num = 0;
  25903     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25904     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25905     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25906         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 184, &ext_attrs);
  25907     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25908         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 186, &ext_attrs);
  25909     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25910         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 188, &ext_attrs);
  25911     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25912         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 190, &ext_attrs);
  25913     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25914         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 192, &ext_attrs);
  25915     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25916         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 194, &ext_attrs);
  25917     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25918         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 196, &ext_attrs);
  25919     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25920         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 198, &ext_attrs);
  25921 
  25922 
  25923     /* Initialize Level_2 8-bit extractors section. */
  25924     level = 2;
  25925     gran = 8;
  25926     ext_num = 0;
  25927     part = 1;
  25928     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25929     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25930     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25931         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 96, &ext_attrs);
  25932     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25933         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2,104, &ext_attrs);
  25934     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25935         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 112, &ext_attrs);
  25936     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25937         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 120, &ext_attrs);
  25938     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25939         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 128, &ext_attrs);
  25940     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25941         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 136, &ext_attrs);
  25942     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25943         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 144, &ext_attrs);
  25944 
  25945     /* Initialize Level_2 4-bit extractors section. */
  25946     level = 2;
  25947     gran = 4;
  25948     ext_num = 0;
  25949     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25950     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25951     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25952         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 152, &ext_attrs);
  25953     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25954         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 156, &ext_attrs);
  25955     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25956         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 160, &ext_attrs);
  25957     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25958         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 164, &ext_attrs);
  25959     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25960         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 168, &ext_attrs);
  25961     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25962         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 172, &ext_attrs);
  25963     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25964         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 176, &ext_attrs);
  25965     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25966         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 180, &ext_attrs);
  25967 
  25968     /* Initialize Level2 2-bit extractors section. */
  25969     level = 2;
  25970     gran = 2;
  25971     ext_num = 0;
  25972     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25973     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25974     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  25975         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 184, &ext_attrs);
  25976     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  25977         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 186, &ext_attrs);
  25978     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  25979         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 188, &ext_attrs);
  25980     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  25981         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 190, &ext_attrs);
  25982     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  25983         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 192, &ext_attrs);
  25984     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  25985         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 194, &ext_attrs);
  25986     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  25987         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 196, &ext_attrs);
  25988     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  25989         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 198, &ext_attrs);
  25990 
  25991     /* Initialize Level_3 16-bit extractors section - SLICE_A. */
  25992     level = 3;
  25993     gran = 16;
  25994     ext_num = 0;
  25995     sal_memset(&ext_attrs, 0, ext_attrs_size);
  25996     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  25997     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  25998     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  25999         BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 0, &ext_attrs);
  26000     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26001         BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 20, &ext_attrs);
  26002 
  26003     /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */
  26004     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26005     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  26006     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26007     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26008         BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 48, &ext_attrs);
  26009     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26010     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  26011     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26012     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26013         BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 64, &ext_attrs);
  26014 
  26015     /* Initialize Level_3 4-bit extractors section. */
  26016     level = 3;
  26017     gran = 4;
  26018     ext_num = 0;
  26019     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26020     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  26021     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26022         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 16, &ext_attrs);
  26023     for (idx = 1; idx < 4; idx++) {
  26024         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26025             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26026             36 + (gran * (idx - 1)), attrs);
  26027     }
  26028 
  26029     level = 3;
  26030     gran = 4;
  26031     ext_num = 4;
  26032     for (idx = 0; idx < 10; idx++) {
  26033         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26034             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26035             80 + (idx * gran), attrs);
  26036     }
  26037 
  26038     ext_num = 4;
  26039     idx = 10;
  26040     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26041     SHR_BITSET(ext_attrs.w,
  26042        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_0_3);
  26043     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26044         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26045         80 + (idx * gran), &ext_attrs);
  26046 
  26047     idx = 11;
  26048     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26049     SHR_BITSET(ext_attrs.w,
  26050        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_4_7);
  26051     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26052         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26053         80 + (idx * gran), &ext_attrs);
  26054 
  26055     idx = 12;
  26056     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26057     SHR_BITSET(ext_attrs.w,
  26058        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_8_11);
  26059     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26060         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26061         80 + (idx * gran), &ext_attrs);
  26062 
  26063     ext_num = 4;
  26064     idx = 13;
  26065     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26066     SHR_BITSET(ext_attrs.w,
  26067        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_0_3);
  26068         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26069             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26070             80 + (idx * gran), &ext_attrs);
  26071 
  26072     idx = 14;
  26073     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26074     SHR_BITSET(ext_attrs.w,
  26075        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_4_7);
  26076         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26077             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26078             80 + (idx * gran), &ext_attrs);
  26079 
  26080     idx = 15;
  26081     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26082     SHR_BITSET(ext_attrs.w,
  26083        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_8_11);
  26084         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26085             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26086             80 + (idx * gran), &ext_attrs);
  26087 
  26088     ext_num = 4;
  26089     idx = 16;
  26090     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26091     SHR_BITSET(ext_attrs.w,BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  26092     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26093         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26094         80 + (idx * gran), &ext_attrs);
  26095 
  26096     /* Initialize Level_3 2-bit extractors section. */
  26097     level = 3;
  26098     gran = 2;
  26099     for (ext_num = 0; ext_num < 1; ext_num++) {
  26100         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26101             BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26102             148 + (ext_num * gran), attrs);
  26103     }
  26104     ext_num = 1;
  26105     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26106     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  26107     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num ,
  26108         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 150, &ext_attrs);
  26109 
  26110 
  26111     /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */
  26112     ext_num = 0;
  26113     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26114     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB);
  26115     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26116         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 152, &ext_attrs);
  26117 
  26118     ext_num = 0;
  26119     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26120     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_HIT);
  26121     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_HIT);
  26122     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26123         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 154, &ext_attrs);
  26124 
  26125     /* Overlay with NAT_DST_REALM_ID. */
  26126     ext_num = 0;
  26127     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26128     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_DST_REALM_ID);
  26129     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  26130         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 156, &ext_attrs);
  26131 
  26132     /* Initialize 2 Level_3 1-bit extractors section. */
  26133     level = 3;
  26134     gran = 1;
  26135     ext_num = 0;
  26136     /* Overlay with NAT_NEEDED. */
  26137     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26138     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_NEEDED);
  26139     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26140         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 158, &ext_attrs);
  26141     /* Overlay with DROP. */
  26142     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26143     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_DROP);
  26144     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26145         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 159, &ext_attrs);
  26146 
  26147     /* Initialize Level_3 16-bit extractors section - SLICE_B. */
  26148     level = 3;
  26149     gran = 16;
  26150     ext_num = 0;
  26151     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26152     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26153     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26154         BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 0, &ext_attrs);
  26155     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  26156         BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 20, &ext_attrs);
  26157     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26158     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26159     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  26160     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26161         BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 48, &ext_attrs);
  26162     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26163     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26164     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  26165     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26166         BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 64, &ext_attrs);
  26167 
  26168     /* Initialize Level_3 4-bit extractors section. */
  26169     level = 3;
  26170     gran = 4;
  26171     ext_num = 0;
  26172     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26173         BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 16, attrs);
  26174 
  26175     for (idx = 1; idx < 4; idx++) {
  26176         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran,
  26177             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB,
  26178             36 + (gran * (idx - 1)), attrs);
  26179     }
  26180 
  26181     level = 3;
  26182     gran = 4;
  26183     ext_num = 4;
  26184 
  26185     for (idx = 0; idx < 17; idx++) {
  26186         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran,
  26187             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB,
  26188             80 + (idx * gran), attrs);
  26189     }
  26190 
  26191     /* Initialize Level_3 2-bit extractors section. */
  26192     level = 3;
  26193     gran = 2;
  26194     for (ext_num = 0; ext_num < 2; ext_num++) {
  26195         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26196             BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB,
  26197             148 + (ext_num * gran), attrs);
  26198     }
  26199 
  26200     /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */
  26201     ext_num = 0;
  26202     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26203     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB);
  26204     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26205         BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 152, &ext_attrs);
  26206 
  26207     ext_num = 0;
  26208     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26209         BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 154, attrs);
  26210 
  26211     ext_num = 0;
  26212     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  26213         BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 156, attrs);
  26214 
  26215     /* Initialize 2 Level_3 1-bit extractors section. */
  26216     level = 3;
  26217     gran = 1;
  26218     for (ext_num = 0; ext_num < 2; ext_num++) {
  26219         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26220             BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB,
  26221             158 + (ext_num * gran), attrs);
  26222     }
  26223 
  26224     /* Initialize Level_4 extractor section. */
  26225     level = 4;
  26226     gran = 160;
  26227     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 0,
  26228         BCMI_KEYGEN_EXT_SECTION_FK, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs);
  26229     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 0,
  26230         BCMI_KEYGEN_EXT_SECTION_FKA, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs);
  26231     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, 0,
  26232         BCMI_KEYGEN_EXT_SECTION_FKB, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs);
  26233 
  26234     /* 480 bit mode - Initialize Level_1 32-bit extractor section. */
  26235     ext_cfg_db = NULL;
  26236     _FP_XGS3_ALLOC(ext_cfg_db,
  26237                    sizeof(bcmi_keygen_ext_cfg_db_t), "Field Extractors DB");
  26238     if (NULL == ext_cfg_db) {
  26239         return (BCM_E_MEMORY);
  26240     }
  26241     stage_fc->ext_cfg_db_arr[BCMI_KEYGEN_MODE_TRIPLE] = ext_cfg_db;
  26242     level = 1;
  26243     gran = 32;
  26244     ext_num = 0;
  26245 
  26246     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26247         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 0, attrs);
  26248     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26249         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 32, attrs);
  26250     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26251         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 0, attrs);
  26252     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  26253         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 32, attrs);
  26254     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  26255         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2CS1, 0, attrs);
  26256     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1,
  26257         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2CS1, 32, attrs);
  26258 
  26259     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26260         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 64, attrs);
  26261     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26262         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2AS1, 96, attrs);
  26263     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26264         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 64, attrs);
  26265     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26266         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2BS1, 96, attrs);
  26267     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2,
  26268         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2CS1, 64, attrs);
  26269     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3,
  26270         BCMI_KEYGEN_EXT_SECTION_L1E32, BCMI_KEYGEN_EXT_SECTION_L2CS1, 96, attrs);
  26271 
  26272     /* Initialize Level_1 16-bit extractor section. */
  26273     level = 1;
  26274     gran = 16;
  26275     ext_num = 0;
  26276     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26277         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 128, attrs);
  26278     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  26279         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 144, attrs);
  26280     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  26281         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 128, attrs);
  26282     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1,
  26283         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 144, attrs);
  26284     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26285         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 128, attrs);
  26286     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26287         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 144, attrs);
  26288 
  26289     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26290         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 160, attrs);
  26291     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26292         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 176, attrs);
  26293     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2,
  26294         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 160, attrs);
  26295     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3,
  26296         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 176, attrs);
  26297     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26298         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 160, attrs);
  26299     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26300         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 176, attrs);
  26301 
  26302     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  26303         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 192, attrs);
  26304     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  26305         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 208, attrs);
  26306     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4,
  26307         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 192, attrs);
  26308     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5,
  26309         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 208, attrs);
  26310     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  26311         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 192, attrs);
  26312     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5,
  26313         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 208, attrs);
  26314 
  26315     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  26316         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2BS1, 224, attrs);
  26317     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6,
  26318         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2CS1, 224, attrs);
  26319     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6,
  26320         BCMI_KEYGEN_EXT_SECTION_L1E16, BCMI_KEYGEN_EXT_SECTION_L2AS1, 224, attrs);
  26321 
  26322     /* Initialize Level_1 8-bit extractor section. */
  26323     level = 1;
  26324     gran = 8;
  26325     ext_num = 0;
  26326     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26327         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 0, attrs);
  26328     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  26329         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 8, attrs);
  26330     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  26331         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 0, attrs);
  26332     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1,
  26333         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 8, attrs);
  26334     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26335         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 0, attrs);
  26336     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26337         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 8, attrs);
  26338 
  26339     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26340         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 16, attrs);
  26341     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26342         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 24, attrs);
  26343     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2,
  26344         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 16, attrs);
  26345     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3,
  26346         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 24, attrs);
  26347     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26348         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 16, attrs);
  26349     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26350         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 24, attrs);
  26351 
  26352     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  26353         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 32, attrs);
  26354     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  26355         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 40, attrs);
  26356     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4,
  26357         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 32, attrs);
  26358     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5,
  26359         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 40, attrs);
  26360     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  26361         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 32, attrs);
  26362     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5,
  26363         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 40, attrs);
  26364 
  26365     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  26366         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2BS2, 48, attrs);
  26367     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6,
  26368         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2CS2, 48, attrs);
  26369     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26370     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  26371     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6,
  26372         BCMI_KEYGEN_EXT_SECTION_L1E8, BCMI_KEYGEN_EXT_SECTION_L2AS2, 48, &ext_attrs);
  26373 
  26374     /* Initialize Level_1 4-bit extractor section. */
  26375     level = 1;
  26376     gran = 4;
  26377     ext_num = 0;
  26378     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26379         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 56, attrs);
  26380     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  26381         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 60, attrs);
  26382     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  26383         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 56, attrs);
  26384     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1,
  26385         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 60, attrs);
  26386     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26387         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 56, attrs);
  26388     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26389         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 60, attrs);
  26390 
  26391     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26392         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 64, attrs);
  26393     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26394         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 68, attrs);
  26395     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2,
  26396         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 64, attrs);
  26397     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3,
  26398         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 68, attrs);
  26399     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26400         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 64, attrs);
  26401     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26402         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 68, attrs);
  26403 
  26404     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  26405         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 72, attrs);
  26406     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  26407         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 76, attrs);
  26408     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4,
  26409         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 72, attrs);
  26410     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5,
  26411         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 76, attrs);
  26412     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  26413         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 72, attrs);
  26414     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5,
  26415         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 76, attrs);
  26416 
  26417     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  26418         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 80, attrs);
  26419     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7,
  26420         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2BS2, 84, attrs);
  26421     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6,
  26422         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 80, attrs);
  26423     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 7,
  26424         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2CS2, 84, attrs);
  26425     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6,
  26426         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 80, attrs);
  26427     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 7,
  26428         BCMI_KEYGEN_EXT_SECTION_L1E4, BCMI_KEYGEN_EXT_SECTION_L2AS2, 84, attrs);
  26429 
  26430     /* Initialize Level_1 2-bit extractor section. */
  26431     level = 1;
  26432     gran = 2;
  26433     ext_num = 0;
  26434     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  26435         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 88, attrs);
  26436     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1,
  26437         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 90, attrs);
  26438     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26439         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 88, attrs);
  26440     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  26441         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 90, attrs);
  26442     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26443         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 88, attrs);
  26444     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26445         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 90, attrs);
  26446 
  26447     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2,
  26448         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 92, attrs);
  26449     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3,
  26450         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 94, attrs);
  26451     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26452         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 92, attrs);
  26453     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26454         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 94, attrs);
  26455     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26456         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 92, attrs);
  26457     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26458         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 94, attrs);
  26459 
  26460     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4,
  26461         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 96, attrs);
  26462     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5,
  26463         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 98, attrs);
  26464     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  26465         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 96, attrs);
  26466     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  26467         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 98, attrs);
  26468     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  26469         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 96, attrs);
  26470     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 5,
  26471         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 98, attrs);
  26472 
  26473     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6,
  26474         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 100, attrs);
  26475     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 7,
  26476         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2CS2, 102, attrs);
  26477     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  26478         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 100, attrs);
  26479     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7,
  26480         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2BS2, 102, attrs);
  26481     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 6,
  26482         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 100, attrs);
  26483     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 7,
  26484         BCMI_KEYGEN_EXT_SECTION_L1E2, BCMI_KEYGEN_EXT_SECTION_L2AS2, 102, attrs);
  26485 
  26486     /* Initialize Level_2 16-bit extractors section - Slice_A. */
  26487     level = 2;
  26488     gran = 16;
  26489     ext_num = 0;
  26490     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26491     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  26492     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26493         BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 0, &ext_attrs);
  26494     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26495         BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 16, &ext_attrs);
  26496     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26497     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  26498     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26499         BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 32, &ext_attrs);
  26500     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26501     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  26502     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db,  0, level, gran, ext_num + 3,
  26503         BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS1, 48, &ext_attrs);
  26504     for (ext_num = 4; ext_num < 10; ext_num++) {
  26505         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26506             BCMI_KEYGEN_EXT_SECTION_L2AS1, BCMI_KEYGEN_EXT_SECTION_L3AS2,
  26507             ((ext_num - 4) * gran), attrs);
  26508     }
  26509 
  26510     /* Initialize Level_2 8-bit extractors section. */
  26511     level = 2;
  26512     gran = 8;
  26513     ext_num = 0;
  26514     part = 0;
  26515     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26516     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26517     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26518         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 96, &ext_attrs);
  26519     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26520         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2,104, &ext_attrs);
  26521     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26522         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 112, &ext_attrs);
  26523     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26524         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 120, &ext_attrs);
  26525     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26526         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 128, &ext_attrs);
  26527     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26528         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 136, &ext_attrs);
  26529 
  26530     ext_num = 6;
  26531     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26532     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  26533     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num ,
  26534         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 144, &ext_attrs);
  26535 
  26536     /* Initialize Level_2 4-bit extractors section. */
  26537     level = 2;
  26538     gran = 4;
  26539     ext_num = 0;
  26540     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26541     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26542     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26543         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 152, &ext_attrs);
  26544     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26545         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 156, &ext_attrs);
  26546     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26547         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 160, &ext_attrs);
  26548     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26549         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 164, &ext_attrs);
  26550     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26551         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 168, &ext_attrs);
  26552     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26553         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 172, &ext_attrs);
  26554     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  26555         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 176, &ext_attrs);
  26556     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  26557         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 180, &ext_attrs);
  26558 
  26559     /* Initialize Level2 2-bit extractors section. */
  26560     level = 2;
  26561     gran = 2;
  26562     ext_num = 0;
  26563     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26564     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26565     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26566         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 184, &ext_attrs);
  26567     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26568         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 186, &ext_attrs);
  26569     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26570         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 188, &ext_attrs);
  26571     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26572         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 190, &ext_attrs);
  26573     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26574         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 192, &ext_attrs);
  26575     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26576         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 194, &ext_attrs);
  26577     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  26578         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 196, &ext_attrs);
  26579     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  26580         BCMI_KEYGEN_EXT_SECTION_L2AS2, BCMI_KEYGEN_EXT_SECTION_L3AS2, 198, &ext_attrs);
  26581 
  26582     /* Initialize Level_2 16-bit extractors section - Slice_B. */
  26583     level = 2;
  26584     gran = 16;
  26585     ext_num = 0;
  26586     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26587         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 0, attrs);
  26588     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  26589         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 16, attrs);
  26590     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26591     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  26592     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26593         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 32, &ext_attrs);
  26594     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26595     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  26596     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26597         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS1, 48, &ext_attrs);
  26598 
  26599     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  26600         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 0, attrs);
  26601     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 5,
  26602         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 16, attrs);
  26603     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 6,
  26604         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 32, attrs);
  26605     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 7,
  26606         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 48, attrs);
  26607     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 8,
  26608         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 64, attrs);
  26609     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 9,
  26610         BCMI_KEYGEN_EXT_SECTION_L2BS1, BCMI_KEYGEN_EXT_SECTION_L3BS2, 80, attrs);
  26611 
  26612     /* Initialize Level_2 8-bit extractors section. */
  26613     level = 2;
  26614     gran = 8;
  26615     ext_num = 0;
  26616     part = 1;
  26617     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26618     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26619     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26620         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 96, &ext_attrs);
  26621     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26622         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2,104, &ext_attrs);
  26623     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26624         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 112, &ext_attrs);
  26625     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26626         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 120, &ext_attrs);
  26627     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26628         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 128, &ext_attrs);
  26629     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26630         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 136, &ext_attrs);
  26631     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  26632         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 144, &ext_attrs);
  26633 
  26634     /* Initialize Level_2 4-bit extractors section. */
  26635     level = 2;
  26636     gran = 4;
  26637     ext_num = 0;
  26638     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26639     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26640     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26641         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 152, &ext_attrs);
  26642     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26643         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 156, &ext_attrs);
  26644     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26645         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 160, &ext_attrs);
  26646     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26647         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 164, &ext_attrs);
  26648     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26649         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 168, &ext_attrs);
  26650     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26651         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 172, &ext_attrs);
  26652     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  26653         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 176, &ext_attrs);
  26654     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  26655         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 180, &ext_attrs);
  26656 
  26657     /* Initialize Level2 2-bit extractors section. */
  26658     level = 2;
  26659     gran = 2;
  26660     ext_num = 0;
  26661     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26662     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26663     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26664         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 184, &ext_attrs);
  26665     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26666         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 186, &ext_attrs);
  26667     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26668         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 188, &ext_attrs);
  26669     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26670         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 190, &ext_attrs);
  26671     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26672         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 192, &ext_attrs);
  26673     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26674         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 194, &ext_attrs);
  26675     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  26676         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 196, &ext_attrs);
  26677     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  26678         BCMI_KEYGEN_EXT_SECTION_L2BS2, BCMI_KEYGEN_EXT_SECTION_L3BS2, 198, &ext_attrs);
  26679 
  26680     /* Initialize Level_2 16-bit extractors section - Slice_C. */
  26681     level = 2;
  26682     gran = 16;
  26683     ext_num = 0;
  26684     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  26685         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS1, 0, attrs);
  26686     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1,
  26687         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS1, 16, attrs);
  26688     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26689     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  26690     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2,
  26691         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS1, 32, &ext_attrs);
  26692     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26693     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  26694     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3,
  26695         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS1, 48, &ext_attrs);
  26696 
  26697     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4,
  26698         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 0, attrs);
  26699     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 5,
  26700         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 16, attrs);
  26701     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 6,
  26702         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 32, attrs);
  26703     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 7,
  26704         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 48, attrs);
  26705     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 8,
  26706         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 64, attrs);
  26707     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 9,
  26708         BCMI_KEYGEN_EXT_SECTION_L2CS1, BCMI_KEYGEN_EXT_SECTION_L3CS2, 80, attrs);
  26709 
  26710     /* Initialize Level_2 8-bit extractors section. */
  26711     level = 2;
  26712     gran = 8;
  26713     ext_num = 0;
  26714     part = 2;
  26715     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26716     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26717     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26718         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 96, &ext_attrs);
  26719     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26720         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2,104, &ext_attrs);
  26721     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26722         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 112, &ext_attrs);
  26723     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26724         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 120, &ext_attrs);
  26725     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26726         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 128, &ext_attrs);
  26727     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26728         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 136, &ext_attrs);
  26729     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  26730         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 144, &ext_attrs);
  26731 
  26732     /* Initialize Level_2 4-bit extractors section. */
  26733     level = 2;
  26734     gran = 4;
  26735     ext_num = 0;
  26736     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26737     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26738     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26739         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 152, &ext_attrs);
  26740     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26741         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 156, &ext_attrs);
  26742     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26743         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 160, &ext_attrs);
  26744     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26745         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 164, &ext_attrs);
  26746     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26747         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 168, &ext_attrs);
  26748     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26749         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 172, &ext_attrs);
  26750     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  26751         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 176, &ext_attrs);
  26752     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  26753         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 180, &ext_attrs);
  26754 
  26755     /* Initialize Level2 2-bit extractors section. */
  26756     level = 2;
  26757     gran = 2;
  26758     ext_num = 0;
  26759     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26760     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26761     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, ext_num,
  26762         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 184, &ext_attrs);
  26763     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 1),
  26764         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 186, &ext_attrs);
  26765     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 2),
  26766         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 188, &ext_attrs);
  26767     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 3),
  26768         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 190, &ext_attrs);
  26769     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 4),
  26770         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 192, &ext_attrs);
  26771     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 5),
  26772         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 194, &ext_attrs);
  26773     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 6),
  26774         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 196, &ext_attrs);
  26775     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, part, level, gran, (ext_num + 7),
  26776         BCMI_KEYGEN_EXT_SECTION_L2CS2, BCMI_KEYGEN_EXT_SECTION_L3CS2, 198, &ext_attrs);
  26777 
  26778     /* Initialize Level_3 16-bit extractors section - SLICE_A. */
  26779     level = 3;
  26780     gran = 16;
  26781     ext_num = 0;
  26782     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26783     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26784     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  26785     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26786         BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 0, &ext_attrs);
  26787     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26788         BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 20, &ext_attrs);
  26789     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26790     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26791     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  26792     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26793         BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 48, &ext_attrs);
  26794     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26795     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26796     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  26797     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26798         BCMI_KEYGEN_EXT_SECTION_L3AS1, BCMI_KEYGEN_EXT_SECTION_FKA, 64, &ext_attrs);
  26799 
  26800     /* Initialize Level_3 4-bit extractors section. */
  26801     level = 3;
  26802     gran = 4;
  26803     ext_num = 0;
  26804     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26805     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_IPBM);
  26806     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26807         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 16, &ext_attrs);
  26808     for (idx = 1; idx < 4; idx++) {
  26809         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26810             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26811             36 + (gran * (idx - 1)), attrs);
  26812     }
  26813 
  26814     level = 3;
  26815     gran = 4;
  26816     ext_num = 4;
  26817     for (idx = 0; idx < 10; idx++) {
  26818         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26819             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26820             80 + (idx * gran), attrs);
  26821     }
  26822 
  26823     ext_num = 4;
  26824     idx = 10;
  26825     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26826     SHR_BITSET(ext_attrs.w,
  26827        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_0_3);
  26828     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26829             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26830             80 + (idx * gran), &ext_attrs);
  26831 
  26832     idx = 11;
  26833     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26834     SHR_BITSET(ext_attrs.w,
  26835        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_4_7);
  26836     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26837             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26838             80 + (idx * gran), &ext_attrs);
  26839 
  26840     idx = 12;
  26841     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26842     SHR_BITSET(ext_attrs.w,
  26843        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_CLASSID_BITS_8_11);
  26844     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26845             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26846             80 + (idx * gran), &ext_attrs);
  26847 
  26848     ext_num = 4;
  26849     idx = 13;
  26850     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26851     SHR_BITSET(ext_attrs.w,
  26852        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_0_3);
  26853     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26854             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26855             80 + (idx * gran), &ext_attrs);
  26856 
  26857     idx = 14;
  26858     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26859     SHR_BITSET(ext_attrs.w,
  26860        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_4_7);
  26861     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26862             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26863             80 + (idx * gran), &ext_attrs);
  26864 
  26865     idx = 15;
  26866     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26867     SHR_BITSET(ext_attrs.w,
  26868        BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_CLASSID_BITS_8_11);
  26869     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26870             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26871             80 + (idx * gran), &ext_attrs);
  26872 
  26873     ext_num = 4;
  26874     idx = 16;
  26875     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26876     SHR_BITSET(ext_attrs.w,BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  26877     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran,
  26878         (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26879         80 + (idx * gran), &ext_attrs);
  26880 
  26881 
  26882     /* Initialize Level_3 2-bit extractors section. */
  26883     level = 3;
  26884     gran = 2;
  26885     for (ext_num = 0; ext_num < 1; ext_num++) {
  26886         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26887             BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA,
  26888             148 + (ext_num * gran), attrs);
  26889     }
  26890     ext_num = 1;
  26891     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26892     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_LTID);
  26893     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num ,
  26894         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 150, &ext_attrs);
  26895 
  26896     /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */
  26897     ext_num = 0;
  26898     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26899     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB);
  26900     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 2,
  26901         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 152, &ext_attrs);
  26902     ext_num = 0;
  26903     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26904     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_FIRST_LOOKUP_HIT);
  26905     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_EM_SECOND_LOOKUP_HIT);
  26906     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 3,
  26907         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 154, &ext_attrs);
  26908 
  26909     /* Overlay with NAT_DST_REALM_ID. */
  26910     ext_num = 0;
  26911     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26912     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_DST_REALM_ID);
  26913     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 4,
  26914         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 156, &ext_attrs);
  26915 
  26916     /* Initialize Level_3 1-bit extractors section. */
  26917     level = 3;
  26918     gran = 1;
  26919     ext_num = 0;
  26920     /* Overlay with NAT_NEEDED. */
  26921     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26922     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_NAT_NEEDED);
  26923     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num,
  26924         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 158, &ext_attrs);
  26925     /* Overlay with DROP. */
  26926     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26927     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_DROP);
  26928     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, ext_num + 1,
  26929         BCMI_KEYGEN_EXT_SECTION_L3AS2, BCMI_KEYGEN_EXT_SECTION_FKA, 159, &ext_attrs);
  26930 
  26931     /* Initialize Level_3 16-bit extractors section - SLICE_B. */
  26932     level = 3;
  26933     gran = 16;
  26934     ext_num = 0;
  26935     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26936     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26937     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26938         BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 0, &ext_attrs);
  26939     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 1,
  26940         BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 20, &ext_attrs);
  26941     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26942     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26943     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  26944     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26945         BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 48, &ext_attrs);
  26946     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26947     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  26948     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  26949     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26950         BCMI_KEYGEN_EXT_SECTION_L3BS1, BCMI_KEYGEN_EXT_SECTION_FKB, 64, &ext_attrs);
  26951 
  26952     /* Initialize Level_3 4-bit extractors section. */
  26953     level = 3;
  26954     gran = 4;
  26955     ext_num = 0;
  26956     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26957         BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 16, attrs);
  26958     for (idx = 1; idx < 4; idx++) {
  26959         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran,
  26960             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB,
  26961             36 + (gran * (idx - 1)), attrs);
  26962     }
  26963     level = 3;
  26964     gran = 4;
  26965     ext_num = 4;
  26966     for (idx = 0; idx < 17; idx++) {
  26967         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran,
  26968             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB,
  26969             80 + (idx * gran), attrs);
  26970     }
  26971     /* Initialize Level_3 2-bit extractors section. */
  26972     level = 3;
  26973     gran = 2;
  26974     for (ext_num = 0; ext_num < 2; ext_num++) {
  26975         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  26976             BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB,
  26977             148 + (gran * ext_num), attrs);
  26978     }
  26979 
  26980     /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */
  26981     ext_num = 0;
  26982     sal_memset(&ext_attrs, 0, ext_attrs_size);
  26983     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB);
  26984     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 2,
  26985         BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 152, &ext_attrs);
  26986 
  26987     ext_num = 0;
  26988     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 3,
  26989         BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 154, attrs);
  26990 
  26991     ext_num = 0;
  26992     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num + 4,
  26993         BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB, 156, attrs);
  26994 
  26995     /* Initialize Level_3 1-bit extractors section. */
  26996     level = 3;
  26997     gran = 1;
  26998     for (ext_num = 0; ext_num < 2; ext_num++) {
  26999         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, ext_num,
  27000             BCMI_KEYGEN_EXT_SECTION_L3BS2, BCMI_KEYGEN_EXT_SECTION_FKB,
  27001             158 + (gran * ext_num), attrs);
  27002     }
  27003 
  27004     /* Initialize Level_3 16-bit extractors section - SLICE_C. */
  27005     level = 3;
  27006     gran = 16;
  27007     ext_num = 0;
  27008     sal_memset(&ext_attrs, 0, ext_attrs_size);
  27009     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  27010     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  27011         BCMI_KEYGEN_EXT_SECTION_L3CS1, BCMI_KEYGEN_EXT_SECTION_FKC, 0, &ext_attrs);
  27012     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 1,
  27013         BCMI_KEYGEN_EXT_SECTION_L3CS1, BCMI_KEYGEN_EXT_SECTION_FKC, 20, &ext_attrs);
  27014     sal_memset(&ext_attrs, 0, ext_attrs_size);
  27015     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  27016     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_0);
  27017     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2,
  27018         BCMI_KEYGEN_EXT_SECTION_L3CS1, BCMI_KEYGEN_EXT_SECTION_FKC, 48, &ext_attrs);
  27019     sal_memset(&ext_attrs, 0, ext_attrs_size);
  27020     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_PASS_THRU);
  27021     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_1);
  27022     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3,
  27023         BCMI_KEYGEN_EXT_SECTION_L3CS1, BCMI_KEYGEN_EXT_SECTION_FKC, 64, &ext_attrs);
  27024 
  27025     /* Initialize Level_3 4-bit extractors section. */
  27026     level = 3;
  27027     gran = 4;
  27028     ext_num = 0;
  27029     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  27030         BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 16, attrs);
  27031     for (idx = 1; idx < 4; idx++) {
  27032         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran,
  27033             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC,
  27034             36 + (gran * (idx - 1)), attrs);
  27035     }
  27036 
  27037     level = 3;
  27038     gran = 4;
  27039     ext_num = 4;
  27040     for (idx = 0; idx < 17; idx++) {
  27041         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran,
  27042             (ext_num + idx), BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC,
  27043             80 + (idx * gran), attrs);
  27044     }
  27045 
  27046     /* Initialize Level_3 2-bit extractors section. */
  27047     level = 3;
  27048     gran = 2;
  27049     for (ext_num = 0; ext_num < 2; ext_num++) {
  27050         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  27051             BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC,
  27052             148 + (gran * ext_num), attrs);
  27053     }
  27054 
  27055     /* Overlay with BCMI_KEYGEN_POST_MUX_SRC_DST_CONT_0/1. */
  27056     ext_num = 0;
  27057     sal_memset(&ext_attrs, 0, ext_attrs_size);
  27058     SHR_BITSET(ext_attrs.w, BCMI_KEYGEN_EXT_ATTR_NOT_WITH_PMUX_SRC_DST_CONT_MSB);
  27059     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 2,
  27060         BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 152, &ext_attrs);
  27061 
  27062     ext_num = 0;
  27063     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 3,
  27064         BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 154, attrs);
  27065 
  27066     ext_num = 0;
  27067     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num + 4,
  27068         BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC, 156, attrs);
  27069 
  27070 
  27071     /* Initialize Level_3 1-bit extractors section. */
  27072     level = 3;
  27073     gran = 1;
  27074     for (ext_num = 0; ext_num < 2; ext_num++) {
  27075         BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, ext_num,
  27076             BCMI_KEYGEN_EXT_SECTION_L3CS2, BCMI_KEYGEN_EXT_SECTION_FKC,
  27077             158 + (gran * ext_num), attrs);
  27078     }
  27079 
  27080     /* Initialize Level_4 extractor section. */
  27081     level = 4;
  27082     gran = 160;
  27083     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 0,
  27084         BCMI_KEYGEN_EXT_SECTION_FK, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs);
  27085     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 0, level, gran, 0,
  27086         BCMI_KEYGEN_EXT_SECTION_FKA, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs);
  27087     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 1, level, gran, 0,
  27088         BCMI_KEYGEN_EXT_SECTION_FKB, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs);
  27089     BCMI_KEYGEN_EXT_CFG_ADD(unit, ext_cfg_db, 2, level, gran, 0,
  27090         BCMI_KEYGEN_EXT_SECTION_FKC, BCMI_KEYGEN_EXT_SECTION_DISABLE, 0, attrs);
  27091 exit:
  27092     BCMI_KEYGEN_FUNC_EXIT();
  27093 }
  27094 
  27095 /*
  27096  * Function:
  27097  *    _bcm_field_th_init
  27098  * Purpose:
  27099  *    Perform initializations that are specific to BCM56960. This
  27100  *    includes initializing the FP field select bit offset tables for FPF[1-3]
  27101  *    for every stage.
  27102  * Parameters:
  27103  *    unit       - (IN) BCM device number.
  27104  *    fc         - (IN) Field Processor control structure.
  27105  *
  27106  * Returns:
  27107  *    BCM_E_PARAM - Null field control structure or stage control structure.
  27108  *    BCM_E_INTERNAL - Invalid CAP stage ID.
  27109  *    BCM_E_NONE - Success.
  27110  */
  27111 int
  27112 _bcm_field_th_init(int unit, _field_control_t *fc)
  27113 {
  27114     _field_stage_t *stage_fc; /* Pointer to Stage control structure. */
  27115 
  27116     /* Input parameters check. */
  27117     if (NULL == fc || NULL == fc->stages) {
  27118         return (BCM_E_PARAM);
  27119     }
  27120 
  27121     /* Get the stage control handle. */
  27122     stage_fc = fc->stages;
  27123 
  27124     /*
  27125      * Initialize FP hardware tables based on the device Group Oper mode
  27126      * settings.
  27127      */
  27128     switch (stage_fc->oper_mode) {
  27129         case bcmFieldGroupOperModeGlobal:
  27130             /* Legacy global mode, use DUPLICATE view to clear FP HW tables. */
  27131             while (stage_fc) {
  27132                 if (!SAL_BOOT_BCMSIM && !SAL_BOOT_QUICKTURN && !SAL_BOOT_XGSSIM) {
  27133                     /* Clear hardware table */
  27134                     BCM_IF_ERROR_RETURN(_field_th_hw_clear(unit,
  27135                         stage_fc, fc));
  27136                 }
  27137 
  27138                 /* Initialize qualifiers info. */
  27139                 BCM_IF_ERROR_RETURN(_field_th_qualifiers_init(unit, stage_fc));
  27140 
  27141                 /* Initialize stage actions information. */
  27142                 BCM_IF_ERROR_RETURN(_field_th_actions_init(unit, stage_fc));
  27143 
  27144                 /* Goto next stage */
  27145                 stage_fc = stage_fc->next;
  27146             }
  27147 
  27148             if (0 == SOC_WARM_BOOT(unit)) {
  27149                 if (!(soc_feature(unit, soc_feature_th3_style_fp))) {
  27150                     /* Enable FP meter refresh on all pipes. */
  27151                     BCM_IF_ERROR_RETURN(_field_meter_refresh_enable_set(unit, fc,
  27152                         TRUE));
  27153                 }
  27154             }
  27155             break;
  27156 
  27157         case bcmFieldGroupOperModePipeLocal:
  27158             while (stage_fc) {
  27159                 if (!SAL_BOOT_BCMSIM && !SAL_BOOT_QUICKTURN && !SAL_BOOT_XGSSIM) {
  27160                     /* Clear hardware table */
  27161                     BCM_IF_ERROR_RETURN(_field_th_pipes_hw_clear(unit,
  27162                         stage_fc, fc));
  27163                 }
  27164 
  27165                 /* Initialize qualifiers info. */
  27166                 BCM_IF_ERROR_RETURN(_field_th_qualifiers_init(unit, stage_fc));
  27167 
  27168                 /* Initialize stage actions information. */
  27169                 BCM_IF_ERROR_RETURN(_field_th_actions_init(unit, stage_fc));
  27170 
  27171                 /* Goto next stage */
  27172                 stage_fc = stage_fc->next;
  27173             }
  27174             if (0 == SOC_WARM_BOOT(unit)) {
  27175                 /* Enable FP meter refresh on all pipes. */
  27176                 if (!(soc_feature(unit, soc_feature_th3_style_fp))) {
  27177 
  27178                     BCM_IF_ERROR_RETURN(_field_th_pipes_meter_refresh_enable(
  27179                                                             unit, fc, TRUE));
  27180                 }
  27181             }
  27182             break;
  27183 
  27184         default:
  27185             break;
  27186     }
  27187 
  27188     if (0 == SOC_WARM_BOOT(unit)) {
  27189         /* Enable filter processor */
  27190         BCM_IF_ERROR_RETURN(_field_port_filter_enable_set(unit, fc, TRUE));
  27191 
  27192     }
  27193 
  27194 #if defined(BCM_TRIDENT3_SUPPORT)
  27195     if (soc_feature(unit, soc_feature_td3_style_fp)) {
  27196        /* Initialize the function pointers */
  27197        _bcm_field_td3_functions_init(&fc->functions);
  27198     } else
  27199 #endif /* BCM_TRIDENT3_SUPPORT */
  27200     {
  27201        /* Initialize the function pointers */
  27202        _bcm_field_th_functions_init(&fc->functions);
  27203     }
  27204 
  27205     /* initialize the qset comb */
  27206     BCM_IF_ERROR_RETURN(_field_th_qset_comb_init(unit, fc));
  27207 
  27208     /* Register with Counter ejection */
  27209     _bcm_th_field_counter_config_set(unit);
  27210 
  27211     stage_fc = fc->stages;
  27212     while (stage_fc) {
  27213        if ((stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) ||
  27214            (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH)) {
  27215           /* Match ID width partition for each zone */
  27216           if (fc->functions.fp_zone_match_id_partition_init != NULL) {
  27217              BCM_IF_ERROR_RETURN(fc->functions.fp_zone_match_id_partition_init
  27218                                                             (unit, stage_fc));
  27219           }
  27220        }
  27221 #ifdef BCM_FLOWTRACKER_SUPPORT
  27222        if (stage_fc->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) {
  27223             BCM_IF_ERROR_RETURN(_field_hx5_ft_tcam_policy_init(unit, stage_fc));
  27224        }
  27225 #endif
  27226        /* Goto next stage */
  27227        stage_fc = stage_fc->next;
  27228     }
  27229 
  27230     return (BCM_E_NONE);
  27231 }
  27232 
  27233 /*
  27234  * Function:
  27235  *     _field_ingress_entry_tcam_wide_install
  27236  * Purpose:
  27237  *     Set the per-pipe PBMP in the Ingress TCAM
  27238  * Parameters:
  27239  *     unit         - (IN) BCM device number
  27240  *     f_ent        - (IN) entry structure to get policy info from
  27241  *     tcam_idx     - (IN) Index in the TCAM memory.
  27242  *     _f_pbmp      - (IN) Reference to field PBMP.
  27243  *     num_pipe     - (IN) Number of Pipes the _f_pbmp has.
  27244  * Returns:
  27245  *     BCM_E_XXX
  27246  */
  27247 STATIC int
  27248 _field_ingress_entry_tcam_wide_install(int unit, _field_entry_t *f_ent,
  27249                                        int tcam_idx, uint8 set_pbmp,
  27250                                       _field_pbmp_t *_f_pbmp,
  27251                                        int num_pipe)
  27252 {
  27253     int            inst;                     /* Pipe Instance.              */
  27254     int            valid = 0;                /* Valid bit.                  */
  27255     _field_tcam_t  *tcam;
  27256     uint32         entry_buf[SOC_MAX_MEM_FIELD_WORDS] = {0};
  27257                                      /* Buffer to fill Policy & TCAM entry.*/
  27258     soc_mem_t      ifp_tcam_wide;    /* IFP TCAM memory names. */
  27259 
  27260 #if defined(BCM_TOMAHAWK2_SUPPORT)
  27261     bcm_pbmp_t     valid_pbm; /* valid_pbm in HW. */
  27262 #endif
  27263     if (f_ent == NULL || _f_pbmp == NULL) {
  27264        return BCM_E_PARAM;
  27265     }
  27266 
  27267     /* Update the valid bit based on the mode and group flags */
  27268     valid = (f_ent->group->flags & _FP_GROUP_LOOKUP_ENABLED) ? 3 : 0;
  27269 
  27270     tcam = &f_ent->tcam;
  27271     for (inst = 0; inst < num_pipe; inst++) {
  27272       if (!SOC_IS_TOMAHAWK3(unit)) {
  27273           BCM_IF_ERROR_RETURN(
  27274               _bcm_field_mem_instance_get(unit,
  27275                                           IFP_TCAM_WIDEm,
  27276                                           inst,
  27277                                           &ifp_tcam_wide));
  27278       } else {
  27279           BCM_IF_ERROR_RETURN(
  27280               _bcm_field_mem_instance_get(unit,
  27281                                           IFP_TCAMm,
  27282                                           inst,
  27283                                           &ifp_tcam_wide));
  27284       }
  27285       sal_memset(entry_buf, 0x0, sizeof(entry_buf));
  27286       soc_mem_field_set(unit, ifp_tcam_wide, entry_buf, KEYf, tcam->key);
  27287       soc_mem_field_set(unit, ifp_tcam_wide, entry_buf, MASKf, tcam->mask);
  27288       if (set_pbmp == 1) {
  27289 #if defined(BCM_TOMAHAWK2_SUPPORT)
  27290           if (soc_feature(unit, soc_feature_xy_tcam_x0y)) {
  27291               BCM_PBMP_CLEAR(valid_pbm);
  27292               soc_mem_field_set(unit, ifp_tcam_wide, entry_buf,
  27293                                IPBMf, (uint32 *)&valid_pbm);
  27294               BCM_PBMP_ASSIGN(valid_pbm, _f_pbmp[inst].data);
  27295               BCM_PBMP_AND(valid_pbm, _f_pbmp[inst].mask);
  27296               BCM_PBMP_XOR(valid_pbm, _f_pbmp[inst].mask);
  27297               soc_mem_field_width_fit_set(unit, ifp_tcam_wide, entry_buf,
  27298                                IPBM_MASKf, (uint32 *)&valid_pbm);
  27299           } else
  27300 #endif /* BCM_TOMAHAWK2_SUPPORT */
  27301           {
  27302               soc_mem_field_set(unit, ifp_tcam_wide, entry_buf,
  27303                                IPBMf, (uint32 *)&_f_pbmp[inst].data);
  27304               soc_mem_field_width_fit_set(unit, ifp_tcam_wide, entry_buf,
  27305                                IPBM_MASKf, (uint32 *)&_f_pbmp[inst].mask);
  27306           }
  27307       }
  27308       soc_mem_field32_set(unit, ifp_tcam_wide, entry_buf, VALIDf, valid);
  27309       BCM_IF_ERROR_RETURN(soc_th_ifp_mem_write(unit,
  27310                                         ifp_tcam_wide,
  27311                                         MEM_BLOCK_ALL,
  27312                                         tcam_idx,
  27313                                         entry_buf));
  27314     }
  27315 
  27316     return BCM_E_NONE;
  27317 }
  27318 
  27319 /*
  27320  * Function:
  27321  *     _field_fp_tcam_ipbmp_size
  27322  * Purpose:
  27323  *     Retrieve the per-pipe PBMP size for a chip.
  27324  * Parameters:
  27325  *     unit          - (IN)  BCM device number
  27326  * Returns:
  27327  *     pbmp_size
  27328  */
  27329 
  27330 int
  27331 _field_fp_tcam_ipbmp_size(int unit) {
  27332 
  27333 #ifdef BCM_TOMAHAWK3_SUPPORT
  27334     if (SOC_IS_TOMAHAWK3(unit)) {
  27335         return soc_mem_field_length(unit, IFP_TCAMm, IPBMf);
  27336     } else
  27337 #endif
  27338     {
  27339         return soc_mem_field_length(unit, IFP_TCAM_WIDEm, IPBMf);;
  27340     }
  27341 }
  27342 
  27343 /*
  27344  * Function:
  27345  *     _field_ingress_pipe_pbmp_get
  27346  * Purpose:
  27347  *     Retrieve the per-pipe PBMP from the given pbmp
  27348  * Parameters:
  27349  *     unit          - (IN)  BCM device number
  27350  *     qset          - (IN)  Qualifier QSET
  27351  *     pbmp          - (IN)  Input PBMP, contains all pipes pbmp.
  27352  *     pipe_pbmp     - (OUT) Reference to per-pipe PBMP.
  27353  *     pipe_pbmp_len - (IN)  Number of elements in pipe_pbmp array.
  27354  * Returns:
  27355  *     BCM_E_XXX
  27356  */
  27357 STATIC int
  27358 _field_ingress_pipe_pbmp_get(int              unit,
  27359                              bcm_field_qset_t qset,
  27360                              _field_pbmp_t    *pbmp,
  27361                              _field_pbmp_t    *pipe_pbmp,
  27362                              int              pipe_pbmp_len)
  27363 {
  27364    int      inst;       /* Pipe Instance */
  27365    int      port;       /* Input Port */
  27366    int      pipe_port;  /* Pipe Port */
  27367    int      pipe_ports_max; /* Max ports per pipe. */
  27368 
  27369    /* NULL parameter checks. */
  27370    if (pbmp == NULL || NULL == pipe_pbmp) {
  27371       return BCM_E_PARAM;
  27372    }
  27373 
  27374    /* Update the pipe PBMP for PortBitmap Qualifiers. */
  27375    if (!BCM_FIELD_QSET_TEST(qset, bcmFieldQualifyInPorts)) {
  27376       int  base_port;   /* Instance Base port. */
  27377       int  max_port;    /* Instance Max Port. */
  27378 
  27379       for (inst = 0; inst < pipe_pbmp_len; inst++) {
  27380          base_port = (inst * _FP_TCAM_IPBMP_SIZE(unit));
  27381          max_port = ((inst + 1) * _FP_TCAM_IPBMP_SIZE(unit));
  27382          for (port = base_port; port < max_port; port++) {
  27383             /* Update data. */
  27384             if (BCM_PBMP_MEMBER(pbmp->data, port)) {
  27385                pipe_port = port - base_port;
  27386                BCM_PBMP_PORT_ADD(pipe_pbmp[inst].data, pipe_port);
  27387             }
  27388             /* Update mask. */
  27389             if (BCM_PBMP_MEMBER(pbmp->mask, port)) {
  27390                pipe_port = port - base_port;
  27391                BCM_PBMP_PORT_ADD(pipe_pbmp[inst].mask, pipe_port);
  27392             }
  27393          }
  27394       }
  27395       return BCM_E_NONE;
  27396    }
  27397 
  27398 #if defined(BCM_TRIDENT3_SUPPORT)
  27399    if (soc_feature(unit, soc_feature_td3_style_fp)) {
  27400        pipe_ports_max = _BCM_TD3_NUM_PIPE_PORTS;
  27401    } else
  27402 #endif /* BCM_TRIDENT3_SUPPORT */
  27403 #if defined(BCM_TOMAHAWK2_SUPPORT)
  27404    if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) {
  27405        pipe_ports_max = _TH2_DEV_PORTS_PER_PIPE;
  27406    } else
  27407 #endif /* BCM_TOMAHAWK2_SUPPORT */
  27408 #if defined(BCM_TOMAHAWK3_SUPPORT)
  27409    if (soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) {
  27410        pipe_ports_max = _TH3_DEV_PORTS_PER_PIPE;
  27411    } else
  27412 #endif /* BCM_TOMAHAWK3_SUPPORT */
  27413    {
  27414        pipe_ports_max = _TH_DEV_PORTS_PER_PIPE;
  27415    }
  27416 
  27417    /* Update the Output Data Pipe Pbmp based on the input pbmp */
  27418    BCM_PBMP_ITER(pbmp->data, port) {
  27419        SOC_IF_ERROR_RETURN(soc_port_pipe_get(unit, port, &inst));
  27420        if (inst >= pipe_pbmp_len) {
  27421            return BCM_E_INTERNAL;
  27422        }
  27423 
  27424        /* per_pipe pbmp does not have cpu port but all pbmp has cpu port. */
  27425        if (inst == 0 && port == 0) {
  27426            BCM_PBMP_PORT_ADD(pipe_pbmp[inst].data, port);
  27427        } else if (BCM_PBMP_MEMBER(PBMP_PIPE(unit, inst), port)) {
  27428            pipe_port = port - (inst * pipe_ports_max);
  27429            BCM_PBMP_PORT_ADD(pipe_pbmp[inst].data, pipe_port);
  27430        } else {
  27431            LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("Invalid port[%d] \n\r"), port));
  27432            return BCM_E_PARAM;
  27433        }
  27434    }
  27435 
  27436    /* Update the Output Mask Pipe Pbmp based on the input pbmp */
  27437    BCM_PBMP_ITER(pbmp->mask, port) {
  27438        SOC_IF_ERROR_RETURN(soc_port_pipe_get(unit, port, &inst));
  27439        if (inst >= pipe_pbmp_len) {
  27440            return BCM_E_INTERNAL;
  27441        }
  27442 
  27443        /* per_pipe pbmp does not have cpu port but all pbmp has cpu port. */
  27444        if (inst == 0 && port == 0) {
  27445            BCM_PBMP_PORT_ADD(pipe_pbmp[inst].mask, port);
  27446        } else if (BCM_PBMP_MEMBER(PBMP_PIPE(unit, inst), port) ||
  27447                IS_LB_PORT(unit, port)) {
  27448            pipe_port = port - (inst * pipe_ports_max);
  27449            BCM_PBMP_PORT_ADD(pipe_pbmp[inst].mask, pipe_port);
  27450            LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META("Adding Port[%d] to Mask"
  27451                      " .. pipe_port:%d on inst:%d\n\r"),
  27452                      port, pipe_port, inst));
  27453        } else {
  27454            LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("Invalid mask[%d] \n\r"), port));
  27455            return BCM_E_PARAM;
  27456        }
  27457    }
  27458 
  27459    return BCM_E_NONE;
  27460 }
  27461 
  27462 /*
  27463  * Function:
  27464  *     _field_th_ingress_entry_qual_tcam_install
  27465  * Purpose:
  27466  *     Install the entry qualifiers in the Ingress TCAM.
  27467  * Parameters:
  27468  *     unit         - (IN) BCM device number
  27469  *     f_ent        - (IN) entry structure to get policy info from
  27470  *     tcam_mem     - (IN) TCAM memory index.
  27471  *     tcam_idx     - (IN) Index in the TCAM memory.
  27472  * Returns:
  27473  *     BCM_E_XXX
  27474  */
  27475 
  27476 STATIC int
  27477 _field_th_ingress_entry_qual_tcam_install(int unit, _field_entry_t *f_ent,
  27478                                           soc_mem_t tcam_mem, int tcam_idx)
  27479 {
  27480     uint32         entry_buf[SOC_MAX_MEM_FIELD_WORDS] = {0};
  27481                               /* Buffer to fill Policy & TCAM entry.*/
  27482     _field_stage_t *stage_fc; /* Reference to Stage control structure. */
  27483     _field_tcam_t  *tcam;
  27484     _field_group_t *fg;
  27485     int            rv;
  27486     int            stage_id;
  27487     uint32         valid;
  27488     uint8          mode;
  27489 
  27490     /* Input parameters check. */
  27491     if (NULL == f_ent) {
  27492         return (BCM_E_PARAM);
  27493     }
  27494 
  27495     tcam = &f_ent->tcam;
  27496     fg = f_ent->group;
  27497     if (tcam == NULL || fg == NULL) {
  27498        return BCM_E_INTERNAL;
  27499     }
  27500 
  27501     stage_id = f_ent->group->stage_id;
  27502     BCM_IF_ERROR_RETURN
  27503        (_field_stage_control_get(unit, stage_id, &stage_fc));
  27504 
  27505     /* Determine the slice mode based on group flags. */
  27506     mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(fg->flags) ?
  27507          _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW;
  27508 
  27509     /* Update the valid bit based on the mode and group flags */
  27510     valid = (fg->flags & _FP_GROUP_LOOKUP_ENABLED) ?
  27511            ((mode == _IFP_SLICE_MODE_WIDE) ? 3 : 1) : 0;
  27512 
  27513     /*
  27514      * When the TCAM Mode is Wide on a global view,
  27515      * Install the entry on the Pipes to support the PBMP.
  27516      */
  27517     if ((mode == _IFP_SLICE_MODE_WIDE) &&
  27518         (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) &&
  27519         (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) {
  27520         uint8 set_pbmp = 0;
  27521         _field_pbmp_t   pipe_pbmp[_FP_MAX_NUM_PIPES];
  27522 
  27523         if (_BCM_FIELD_QSET_PBMP_TEST(f_ent->group->qset)) {
  27524            _field_entry_t  *entry_p = NULL;
  27525 
  27526            rv = _field_entry_get(unit, f_ent->eid, _FP_ENTRY_PRIMARY, &entry_p);
  27527            BCM_IF_ERROR_RETURN(rv);
  27528 
  27529            /* If entry is the primary part, set the pbmp. */
  27530            if (entry_p == f_ent) {
  27531               set_pbmp = 1;
  27532            }
  27533 
  27534            if ((set_pbmp == 1) ||
  27535                ((soc_feature(unit, soc_feature_td3_style_fp) &&
  27536                  BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyInPorts)))) {
  27537               sal_memset(&pipe_pbmp, 0x0,
  27538                       sizeof(_field_pbmp_t) * _FP_MAX_NUM_PIPES);
  27539               rv = _field_ingress_pipe_pbmp_get(unit, f_ent->group->qset,
  27540                                                 &entry_p->pbmp,
  27541                                                 pipe_pbmp, stage_fc->num_pipes);
  27542               if (BCM_FAILURE(rv)) {
  27543                  LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("Failed to retrieve Pipe PBMP,"
  27544                  " Failed to write PBMP on IFP_TCAM Pipes.\n\r")));
  27545                  return BCM_E_INTERNAL;
  27546               }
  27547            }
  27548         }
  27549 
  27550 #if defined(BCM_TRIDENT3_SUPPORT)
  27551         if (soc_feature(unit, soc_feature_td3_style_fp) &&
  27552             BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyInPorts)) {
  27553            rv = _bcm_field_td3_ifp_inports_entry_tcam_install(unit, f_ent, tcam_idx,
  27554                                                               set_pbmp, pipe_pbmp,
  27555                                                               stage_fc->num_pipes);
  27556         } else
  27557 #endif /* BCM_TRIDENT3_SUPPORT */
  27558         {
  27559            rv = _field_ingress_entry_tcam_wide_install(unit, f_ent, tcam_idx,
  27560                                                        set_pbmp, pipe_pbmp,
  27561                                                        stage_fc->num_pipes);
  27562         }
  27563 
  27564         if (BCM_FAILURE(rv)) {
  27565              LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  27566                    " Failed to write PBMP on IFP_TCAM Pipes.\n\r")));
  27567              return BCM_E_INTERNAL;
  27568         }
  27569 
  27570         return (BCM_E_NONE);
  27571     }
  27572 
  27573     BCM_IF_ERROR_RETURN(soc_th_ifp_mem_read(unit,
  27574                                      tcam_mem,
  27575                                      MEM_BLOCK_ANY,
  27576                                      tcam_idx,
  27577                                      entry_buf));
  27578     soc_mem_field_set(unit, tcam_mem, entry_buf, KEYf, tcam->key);
  27579     soc_mem_field_set(unit, tcam_mem, entry_buf, MASKf, tcam->mask);
  27580 
  27581     soc_mem_field32_set(unit, tcam_mem, entry_buf, VALIDf, valid);
  27582 #if defined(BCM_TOMAHAWK2_SUPPORT)
  27583     if (soc_feature(unit, soc_feature_xy_tcam_x0y) &&
  27584         (soc_feature(unit, soc_feature_field_multi_pipe_enhanced) ||
  27585          soc_feature(unit, soc_feature_th3_style_fp)) &&
  27586         _BCM_FIELD_QSET_PBMP_TEST(f_ent->group->qset)) {
  27587         bcm_pbmp_t      valid_pbm; /* valid_pbm in HW. */
  27588         _field_entry_t  *entry_p = NULL;
  27589 
  27590         BCM_IF_ERROR_RETURN
  27591             (_field_entry_get(unit, f_ent->eid, _FP_ENTRY_PRIMARY, &entry_p));
  27592         /* If entry is the primary part, set the pbmp. */
  27593         if (entry_p == f_ent) {
  27594             BCM_PBMP_CLEAR(valid_pbm);
  27595             soc_mem_field_width_fit_set(unit, tcam_mem, entry_buf, IPBMf,
  27596                                         (uint32 *)&valid_pbm);
  27597             BCM_PBMP_ASSIGN(valid_pbm, f_ent->pbmp.data);
  27598             BCM_PBMP_AND(valid_pbm, f_ent->pbmp.mask);
  27599             BCM_PBMP_XOR(valid_pbm, f_ent->pbmp.mask);
  27600             soc_mem_field_width_fit_set(unit, tcam_mem, entry_buf, IPBM_MASKf,
  27601                                         (uint32 *)&valid_pbm);
  27602         }
  27603    }
  27604 #endif /* BCM_TOMAHAWK2_SUPPORT */
  27605     BCM_IF_ERROR_RETURN(soc_th_ifp_mem_write(unit,
  27606                                       tcam_mem,
  27607                                       MEM_BLOCK_ALL,
  27608                                       tcam_idx,
  27609                                       entry_buf));
  27610    return (BCM_E_NONE);
  27611 }
  27612 
  27613 /*
  27614  * Function:
  27615  *     _field_th_vfp_efp_entry_qual_tcam_install
  27616  * Purpose:
  27617  *     Install the entry qualifiers in the VFP or EFP TCAM.
  27618  * Parameters:
  27619  *     unit         - (IN) BCM device number
  27620  *     f_ent        - (IN) entry structure to get policy info from
  27621  *     tcam_mem     - (IN) TCAM memory index.
  27622  *     tcam_idx     - (IN) Index in the TCAM memory.
  27623  * Returns:
  27624  *     BCM_E_XXX
  27625  */
  27626 
  27627 STATIC int
  27628 _field_th_vfp_efp_entry_qual_tcam_install(int unit, _field_entry_t *f_ent,
  27629                                           soc_mem_t tcam_mem, int tcam_idx)
  27630 {
  27631     uint32          entry_buf[SOC_MAX_MEM_FIELD_WORDS] = {0};
  27632                               /* Buffer to fill Policy & TCAM entry.*/
  27633     uint8           valid = 0;
  27634     soc_field_t     mask_field;
  27635     _field_tcam_t   *tcam = NULL;
  27636     uint8           hw_enable = 0, hw_disable = 0;
  27637 
  27638 
  27639     /* Input parameters check. */
  27640     if (NULL == f_ent) {
  27641         return (BCM_E_PARAM);
  27642     }
  27643 
  27644     /* Update TCAM and Mask field as per the stage. */
  27645     switch (f_ent->group->stage_id) {
  27646         case _BCM_FIELD_STAGE_LOOKUP:
  27647             tcam = &f_ent->tcam;
  27648             mask_field = MASKf;
  27649             break;
  27650         case _BCM_FIELD_STAGE_EGRESS:
  27651             tcam = (f_ent->efp_key_match_type) ?
  27652                    &f_ent->key_match_tcam : &f_ent->tcam;
  27653             mask_field = KEY_MASKf;
  27654             break;
  27655         default:
  27656             return (BCM_E_INTERNAL);
  27657     }
  27658 
  27659     if (tcam == NULL) {
  27660        return BCM_E_INTERNAL;
  27661     }
  27662 
  27663     if ((soc_feature(unit, soc_feature_field_multi_pipe_enhanced) ||
  27664         soc_feature(unit, soc_feature_td3_style_fp)) &&
  27665         (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP)) {
  27666         /* VALIDf in VFP_TCAM on TH2 only has one bit */
  27667         hw_enable = 1;
  27668         hw_disable = 0;
  27669     } else if ((SOC_IS_TOMAHAWK3(unit)) &&
  27670         ((f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS) ||
  27671         (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP))) {
  27672         /* VALIDf in EFP_TCAM on TH3 only has one bit */
  27673         hw_enable = 1;
  27674         hw_disable = 0;
  27675     } else {
  27676         hw_enable = 3;
  27677         hw_disable = 2;
  27678     }
  27679 
  27680     valid = (f_ent->group->flags & _FP_GROUP_LOOKUP_ENABLED)
  27681              ? hw_enable:hw_disable;
  27682 
  27683     soc_mem_field_set(unit, tcam_mem, entry_buf, KEYf, tcam->key);
  27684     soc_mem_field_set(unit, tcam_mem, entry_buf, mask_field, tcam->mask);
  27685 
  27686     soc_mem_field32_set(unit, tcam_mem, entry_buf, VALIDf, valid);
  27687 
  27688     BCM_IF_ERROR_RETURN(soc_th_ifp_mem_write(unit, tcam_mem, MEM_BLOCK_ALL,
  27689                                       tcam_idx, entry_buf));
  27690     return (BCM_E_NONE);
  27691 }
  27692 
  27693 
  27694 /*
  27695  * Function:
  27696  *     _bcm_field_th_tcam_policy_mem_get
  27697  *
  27698  * Purpose:
  27699  *     Get tcam & policy memories for a specific chip pipeline stage.
  27700  *
  27701  * Parameters:
  27702  *     unit       -  (IN)  BCM device number.
  27703  *     f_ent     -   (IN)  Field entry.
  27704  *     tcam_mem   -  (OUT) TCAM Memory id.
  27705  *     policy_mem -  (OUT) Policy memory id.
  27706  *
  27707  * Returns:
  27708  *     BCM_E_XXX
  27709  */
  27710 int
  27711 _bcm_field_th_tcam_policy_mem_get(int unit,
  27712                                   _field_entry_t *f_ent,
  27713                                   soc_mem_t *tcam_mem,
  27714                                   soc_mem_t *policy_mem)
  27715 {
  27716     int   mode = 0;     /* IFP_TCAM mode */
  27717     int   instance; /* Pipe Instance */
  27718     soc_mem_t  vfp_tcam;
  27719     soc_mem_t  vfp_policy_table;
  27720     soc_mem_t  efp_tcam;
  27721     soc_mem_t  efp_policy_table;
  27722     soc_mem_t  ifp_tcam_wide;
  27723     soc_mem_t  ifp_tcam_narrow;
  27724     soc_mem_t  ifp_policy_table_wide;
  27725     soc_mem_t  ifp_policy_table;
  27726     soc_mem_t  em_uft_wide;
  27727     soc_mem_t  em_uft_narrow;
  27728 
  27729     _field_stage_t *stage_fc; /* Reference to Stage control structure. */
  27730 
  27731     /* Input parameters check. */
  27732     if ((NULL == f_ent) || (NULL == tcam_mem) || (NULL == policy_mem)) {
  27733         return (BCM_E_PARAM);
  27734     }
  27735 
  27736     if (NULL == f_ent->group) {
  27737         return (BCM_E_INTERNAL);
  27738     }
  27739 
  27740     BCM_IF_ERROR_RETURN
  27741       (_field_stage_control_get (unit, f_ent->group->stage_id, &stage_fc));
  27742 
  27743     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  27744        instance = _FP_GLOBAL_INST;
  27745     } else {
  27746        instance = f_ent->group->instance;
  27747     }
  27748 
  27749     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, VFP_TCAMm,
  27750                                                        instance, &vfp_tcam));
  27751     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, VFP_POLICY_TABLEm,
  27752                                                   instance, &vfp_policy_table));
  27753     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, EFP_TCAMm,
  27754                                                        instance, &efp_tcam));
  27755     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, EFP_POLICY_TABLEm,
  27756                                                   instance, &efp_policy_table));
  27757     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  27758                                            IFP_TCAM_WIDEm,
  27759                                            instance,
  27760                                            &ifp_tcam_wide));
  27761     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  27762                                            IFP_TCAMm,
  27763                                            instance,
  27764                                            &ifp_tcam_narrow));
  27765     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  27766                                            IFP_POLICY_TABLEm,
  27767                                            instance,
  27768                                            &ifp_policy_table));
  27769     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  27770                                            IFP_POLICY_TABLE_WIDEm,
  27771                                            instance,
  27772                                            &ifp_policy_table_wide));
  27773 
  27774     switch (f_ent->group->stage_id) {
  27775        case _BCM_FIELD_STAGE_INGRESS:
  27776             if (soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) {
  27777                 *tcam_mem = ifp_tcam_narrow;
  27778             } else {
  27779                 mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(f_ent->group->flags)?
  27780                        _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW;
  27781                 *tcam_mem = (mode == _IFP_SLICE_MODE_WIDE) ?
  27782                                 ifp_tcam_wide:ifp_tcam_narrow;
  27783             }
  27784 
  27785             if(soc_feature(unit, soc_feature_ifp_action_profiling)) {
  27786                 *policy_mem = (mode == _IFP_SLICE_MODE_WIDE) ?
  27787                  ifp_policy_table_wide : ifp_policy_table;
  27788             } else {
  27789                 *policy_mem = ifp_policy_table;
  27790             }
  27791             break;
  27792 
  27793        case _BCM_FIELD_STAGE_LOOKUP:
  27794             *tcam_mem = vfp_tcam;
  27795             *policy_mem = vfp_policy_table;
  27796             break;
  27797 
  27798        case _BCM_FIELD_STAGE_EGRESS:
  27799             *tcam_mem = efp_tcam;
  27800             *policy_mem = efp_policy_table;
  27801             break;
  27802        case _BCM_FIELD_STAGE_EXACTMATCH:
  27803             mode = (f_ent->group->flags & _FP_GROUP_SPAN_DOUBLE_SLICE) ?
  27804                 _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW;
  27805             BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  27806                                                        EXACT_MATCH_2m,
  27807                                                        instance,
  27808                                                        &em_uft_narrow));
  27809             BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  27810                                                        EXACT_MATCH_4m,
  27811                                                        instance,
  27812                                                        &em_uft_wide));
  27813             *tcam_mem = (mode == _IFP_SLICE_MODE_WIDE) ?
  27814                         em_uft_wide : em_uft_narrow;
  27815             *policy_mem = *tcam_mem;
  27816             break;
  27817 #if defined(BCM_FLOWTRACKER_SUPPORT)
  27818         case _BCM_FIELD_STAGE_FLOWTRACKER:
  27819             if (soc_feature(unit, soc_feature_field_flowtracker_support)) {
  27820                 *tcam_mem = BSK_FTFP_TCAMm;
  27821                 *policy_mem = BSK_FTFP_POLICYm;
  27822             } else {
  27823                 *tcam_mem = INVALIDm;
  27824                 *policy_mem = INVALIDm;
  27825             }
  27826             break;
  27827 #endif
  27828        default:
  27829             *tcam_mem = *policy_mem = INVALIDm;
  27830             return BCM_E_PARAM;
  27831     }
  27832 
  27833     return (BCM_E_NONE);
  27834 }
  27835 
  27836 /*
  27837  * Function:
  27838  *     _field_th_default_policer_set
  27839  *
  27840  * Purpose:
  27841  *     Get metering portion of Policy Table.
  27842  *
  27843  * Parameters:
  27844  *     unit      - (IN)BCM device number.
  27845  *     stage_fc  - (IN)Stage control structure.
  27846  *     level     - (IN)Policer level.
  27847  *     f_ent     - (IN)Software entry structure to get tcam info from.
  27848  *     buf       - (IN/OUT)Hardware policy entry
  27849  *
  27850  * Returns:
  27851  *     BCM_E_NONE  - Success
  27852  */
  27853 
  27854 STATIC int
  27855 _field_th_default_policer_set(int unit, _field_stage_t *stage_fc,
  27856                                int level, _field_entry_t *f_ent, uint32 *buf)
  27857 {
  27858     _bcm_field_action_offset_t  meter_info_offset; /* Meter Set for basic Meter info. */
  27859     soc_format_t                fmt = IFP_METER_SETfmt;
  27860     soc_field_info_t            *fld_info = NULL;
  27861     int                         meter_base = 0;
  27862 
  27863     /* Input parameter check. */
  27864     if ((NULL == stage_fc) || (NULL == buf) || (NULL == f_ent))  {
  27865         return (BCM_E_PARAM);
  27866     }
  27867 
  27868     sal_memset(&meter_info_offset, 0x0, sizeof(meter_info_offset));
  27869     /*
  27870      * For the legacy devices which doesn't support PDD format for IFP,
  27871      * base offset for IFP_METER_SET will be non zero and part of IFP_POLICY_TABLE.
  27872      */
  27873     if ((_BCM_FIELD_STAGE_INGRESS == f_ent->group->stage_id)
  27874         && (0 == soc_feature(unit, soc_feature_ifp_action_profiling))) {
  27875         fld_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, METER_SETf);
  27876         meter_base = fld_info->bp;
  27877     } else {
  27878         meter_base = 0;
  27879     }
  27880 
  27881     /*
  27882      * Get each meter field offset and width in format IFP_METE_SETfmt
  27883      * and update respective meter_info_offset.
  27884      */
  27885     /* METER_PAIR_MODE */
  27886     fld_info = NULL;
  27887     fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_MODEf);
  27888     if (NULL == fld_info) {
  27889         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  27890                         "IFP policer set failed for field %d\n\r"),
  27891                     METER_PAIR_MODEf));
  27892         return BCM_E_INTERNAL;
  27893     }
  27894     meter_info_offset.offset[1] = meter_base + fld_info->bp;
  27895     meter_info_offset.width[1]  = fld_info->len;
  27896     /* DEFAULT meter pair mode is enabled */
  27897     meter_info_offset.value[1]  = 0;
  27898 
  27899     fld_info = NULL;
  27900     fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_MODE_MODIFIERf);
  27901     if (NULL == fld_info) {
  27902         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  27903                         "IFP policer set failed for field %d\n\r"),
  27904                     METER_PAIR_MODE_MODIFIERf));
  27905         return BCM_E_INTERNAL;
  27906     }
  27907     /* METER_PAIR_MODE_MODIFIER */
  27908     meter_info_offset.offset[2] = meter_base + fld_info->bp;
  27909     meter_info_offset.width[2]  = fld_info->len;
  27910     /* Enable packet color modifier */
  27911     meter_info_offset.value[2]  = 1;
  27912 
  27913     ACTION_SET(unit, f_ent, buf, &meter_info_offset);
  27914 
  27915     return (BCM_E_NONE);
  27916 }
  27917 
  27918 /*
  27919  * Function:
  27920  *     _field_th_ingress_policer_action_set
  27921  *
  27922  * Purpose:
  27923  *     Get metering portion of Policy Table.
  27924  *
  27925  * Parameters:
  27926  *     unit      - (IN)BCM device number.
  27927  *     f_ent     - (IN)Software entry structure to get tcam info from.
  27928  *     buf       - (IN/OUT)Hardware policy entry
  27929  *
  27930  * Returns:
  27931  *     BCM_E_NONE  - Success
  27932  */
  27933 int
  27934 _field_th_ingress_policer_action_set(int unit, _field_entry_t *f_ent,
  27935                                      uint32 *buf)
  27936 {
  27937     _field_entry_policer_t      *f_ent_pl;  /* Field entry policer descriptor.*/
  27938     _field_stage_t              *stage_fc;  /* Stage field control structure. */
  27939     _field_policer_t            *f_pl;      /* Field policer descriptor.      */
  27940     int                         idx;        /* Policers levels iterator.      */
  27941     uint32                      meter_pair_mode = BCM_FIELD_METER_MODE_DEFAULT;
  27942     /* Hw meter usage bits.      */
  27943     soc_format_t                fmt = IFP_METER_SETfmt;
  27944     uint8                       meter_type = 0xff;
  27945     soc_field_info_t            *fld_info = NULL;
  27946     int                         meter_pair_idx;  /* Meter pair index.         */
  27947     int                         rv;              /* Operation return status.  */
  27948     _bcm_field_action_offset_t  meter_offset;    /* Meter Set for ODD_EVEN    */
  27949     _bcm_field_action_offset_t  meter_info_offset;/* Meter Set for basic info */
  27950     int                         instance;    /*  Current Pipe instance        */
  27951     int                         meter_base = 0;    /* Meter base value */
  27952     _field_stage_id_t      stage_id;  /* Stage id used for metering.          */
  27953 
  27954     /* Input parameter check. */
  27955     if ((NULL == f_ent) || (NULL == buf))  {
  27956         return (BCM_E_PARAM);
  27957     }
  27958     if (NULL == f_ent->group) {
  27959         return (BCM_E_PARAM);
  27960     }
  27961 
  27962     stage_id = (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id) ? \
  27963                _BCM_FIELD_STAGE_INGRESS : f_ent->group->stage_id;
  27964 
  27965     /*
  27966      * For the legacy devices which doesn't support PDD format for IFP,
  27967      * base offset for IFP_METER_SET will be non zero and part of IFP_POLICY_TABLE.
  27968      */
  27969     if (0 == soc_feature(unit, soc_feature_ifp_action_profiling)) {
  27970         fld_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, METER_SETf);
  27971         meter_base = fld_info->bp;
  27972     }
  27973 
  27974     /* Get stage control structure. */
  27975     rv = _field_stage_control_get(unit, stage_id, &stage_fc);
  27976     BCM_IF_ERROR_RETURN(rv);
  27977 
  27978     /* Get the current pipe instance from group */
  27979     instance = f_ent->group->instance;
  27980 
  27981     for (idx = 0; idx < _FP_POLICER_LEVEL_COUNT; idx++) {
  27982         f_ent_pl = f_ent->policer + idx;
  27983 
  27984         if ((idx > 0)) {
  27985             /* Trident device does not support Level1 policers */
  27986             break;
  27987         }
  27988 
  27989         if (0 == (f_ent_pl->flags & _FP_POLICER_INSTALLED)) {
  27990             /* Install preserve the color policer. */
  27991             rv = _field_th_default_policer_set(unit, stage_fc, idx,
  27992                     f_ent, buf);
  27993             BCM_IF_ERROR_RETURN(rv);
  27994             continue;
  27995         }
  27996 
  27997         /* Get policer config. */
  27998         rv = _bcm_field_policer_get(unit, f_ent_pl->pid, &f_pl);
  27999         BCM_IF_ERROR_RETURN(rv);
  28000 
  28001         if (0 == f_pl->level) {
  28002             /* Get hw encoding for meter mode. */
  28003             rv = _bcm_field_meter_pair_mode_get(unit, f_pl, &meter_pair_mode);
  28004             BCM_IF_ERROR_RETURN(rv);
  28005             /* If level 0 policer is Modified trTcm ->
  28006              * meter sharing mode is dual.
  28007              */
  28008         }
  28009 
  28010 
  28011         /* Pair index is (Pool number * Pairs in Pool + Pair number) */
  28012         meter_pair_idx
  28013             = (f_pl->pool_index
  28014                     * (stage_fc->meter_pool[instance][f_pl->pool_index]->num_meter_pairs))
  28015             + (f_pl->hw_index);
  28016 
  28017         sal_memset(&meter_info_offset, 0x0, sizeof(meter_info_offset));
  28018         sal_memset(&meter_offset, 0x0, sizeof(meter_offset));
  28019 
  28020         /*
  28021          * Get each meter field offset and width in format IFP_METE_SETfmt
  28022          * and update respective meter_info_offset.
  28023          */
  28024         fld_info = NULL;
  28025         fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_INDEXf);
  28026         if (NULL == fld_info) {
  28027             LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28028                             "IFP policer set failed for field %d\n\r"),
  28029                         METER_PAIR_INDEXf));
  28030             return BCM_E_INTERNAL;
  28031         }
  28032         /* METER_PAIR_INDEX */
  28033         meter_info_offset.offset[0] = meter_base + fld_info->bp;
  28034         meter_info_offset.width[0]  = fld_info->len;
  28035         /* Program meter pair index */
  28036         meter_info_offset.value[0]  = meter_pair_idx;
  28037 
  28038         fld_info = NULL;
  28039         fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_MODEf);
  28040         if (NULL == fld_info) {
  28041             LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28042                             "IFP policer set failed for field %d\n\r"),
  28043                         METER_PAIR_MODEf));
  28044             return BCM_E_INTERNAL;
  28045         }
  28046         /* METER_PAIR_MODE */
  28047         meter_info_offset.offset[1] = meter_base + fld_info->bp;
  28048         meter_info_offset.width[1]  = fld_info->len;
  28049         /* H/W encoding of meter pair mode based on policer level */
  28050         meter_info_offset.value[1]  = meter_pair_mode;
  28051 
  28052         /*
  28053          * Flow mode is the only one that cares about the test and
  28054          * update bits.
  28055          */
  28056         if (_FP_POLICER_EXCESS_HW_METER(f_pl)) {
  28057             /* Excess meter - even index. */
  28058             meter_type = _FIELD_METER_TYPE_EVEN;
  28059         } else if (_FP_POLICER_COMMITTED_HW_METER(f_pl)) {
  28060             /* Committed meter - odd index. */
  28061             meter_type = _FIELD_METER_TYPE_ODD;
  28062         } else {
  28063             meter_type = 0xff;
  28064         }
  28065 
  28066         if (0xff != meter_type) {
  28067             fld_info = NULL;
  28068             fld_info = soc_format_fieldinfo_get(unit, fmt, METER_TEST_ODDf);
  28069             if (NULL == fld_info) {
  28070                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28071                                 "IFP policer set failed for field %d\n\r"),
  28072                             METER_TEST_ODDf));
  28073                 return BCM_E_INTERNAL;
  28074             }
  28075             /* METER_TEST_ODD */
  28076             meter_offset.offset[0] = meter_base + fld_info->bp;
  28077             meter_offset.width[0]  = fld_info->len;
  28078             /* Enable only for Odd idx or Committed meter otherwise disable it */
  28079             meter_offset.value[0]  = (_FIELD_METER_TYPE_ODD == meter_type);
  28080 
  28081             fld_info = NULL;
  28082             fld_info = soc_format_fieldinfo_get(unit, fmt, METER_TEST_EVENf);
  28083             if (NULL == fld_info) {
  28084                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28085                                 "IFP policer set failed for field %d\n\r"),
  28086                             METER_TEST_EVENf));
  28087                 return BCM_E_INTERNAL;
  28088             }
  28089             /* METER_TEST_EVEN */
  28090             meter_offset.offset[1] = meter_base + fld_info->bp;
  28091             meter_offset.width[1]  = fld_info->len;
  28092             /* Enable only for Even idx or Excess meter otherwise disable it */
  28093             meter_offset.value[1]  = (_FIELD_METER_TYPE_EVEN == meter_type);
  28094 
  28095             fld_info = NULL;
  28096             fld_info = soc_format_fieldinfo_get(unit, fmt, METER_UPDATE_ODDf);
  28097             if (NULL == fld_info) {
  28098                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28099                                 "IFP policer set failed for field %d\n\r"),
  28100                             METER_UPDATE_ODDf));
  28101                 return BCM_E_INTERNAL;
  28102             }
  28103             /* METER_UPDATE_ODD */
  28104             meter_offset.offset[2] = meter_base + fld_info->bp;
  28105             meter_offset.width[2]  = fld_info->len;
  28106             /* Enable only for Odd idx or Committed meter otherwise disable it */
  28107             meter_offset.value[2]  = (_FIELD_METER_TYPE_ODD == meter_type);
  28108 
  28109             fld_info = NULL;
  28110             fld_info = soc_format_fieldinfo_get(unit, fmt, METER_UPDATE_EVENf);
  28111             if (NULL == fld_info) {
  28112                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28113                                 "IFP policer set failed for field %d\n\r"),
  28114                             METER_UPDATE_EVENf));
  28115                 return BCM_E_INTERNAL;
  28116             }
  28117             /* METER_UPDATE_EVEN */
  28118             meter_offset.offset[3] = meter_base + fld_info->bp;
  28119             meter_offset.width[3]  = fld_info->len;
  28120             /* Enable only for Even idx or Excess meter otherwise disable it */
  28121             meter_offset.value[3]  = (_FIELD_METER_TYPE_EVEN == meter_type);
  28122         }
  28123 
  28124         if ((f_pl->cfg.mode == bcmPolicerModePassThrough) ||
  28125                 (f_pl->cfg.mode == bcmPolicerModeSrTcmModified)) {
  28126 
  28127             fld_info = NULL;
  28128             fld_info = soc_format_fieldinfo_get(unit, fmt, METER_PAIR_MODE_MODIFIERf);
  28129             if (NULL == fld_info) {
  28130                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28131                                 "IFP policer set failed for field %d\n\r"),
  28132                             METER_PAIR_MODE_MODIFIERf));
  28133                 return BCM_E_INTERNAL;
  28134             }
  28135             /* METER_PAIR_MODE_MODIFIER */
  28136             meter_info_offset.offset[2] = meter_base + fld_info->bp;
  28137             meter_info_offset.width[2]  = fld_info->len;
  28138             /* Enable packet color modifier */
  28139             meter_info_offset.value[2]  = 1;
  28140         }
  28141 
  28142         ACTION_SET(unit, f_ent, buf, &meter_offset);
  28143         ACTION_SET(unit, f_ent, buf, &meter_info_offset);
  28144     }
  28145 
  28146     return BCM_E_NONE;
  28147 }
  28148 
  28149 /*
  28150  * Function:
  28151  *     _field_th_ingress_entry_policy_mem_install
  28152  * Purpose:
  28153  *     Install the entry actions into the policy table.
  28154  * Parameters:
  28155  *     unit         - (IN) BCM device number
  28156  *     f_ent        - (IN) entry structure to get policy info from
  28157  *     policy_mem   - (IN) Policy table memory
  28158  *     tcam_idx     - (IN) Common index of various tables
  28159  * Returns:
  28160  *     BCM_E_XXX
  28161  */
  28162 STATIC int
  28163 _field_th_ingress_entry_policy_mem_install(int unit, _field_entry_t *f_ent,
  28164                                            soc_mem_t policy_mem, int tcam_idx)
  28165 {
  28166     uint32            e_buf[SOC_MAX_MEM_FIELD_WORDS] = {0};
  28167                                        /* Buffer to fill Policy entry.        */
  28168     _field_action_t   *fa = NULL;      /* Reference to field action structure */
  28169     int               rv;              /* Operation return status.            */
  28170     int               policy_idx;      /* Policy index in the Policy table.   */
  28171     uint8             entry_part;      /* Entry part number in wider group    */
  28172     soc_field_info_t * f_info;
  28173 
  28174     /* Input parameters check. */
  28175     if (NULL == f_ent) {
  28176         return (BCM_E_PARAM);
  28177     }
  28178 
  28179 
  28180     /*
  28181      * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes,
  28182      * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries.
  28183      * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and
  28184      * entries are 1:1 mapped.
  28185      */
  28186     if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) &&
  28187         (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) ||
  28188           (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) {
  28189         policy_idx = tcam_idx + (f_ent->fs->slice_number * 256);
  28190     } else {
  28191         policy_idx = tcam_idx;
  28192     }
  28193 
  28194     /* Get the entry part number from entry flags */
  28195     _bcm_field_th_entry_flags_to_tcam_part(unit, f_ent->flags,
  28196                                    f_ent->group->flags, &entry_part);
  28197 
  28198     if (entry_part != 0) {
  28199         /* policy install is needed only for Entry part 0
  28200           of wider groups */
  28201         return BCM_E_NONE;
  28202     }
  28203     /* Extract the policy info from the entry structure. */
  28204     for (fa = f_ent->actions; fa != NULL; fa = fa->next) {
  28205         /* Skip the invalid entries */
  28206         if (_FP_ACTION_VALID & fa->flags) {
  28207             rv = _bcm_field_th_action_set(unit, policy_mem, f_ent,
  28208                                           policy_idx, fa, e_buf);
  28209             if (BCM_FAILURE(rv)) {
  28210                LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("TH Action set failed.\n")));
  28211                return rv;
  28212             }
  28213         }
  28214     }
  28215 
  28216     /*
  28217      * Handle color dependence/independence
  28218      * (1 bit field in GREEN_TO_PID_SET)
  28219      */
  28220     {
  28221        _bcm_field_action_offset_t  a_offset;
  28222        sal_memset(&a_offset, 0x0, sizeof(a_offset));
  28223        f_info = soc_mem_fieldinfo_get(unit, IFP_POLICY_TABLEm, GREEN_TO_PID_SETf);
  28224        a_offset.offset[0] = f_info->bp;
  28225        a_offset.width[0]  = 1;
  28226        a_offset.value[0]  = ((f_ent->flags & _FP_ENTRY_COLOR_INDEPENDENT)
  28227                               ? 1 : 0);
  28228        ACTION_SET(unit, f_ent, e_buf, &a_offset);
  28229     }
  28230 
  28231     /* Extract meter related policy fields */
  28232     BCM_IF_ERROR_RETURN
  28233         (_field_th_ingress_policer_action_set(unit, f_ent, e_buf));
  28234 
  28235     if ( (f_ent->group->stage_id == _BCM_FIELD_STAGE_INGRESS) &&
  28236          (!(f_ent->statistic.flags & _FP_ENTRY_STAT_DIRTY)) &&
  28237          (f_ent->statistic.flags & _FP_ENTRY_STAT_VALID) ) {
  28238         uint32     val;
  28239         uint32     count;
  28240         uint32     counter_set;
  28241         uint32     data[SOC_MAX_MEM_FIELD_WORDS] = {0};
  28242         /* retain counter values. */
  28243 
  28244         /* Read policy entry from current tcam index. */
  28245         rv = soc_th_ifp_mem_read(unit, policy_mem, MEM_BLOCK_ANY,
  28246                                 policy_idx, data);
  28247         BCM_IF_ERROR_RETURN(rv);
  28248 
  28249         val = soc_mem_field32_get(unit, policy_mem, data, FLEX_CTR_POOL_NUMBERf);
  28250         soc_mem_field32_set(unit, policy_mem, e_buf, FLEX_CTR_POOL_NUMBERf, val);
  28251         val = soc_mem_field32_get(unit, policy_mem, data, FLEX_CTR_OFFSET_MODEf);
  28252         soc_mem_field32_set(unit, policy_mem, e_buf, FLEX_CTR_OFFSET_MODEf, val);
  28253         val = soc_mem_field32_get(unit, policy_mem, data, FLEX_CTR_BASE_COUNTER_IDXf);
  28254         soc_mem_field32_set(unit, policy_mem, e_buf, FLEX_CTR_BASE_COUNTER_IDXf, val);
  28255 
  28256         count = soc_mem_field32_get(unit, policy_mem, data, Y_COUNTf);
  28257         soc_mem_field32_set(unit, policy_mem, e_buf, Y_COUNTf, count);
  28258         count = soc_mem_field32_get(unit, policy_mem, data, G_COUNTf);
  28259         soc_mem_field32_set(unit, policy_mem, e_buf, G_COUNTf, count);
  28260         count = soc_mem_field32_get(unit, policy_mem, data, R_COUNTf);
  28261         soc_mem_field32_set(unit, policy_mem, e_buf, R_COUNTf, count);
  28262 
  28263         counter_set = soc_mem_field32_get(unit, policy_mem, data, COUNTER_SETf);
  28264         soc_mem_field32_set(unit, policy_mem, e_buf, COUNTER_SETf, counter_set);
  28265     } else {
  28266         /* Extract counter related policy fields */
  28267         BCM_IF_ERROR_RETURN
  28268           (_bcm_field_th_flex_stat_action_set(unit, f_ent, policy_mem,
  28269                                               policy_idx, e_buf));
  28270     }
  28271 
  28272 
  28273     /* Write the POLICY Table */
  28274     rv = soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, policy_idx, e_buf);
  28275     return (rv);
  28276 }
  28277 
  28278 /*
  28279  * Function:
  28280  *     _field_th_vfp_efp_entry_policy_mem_install
  28281  * Purpose:
  28282  *     Install the entry actions into the policy table.
  28283  * Parameters:
  28284  *     unit         - (IN) BCM device number
  28285  *     f_ent        - (IN) entry structure to get policy info from
  28286  *     policy_mem   - (IN) Policy table memory
  28287  *     policy_idx   - (IN) Index to the Policy Memory Table.
  28288  * Returns:
  28289  *     BCM_E_XXX
  28290  */
  28291 STATIC int
  28292 _field_th_vfp_efp_entry_policy_mem_install(int unit, _field_entry_t *f_ent,
  28293                                            soc_mem_t policy_mem, int policy_idx)
  28294 {
  28295     uint32            e_buf[SOC_MAX_MEM_FIELD_WORDS] = {0};
  28296                                        /* Buffer to fill Policy entry.        */
  28297 
  28298     int               rv;              /* Operation return status.            */
  28299 
  28300     _field_action_t   *fa = NULL;      /* Reference to field action structure */
  28301 
  28302     /* Input parameters check. */
  28303     if (NULL == f_ent) {
  28304         return (BCM_E_PARAM);
  28305     }
  28306 
  28307     /* Extract the policy info from the entry structure. */
  28308     for (fa = f_ent->actions; fa != NULL; fa = fa->next) {
  28309         /* Skip the invalid entries */
  28310         if (_FP_ACTION_VALID & fa->flags) {
  28311             rv = _bcm_field_trx_action_get(unit, policy_mem, f_ent,
  28312                                            policy_idx, fa, e_buf);
  28313             if (BCM_FAILURE(rv)) {
  28314                LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("TH Action set failed.\n")));
  28315                return rv;
  28316             }
  28317         }
  28318     }
  28319 
  28320     /* Extract meter related policy fields */
  28321     if (((soc_feature(unit, soc_feature_field_egress_metering))
  28322          && (f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS))
  28323          || (f_ent->group->stage_id != _BCM_FIELD_STAGE_EGRESS)) {
  28324         BCM_IF_ERROR_RETURN
  28325             (_bcm_field_trx_policer_action_set(unit, f_ent, policy_mem, e_buf));
  28326     }
  28327 
  28328     /* Extract counter related policy fields */
  28329     if (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP) {
  28330        BCM_IF_ERROR_RETURN(_bcm_field_th_flex_stat_action_set(unit, f_ent,
  28331                                           policy_mem, policy_idx, e_buf));
  28332     } else {
  28333        BCM_IF_ERROR_RETURN(_bcm_field_trx_stat_action_set(unit, f_ent,
  28334                                       policy_mem, policy_idx, e_buf));
  28335 #ifdef BCM_TRIDENT2PLUS_SUPPORT
  28336        if (soc_feature(unit, soc_feature_td3_style_fp)) {
  28337            rv = _bcm_field_td2plus_extended_stat_action_set(unit, f_ent,
  28338                                          policy_mem, policy_idx, e_buf);
  28339            BCM_IF_ERROR_RETURN(rv);
  28340        }
  28341 #endif /* BCM_TRIDENT2PLUS_SUPPORT */
  28342 
  28343     }
  28344 
  28345     /* Write the POLICY Table */
  28346     rv = soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, policy_idx, e_buf);
  28347     return (rv);
  28348 }
  28349 
  28350 
  28351 /*
  28352  * Function:
  28353  *     _field_th_entry_policy_mem_install
  28354  * Purpose:
  28355  *     Install the entry actions into the policy table.
  28356  * Parameters:
  28357  *     unit         - (IN) BCM device number
  28358  *     f_ent        - (IN) entry structure to get policy info from
  28359  *     policy_mem   - (IN) Policy table memory
  28360  *     tcam_idx     - (IN) Common index of various tables
  28361  * Returns:
  28362  *     BCM_E_XXX
  28363  */
  28364 STATIC int
  28365 _field_th_entry_policy_mem_install(int unit, _field_entry_t *f_ent,
  28366                                    soc_mem_t policy_mem, int tcam_idx)
  28367 {
  28368     /* Input parameters check. */
  28369     if (NULL == f_ent) {
  28370         return (BCM_E_PARAM);
  28371     }
  28372 
  28373     switch (f_ent->group->stage_id) {
  28374         case _BCM_FIELD_STAGE_INGRESS:
  28375 #if defined(BCM_TRIDENT3_SUPPORT)
  28376              if(soc_feature(unit, soc_feature_ifp_action_profiling)) {
  28377                  return _field_td3_ingress_entry_policy_mem_install(unit,
  28378                                               f_ent, policy_mem, tcam_idx);
  28379              } else
  28380 #endif
  28381 	     {
  28382                  return _field_th_ingress_entry_policy_mem_install(unit,
  28383                                               f_ent, policy_mem, tcam_idx);
  28384              }
  28385         case _BCM_FIELD_STAGE_EGRESS:
  28386         case _BCM_FIELD_STAGE_LOOKUP:
  28387              return _field_th_vfp_efp_entry_policy_mem_install(unit, f_ent,
  28388                                                      policy_mem, tcam_idx);
  28389 #if defined(BCM_FLOWTRACKER_SUPPORT)
  28390         case _BCM_FIELD_STAGE_FLOWTRACKER:
  28391              if (soc_feature(unit, soc_feature_field_flowtracker_support)) {
  28392                 return _field_hx5_ft_entry_policy_mem_install(unit,
  28393                                               f_ent, policy_mem, tcam_idx);
  28394             }
  28395 #endif
  28396         default:
  28397              break;
  28398     }
  28399 
  28400     return (BCM_E_INTERNAL);
  28401 }
  28402 
  28403 /*
  28404  * Function:
  28405  *     _field_th_entry_qual_tcam_install
  28406  * Purpose:
  28407  *     Install the entry qualifiers in the TCAM.
  28408  * Parameters:
  28409  *     unit         - (IN) BCM device number
  28410  *     f_ent        - (IN) entry structure to get policy info from
  28411  *     tcam_mem     - (IN) TCAM memory index.
  28412  *     tcam_idx     - (IN) Index in the TCAM memory.
  28413  * Returns:
  28414  *     BCM_E_XXX
  28415  */
  28416 
  28417 STATIC int
  28418 _field_th_entry_qual_tcam_install(int unit, _field_entry_t *f_ent,
  28419                                   soc_mem_t tcam_mem, int tcam_idx)
  28420 {
  28421     /* Input parameters check. */
  28422     if (NULL == f_ent) {
  28423         return (BCM_E_PARAM);
  28424     }
  28425 
  28426     switch (f_ent->group->stage_id) {
  28427         case _BCM_FIELD_STAGE_INGRESS:
  28428             return _field_th_ingress_entry_qual_tcam_install(unit, f_ent,
  28429                                                      tcam_mem, tcam_idx);
  28430         case _BCM_FIELD_STAGE_EGRESS:
  28431         case _BCM_FIELD_STAGE_LOOKUP:
  28432             return _field_th_vfp_efp_entry_qual_tcam_install(unit, f_ent,
  28433                                                      tcam_mem, tcam_idx);
  28434         default:
  28435             break;
  28436     }
  28437 
  28438     return (BCM_E_INTERNAL);
  28439 }
  28440 
  28441 /*
  28442  * Function:
  28443  *     _bcm_field_th_entry_install
  28444  * Purpose:
  28445  *     Write entry into the device hardware TCAM memory.
  28446  * Parameters:
  28447  *     unit     -   (IN) BCM Device Number
  28448  *     f_ent    -   (IN) Physical entry structure to be installed
  28449  *     tcam_idx -   (IN) common index of various tables
  28450  * Returns:
  28451  *     BCM_E_XXX        On TCAM read/write errors
  28452  *     BCM_E_NONE
  28453  * Note:
  28454  *     Unit lock should be held by calling function.
  28455  */
  28456 int
  28457 _bcm_field_th_entry_install(int unit, _field_entry_t *f_ent,
  28458                                     int tcam_idx)
  28459 {
  28460     int              rv = BCM_E_INTERNAL; /* Return Value            */
  28461     soc_mem_t        tcam_mem;            /* TCAM memory id.         */
  28462     soc_mem_t        policy_mem;          /* Policy table memory id. */
  28463     uint8            enabled = 0;
  28464 
  28465     /* Input parameters check. */
  28466     if (NULL == f_ent) {
  28467         return (BCM_E_PARAM);
  28468     }
  28469 
  28470     if (NULL == f_ent->fs || NULL == f_ent->group) {
  28471         return BCM_E_INTERNAL;
  28472     }
  28473 
  28474 #if defined(BCM_FLOWTRACKER_SUPPORT)
  28475     if (f_ent->group->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) {
  28476         return _field_hx5_ft_entry_tcam_policy_install(unit, f_ent, tcam_idx);
  28477     }
  28478 #endif
  28479 
  28480     rv = _bcm_field_th_tcam_policy_mem_get(unit, f_ent,
  28481                                        &tcam_mem, &policy_mem);
  28482     BCM_IF_ERROR_RETURN(rv);
  28483 
  28484     if ((tcam_idx < soc_mem_index_min(unit, tcam_mem)) ||
  28485         (tcam_idx > soc_mem_index_max(unit, tcam_mem))) {
  28486         return (BCM_E_PARAM);
  28487     }
  28488 
  28489     if ((f_ent->fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE) == 0)  {
  28490        if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit,
  28491                                              f_ent->group, f_ent->fs, 1))) {
  28492           LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28493                    "Failed to Enable Field Slice[%d] for Entry[%d].\n\r"),
  28494                    f_ent->fs->slice_number, f_ent->eid));
  28495        }
  28496        f_ent->fs->slice_flags |= _BCM_FIELD_SLICE_HW_ENABLE;
  28497        enabled = 1;
  28498     }
  28499 
  28500 
  28501     /* Write actions into Policy Table */
  28502     rv = _field_th_entry_policy_mem_install(unit, f_ent, policy_mem, tcam_idx);
  28503     if (BCM_FAILURE(rv)) {
  28504         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28505                  "Failed to Install Policy Table for Entry[%d]"
  28506                  " tcam_idx:[%d].\n\r"),
  28507                  f_ent->eid, tcam_idx));
  28508         goto cleanup;
  28509     }
  28510 
  28511     /* Write qualifiers into TCAM */
  28512     rv = _field_th_entry_qual_tcam_install(unit, f_ent, tcam_mem, tcam_idx);
  28513 
  28514     /* Enable the Slice if it is the first Entry */
  28515     if (BCM_SUCCESS(rv)) {
  28516        /*
  28517         * Check for Entry installed or not.
  28518         * Hw_ent_count shoudb be incremented only once per an entry.
  28519         */
  28520        if (0 == (f_ent->flags & _FP_ENTRY_INSTALLED)) {
  28521            /* Increment the HW Slice entry count */
  28522            f_ent->fs->hw_ent_count++;
  28523        }
  28524     } else {
  28525        LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  28526                  "Failed to Install the TCAM Entry[%d] tcam_idx:[%d].\n\r"),
  28527                  f_ent->eid, tcam_idx));
  28528        goto cleanup;
  28529     }
  28530 
  28531     LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  28532         "==> %s(): Entry[%d] Installed - mem:%d tcam_idx:%d slice:%d\n\r"),
  28533          __func__, f_ent->eid, tcam_mem, tcam_idx, f_ent->fs->slice_number));
  28534 
  28535     return rv;
  28536 
  28537 cleanup:
  28538     if ((enabled == 1) && (f_ent->fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE)) {
  28539         if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit, f_ent->group,
  28540                                                        f_ent->fs, 0))) {
  28541             LOG_WARN(BSL_LS_BCM_FP, (BSL_META("Failed to Disable Field"
  28542                                       " Slice[%d] for Entry[%d].\n\r"),
  28543                                       f_ent->fs->slice_number, f_ent->eid));
  28544         }
  28545         f_ent->fs->slice_flags &= ~_BCM_FIELD_SLICE_HW_ENABLE;
  28546     }
  28547     return rv;
  28548 
  28549 }
  28550 
  28551 /*
  28552  * Function:
  28553  *     _bcm_field_th_entry_reinstall
  28554  * Purpose:
  28555  *     Write entry into the chip's memory.
  28556  * Parameters:
  28557  *     unit     -   BCM Unit
  28558  *     f_ent    -   Physical entry structure to be installed
  28559  *     tcam_idx - common index of various tables
  28560  * Returns:
  28561  *     BCM_E_XXX        On TCAM read/write errors
  28562  *     BCM_E_NONE
  28563  * Note:
  28564  *     Unit lock should be held by calling function.
  28565  */
  28566 int
  28567 _bcm_field_th_entry_reinstall(int unit, _field_entry_t *f_ent, int tcam_idx)
  28568 {
  28569     int              rv = BCM_E_INTERNAL; /* Return Value */
  28570     soc_mem_t        tcam_mem;          /* TCAM memory id.                    */
  28571     soc_mem_t        policy_mem;        /* Policy table memory id .           */
  28572 
  28573     /* Input parameters check. */
  28574     if (NULL == f_ent) {
  28575        return (BCM_E_PARAM);
  28576     }
  28577 
  28578     if (NULL == f_ent->fs) {
  28579        return (BCM_E_PARAM);
  28580     }
  28581 
  28582     rv = _bcm_field_th_tcam_policy_mem_get(unit, f_ent,
  28583                                        &tcam_mem, &policy_mem);
  28584     BCM_IF_ERROR_RETURN(rv);
  28585 
  28586     if ((tcam_idx < soc_mem_index_min(unit, tcam_mem)) ||
  28587         (tcam_idx > soc_mem_index_max(unit, tcam_mem))) {
  28588         return (BCM_E_PARAM);
  28589     }
  28590 
  28591     /* Write actions into Policy Table */
  28592     rv = _field_th_entry_policy_mem_install(unit, f_ent, policy_mem, tcam_idx);
  28593     return rv;
  28594 }
  28595 
  28596 /*
  28597  * Function:
  28598  *     _field_th_qual_tcam_key_mask_get
  28599  * Purpose:
  28600  *     Allocate & read from hw tcam key/mask image.
  28601  * Parameters:
  28602  *     unit  - (IN)     BCM device number.
  28603  *     f_ent - (IN/OUT) Field entry.
  28604  *     tcam  - (IN)     Reference to Entry TCAM structure.
  28605  * Returns:
  28606  *     BCM_E_XXX
  28607  */
  28608 STATIC int
  28609 _field_th_qual_tcam_key_mask_get(int unit,
  28610                                  _field_entry_t *f_ent,
  28611                                  _field_tcam_t *tcam)
  28612 {
  28613     int             rv = BCM_E_INTERNAL; /* Return Value */
  28614     uint32          tcam_key_words;      /* tcam key length */
  28615     soc_field_t     mask_field;          /* Mask field */
  28616     soc_mem_t       tcam_mem;            /* TCAM Memory name */
  28617     soc_mem_t       policy_mem;          /* Policy Memory name */
  28618 
  28619 
  28620     /* Validate input parameters */
  28621     if (NULL == f_ent || NULL == tcam) {
  28622        return BCM_E_PARAM;
  28623     }
  28624 
  28625     /* Validate the group */
  28626     if (NULL == f_ent->fs || NULL == f_ent->group) {
  28627        return BCM_E_INTERNAL;
  28628     }
  28629 
  28630     mask_field = (f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS) ?
  28631                  KEY_MASKf : MASKf;
  28632 
  28633     BCM_IF_ERROR_RETURN
  28634         (_bcm_field_th_tcam_policy_mem_get(unit, f_ent,
  28635                                        &tcam_mem, &policy_mem));
  28636     /*
  28637      * Always use Per-pipe view for IFP_TCAM_WIDE memory
  28638      * in-case of Global mode.
  28639      */
  28640     if (tcam_mem == IFP_TCAM_WIDEm) {
  28641         tcam_mem = IFP_TCAM_WIDE_PIPE0m;
  28642     } else if (tcam_mem == IFP_TCAMm) {
  28643         tcam_mem = IFP_TCAM_PIPE0m;
  28644     }
  28645 
  28646     if (f_ent->group->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
  28647         if (f_ent->group->em_mode == _FieldExactMatchMode128) {
  28648             tcam_key_words = BITS2WORDS(soc_mem_field_length(unit,
  28649                                                          tcam_mem,
  28650                                              MODE128__KEY_0_ONLYf)
  28651                                       + soc_mem_field_length(unit,
  28652                                                          tcam_mem,
  28653                                             MODE128__KEY_1_ONLYf));
  28654         } else if (f_ent->group->em_mode == _FieldExactMatchMode160) {
  28655             tcam_key_words = BITS2WORDS(soc_mem_field_length(unit,
  28656                                                          tcam_mem,
  28657                                              MODE160__KEY_0_ONLYf)
  28658                                       + soc_mem_field_length(unit,
  28659                                                          tcam_mem,
  28660                                             MODE160__KEY_1_ONLYf));
  28661         } else if (f_ent->group->em_mode == _FieldExactMatchMode320) {
  28662             tcam_key_words = BITS2WORDS(soc_mem_field_length(unit,
  28663                                                    EXACT_MATCH_2m,
  28664                                              MODE160__KEY_0_ONLYf)
  28665                                       + soc_mem_field_length(unit,
  28666                                                    EXACT_MATCH_2m,
  28667                                             MODE160__KEY_1_ONLYf));
  28668         } else {
  28669             /* Invalid Exact Match Mode. */
  28670             return (BCM_E_INTERNAL);
  28671         }
  28672     } else {
  28673         tcam_key_words = BITS2WORDS(soc_mem_field_length(unit,
  28674                                                      tcam_mem,
  28675                                                         KEYf));
  28676     }
  28677 
  28678     /* Retrieve the key size */
  28679     tcam->key_size = WORDS2BYTES(tcam_key_words);
  28680 
  28681     /* Allocate Memory for TCAM Key and Mask */
  28682     _FP_XGS3_ALLOC(tcam->key, tcam->key_size, "TH TCAM Key Alloc.");
  28683     _FP_XGS3_ALLOC(tcam->mask, tcam->key_size, "TH TCAM Mask Alloc.");
  28684     if (tcam->key == NULL || tcam->mask == NULL) {
  28685         rv = BCM_E_MEMORY;
  28686         goto error;
  28687     }
  28688 
  28689     /* Only applicable for ingress stage. */
  28690     if (f_ent->group->stage_id != _BCM_FIELD_STAGE_EXACTMATCH) {
  28691         if (f_ent->flags & _FP_ENTRY_INSTALLED) {
  28692             int    tcam_idx;
  28693             uint32 tcam_entry[SOC_MAX_MEM_FIELD_WORDS] = {0};
  28694 
  28695             rv = _bcm_field_entry_tcam_idx_get(unit, f_ent, &tcam_idx);
  28696             if (BCM_FAILURE(rv)) {
  28697                 goto error;
  28698             }
  28699             if(f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS) {
  28700                 rv = soc_mem_read(unit,
  28701                                   tcam_mem,
  28702                                   MEM_BLOCK_ANY,
  28703                                   tcam_idx,
  28704                                   tcam_entry);
  28705             } else {
  28706                 rv = soc_th_ifp_mem_read(unit,
  28707                     tcam_mem,
  28708                     MEM_BLOCK_ANY,
  28709                     tcam_idx,
  28710                     tcam_entry);
  28711             }
  28712             if (BCM_FAILURE(rv)) {
  28713                 goto error;
  28714             }
  28715             soc_mem_field_get(unit, tcam_mem, tcam_entry,
  28716                               KEYf, tcam->key);
  28717             soc_mem_field_get(unit, tcam_mem, tcam_entry,
  28718                               mask_field, tcam->mask);
  28719         }
  28720     }
  28721 
  28722     return (BCM_E_NONE);
  28723 
  28724  error:
  28725     if (tcam->key) {
  28726         sal_free(tcam->key);
  28727         tcam->key = NULL;
  28728     }
  28729     if (tcam->mask) {
  28730         sal_free(tcam->mask);
  28731         tcam->mask = NULL;
  28732     }
  28733 
  28734     return rv;
  28735 }
  28736 
  28737 /*
  28738  * Function:
  28739  *     _bcm_field_qual_tcam_key_mask_get
  28740  * Purpose:
  28741  *     Allocate & read from hw tcam key/mask image.
  28742  * Parameters:
  28743  *     unit  - (IN)     BCM device number.
  28744  *     f_ent - (IN/OUT) Field entry.
  28745  *     tcam  - (IN)     Reference to Entry TCAM structure.
  28746  * Returns:
  28747  *     BCM_E_XXX
  28748  */
  28749 int
  28750 _bcm_field_th_qual_tcam_key_mask_get(int unit,
  28751                                      _field_entry_t *f_ent,
  28752                                      _field_tcam_t  *tcam)
  28753 {
  28754     int rv = BCM_E_NONE;  /* Return value */
  28755 
  28756     /* Validate input parameters */
  28757     if (NULL == f_ent || NULL == tcam) {
  28758        return BCM_E_PARAM;
  28759     }
  28760 
  28761     switch (f_ent->group->stage_id) {
  28762        case _BCM_FIELD_STAGE_INGRESS:
  28763        case _BCM_FIELD_STAGE_LOOKUP:
  28764        case _BCM_FIELD_STAGE_EGRESS:
  28765        case _BCM_FIELD_STAGE_EXACTMATCH:
  28766        case _BCM_FIELD_STAGE_FLOWTRACKER:
  28767           rv = _field_th_qual_tcam_key_mask_get(unit, f_ent, tcam);
  28768           break;
  28769        default:
  28770           rv = BCM_E_INTERNAL;
  28771           break;
  28772     }
  28773 
  28774     return rv;
  28775 }
  28776 
  28777 /*
  28778  * Function:
  28779  *     _field_th_ingress_tcam_policy_clear
  28780  *
  28781  * Purpose:
  28782  *     Writes a null entry into the TCAM plus Policy table.
  28783  *
  28784  * Parameters:
  28785  *     unit      -   (IN) BCM device number.
  28786  *     f_ent     -   (IN) Field entry.
  28787  *     tcam_idx  -   (IN) Entry tcam index.
  28788  *
  28789  * Returns:
  28790  *     BCM_E_XXX
  28791  *
  28792  * Note:
  28793  *     Unit lock should be held by calling function.
  28794  */
  28795 STATIC int
  28796 _field_th_ingress_tcam_policy_clear(int unit, _field_entry_t *f_ent,
  28797                                     int tcam_idx)
  28798 {
  28799     soc_mem_t      tcam_mem;            /* TCAM memory id.                */
  28800     soc_mem_t      policy_mem;          /* Policy table memory id .       */
  28801 
  28802     _field_stage_t *stage_fc;           /* Stage field control structure. */
  28803     int              num_tcams = 0;     /* Number of TCAMs                */
  28804     int              ct;
  28805     int policy_idx;                     /* Policy index in the Policy table. */
  28806     soc_mem_t      tcam_mem_global;     /* Global TCAM Id */
  28807     uint8          per_pipe_mode = FALSE;
  28808 
  28809     /* Validate input parameters */
  28810     if (NULL == f_ent) {
  28811        return BCM_E_PARAM;
  28812     }
  28813 
  28814     BCM_IF_ERROR_RETURN
  28815        (_bcm_field_th_tcam_policy_mem_get(unit, f_ent, &tcam_mem, &policy_mem));
  28816     tcam_mem_global = tcam_mem;
  28817 
  28818     /* Get field stage control . */
  28819     BCM_IF_ERROR_RETURN
  28820        (_field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc));
  28821 
  28822     /*
  28823      * When the TCAM Mode is Wide on a global view,
  28824      * Clear entries from the Pipes.
  28825      */
  28826     if (((tcam_mem == IFP_TCAM_WIDEm) ||
  28827         ((soc_feature(unit, soc_feature_th3_style_fp)) &&
  28828         (tcam_mem == IFP_TCAMm))) &&
  28829         (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) &&
  28830         (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) {
  28831        num_tcams = stage_fc->num_pipes;
  28832        per_pipe_mode = TRUE;
  28833     } else {
  28834        num_tcams = 1; /* tcam name is fetched in tcam_mem */
  28835     }
  28836 
  28837     for (ct = 0; ct < num_tcams; ct++) {
  28838        if (per_pipe_mode == TRUE) {
  28839            BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  28840                                        tcam_mem_global,
  28841                                        ct,
  28842                                        &tcam_mem));
  28843        }
  28844 
  28845        /* Memory index sanity check. */
  28846        if (tcam_idx > soc_mem_index_max(unit, tcam_mem)) {
  28847           return (BCM_E_PARAM);
  28848        }
  28849 
  28850        /* Write the TCAM & Policy Tables */
  28851        SOC_IF_ERROR_RETURN
  28852            (soc_th_ifp_mem_write(unit, tcam_mem, MEM_BLOCK_ALL, tcam_idx,
  28853                           soc_mem_entry_null(unit, tcam_mem)));
  28854     }
  28855 
  28856     /*
  28857      * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes,
  28858      * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries.
  28859      * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and
  28860      * entries are 1:1 mapped.
  28861      */
  28862     if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) &&
  28863         (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) ||
  28864         (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) {
  28865         policy_idx = tcam_idx + (f_ent->fs->slice_number * 256);
  28866     } else {
  28867         policy_idx = tcam_idx;
  28868     }
  28869 
  28870     SOC_IF_ERROR_RETURN
  28871        (soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, policy_idx,
  28872                       soc_mem_entry_null(unit, policy_mem)));
  28873 
  28874     return (BCM_E_NONE);
  28875 }
  28876 
  28877 /*
  28878  * Function:
  28879  *     _bcm_field_th_entry_move
  28880  * Purpose:
  28881  *     Copy an entry from one TCAM index to another. It copies the values in
  28882  *     hardware from the old index to the new index.
  28883  *     IT IS ASSUMED THAT THE NEW INDEX IS EMPTY (VALIDf=00) IN HARDWARE.
  28884  *     The old Hardware index is cleared at the end.
  28885  * Parameters:
  28886  *     unit           - (IN) BCM device number.
  28887  *     f_ent          - (IN) Entry to move
  28888  *     parts_count    - (IN) Field entry parts count.
  28889  *     tcam_idx_old   - (IN) Source entry tcam index.
  28890  *     tcam_idx_new   - (IN) Destination entry tcam index.
  28891  *
  28892  * Returns:
  28893  *     BCM_E_XXX
  28894  */
  28895 int
  28896 _bcm_field_th_entry_move(int unit, _field_entry_t *f_ent, int parts_count,
  28897                          int *tcam_idx_old, int *tcam_idx_new)
  28898 {
  28899     static uint32  entry_buf[BCM_MAX_NUM_UNITS][25];
  28900                                         /* For TCAM                           */
  28901     static uint32  policy_buf[BCM_MAX_NUM_UNITS][25];
  28902                                         /* For policies                       */
  28903     soc_mem_t tcam_mem;                 /* TCAM memory id.                    */
  28904     soc_mem_t policy_mem;               /* Policy table memory id .           */
  28905     int tcam_idx_max;                   /* TCAM memory max index.             */
  28906     int tcam_idx_min;                   /* TCAM memory min index.             */
  28907     _field_stage_t *stage_fc;           /* Stage field control structure.     */
  28908     _field_stage_id_t stage_id;         /* Field pipeline stage id.           */
  28909     int idx;                            /* Iteration index.                   */
  28910     _field_group_t   *fg;               /* Field group structure.             */
  28911     _field_slice_t *fs = NULL;
  28912     int              rv;                /* Operation return status.           */
  28913     int              is_backup_entry = 0; /* Flag ,checks the entry is
  28914                                              backup entry or not*/
  28915     int              num_tcams = 0;     /* Number of TCAMs                    */
  28916     int              ct;
  28917     int              policy_idx;
  28918     int              new_slice_idx = 0, /* New slice number and index.        */
  28919                      new_slice_numb = 0;
  28920     uint8            enabled = 0;
  28921     uint8            per_pipe_mode = FALSE;
  28922     soc_mem_t        tcam_mem_global;     /* Global TCAM Id */
  28923 
  28924     /* Input parameters check. */
  28925     if ((NULL == f_ent) || (NULL == tcam_idx_old) || (NULL == tcam_idx_new)) {
  28926        return (BCM_E_PARAM);
  28927     }
  28928 
  28929 
  28930     fg = f_ent->group;
  28931     if (fg == NULL) {
  28932        return BCM_E_INTERNAL;
  28933     }
  28934 
  28935     /* Get field stage control . */
  28936     stage_id = fg->stage_id;
  28937     rv = _field_stage_control_get(unit, stage_id, &stage_fc);
  28938     BCM_IF_ERROR_RETURN(rv);
  28939 
  28940 #if defined(BCM_FLOWTRACKER_SUPPORT)
  28941     if (stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) {
  28942         return _bcm_field_hx5_ft_entry_move(unit, f_ent, parts_count,
  28943                                     tcam_idx_old, tcam_idx_new);
  28944     }
  28945 #endif
  28946 
  28947     /*
  28948      * Invoke common function for the stages other than Ingress
  28949      * Need to re-visit for per-pipe support for other stages.
  28950      */
  28951     if (f_ent->group->stage_id != _BCM_FIELD_STAGE_INGRESS) {
  28952 
  28953        rv = _bcm_field_td2_entry_move(unit, f_ent, parts_count,
  28954                                       tcam_idx_old, tcam_idx_new);
  28955        BCM_IF_ERROR_RETURN(rv);
  28956 
  28957        for (idx = 0; idx < parts_count; idx++) {
  28958            /* Calculate entry new slice & offset in the slice. */
  28959            rv = _bcm_field_tcam_idx_to_slice_offset (unit, stage_fc,
  28960                                                      f_ent->group->instance,
  28961                                                      tcam_idx_new[idx],
  28962                                                      &new_slice_numb,
  28963                                                      &new_slice_idx);
  28964            BCM_IF_ERROR_RETURN(rv);
  28965            fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb];
  28966            fs->hw_ent_count++;
  28967        }
  28968 
  28969        return rv;
  28970     }
  28971 
  28972     /* Get entry tcam and actions. */
  28973     BCM_IF_ERROR_RETURN
  28974          (_bcm_field_th_tcam_policy_mem_get(unit, f_ent,
  28975                                        &tcam_mem, &policy_mem));
  28976     tcam_mem_global = tcam_mem;
  28977 
  28978     /*
  28979      * When the TCAM Mode is Wide on a global view,
  28980      * Move entries from the Pipes.
  28981      */
  28982     if (((tcam_mem == IFP_TCAM_WIDEm) ||
  28983         ((soc_feature(unit, soc_feature_th3_style_fp)) &&
  28984         (tcam_mem == IFP_TCAMm))) &&
  28985         (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) &&
  28986         (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) {
  28987        num_tcams = stage_fc->num_pipes;
  28988        per_pipe_mode = TRUE;
  28989     } else {
  28990        num_tcams = 1; /* tcam name is fetched in tcam_mem */
  28991     }
  28992 
  28993     for (ct = 0; ct < num_tcams; ct++) {
  28994        if (per_pipe_mode == TRUE) {
  28995            BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  28996                                        tcam_mem_global,
  28997                                        ct,
  28998                                        &tcam_mem));
  28999        }
  29000        tcam_idx_max = soc_mem_index_max(unit, tcam_mem);
  29001        tcam_idx_min = soc_mem_index_min(unit, tcam_mem);
  29002 
  29003        for (idx = 0; idx < parts_count; idx++) {
  29004            /* Index sanity check. */
  29005            if ((tcam_idx_old[idx] < tcam_idx_min) ||
  29006                (tcam_idx_old[idx] > tcam_idx_max) ||
  29007                (tcam_idx_new[idx] < tcam_idx_min) ||
  29008                (tcam_idx_new[idx] > tcam_idx_max)) {
  29009                LOG_DEBUG(BSL_LS_BCM_FP,
  29010                          (BSL_META_U(unit,
  29011                           "Invalid index range for _field_td2_entry_move\n"
  29012                      "from %d to %d"), tcam_idx_old[idx], tcam_idx_new[idx]));
  29013                 return (BCM_E_PARAM);
  29014            }
  29015        }
  29016 
  29017        /* Update policy entry if moving across the slices. */
  29018        if (((NULL != f_ent->ent_copy) &&
  29019                    (f_ent->ent_copy->eid ==  _FP_INTERNAL_RESERVED_ID))) {
  29020            is_backup_entry = 1;
  29021        }
  29022 
  29023        for (idx = 0; idx < parts_count; idx++) {
  29024            /* Calculate entry new slice & offset in the slice. */
  29025            rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc,
  29026                                                         f_ent,
  29027                                                         tcam_idx_new[idx],
  29028                                                         &new_slice_numb,
  29029                                                         &new_slice_idx);
  29030            if (BCM_SUCCESS(rv)) {
  29031 
  29032                fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb];
  29033                /* Enable the slice if the entry moves to new slice. */
  29034                if (!(fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE)) {
  29035                    if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit,
  29036                                                       f_ent->group, fs, 1))) {
  29037                        LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  29038                            "Failed to Enable Field Slice[%d] for Entry[%d].\n\r"),
  29039                            fs->slice_number, f_ent->eid));
  29040                    }
  29041                    fs->slice_flags |= _BCM_FIELD_SLICE_HW_ENABLE;
  29042                    enabled = 1;
  29043                }
  29044            }
  29045       }
  29046       /*
  29047        * Write entry to the destination
  29048        * ORDER is important
  29049        */
  29050        for (idx = parts_count - 1; idx >= 0; idx--) {
  29051            if (ct == 0) {
  29052 
  29053               /*
  29054                * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes,
  29055                * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries.
  29056                * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and
  29057                * entries are 1:1 mapped.
  29058                */
  29059               if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) &&
  29060                   (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) ||
  29061                   (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) {
  29062                  policy_idx = tcam_idx_old[idx] + (tcam_idx_old[idx]/256 * 256);
  29063               } else {
  29064                  policy_idx = tcam_idx_old[idx];
  29065               }
  29066 
  29067               /* Read policy entry from current tcam index. */
  29068               rv = soc_th_ifp_mem_read(unit, policy_mem, MEM_BLOCK_ANY,
  29069                                    policy_idx, policy_buf[unit]);
  29070 
  29071               if (BCM_FAILURE(rv)) {
  29072                   goto cleanup;
  29073               }
  29074 
  29075               /*
  29076                * TH/TH2/TD3 (Intra Slice) Double Wide/ Triple wide modes,
  29077                * IFP_TCAM_WIDE have 256 entries but IFP_POLICY_TABLE will have 512 entries.
  29078                * In TH3, IFP_POLICY_TABLE_WIDE mode is used for TCAM Wide modes and
  29079                * entries are 1:1 mapped.
  29080                */
  29081               if ((SOC_IS_TOMAHAWKX(unit) && !(SOC_IS_TOMAHAWK3(unit)) &&
  29082                   (!(f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) ||
  29083                   (f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)))) {
  29084                  policy_idx = tcam_idx_new[idx] + (tcam_idx_new[idx]/256 * 256);
  29085               } else {
  29086                  policy_idx = tcam_idx_new[idx];
  29087               }
  29088 
  29089               /* Write duplicate  policy entry to new tcam index. */
  29090               rv = soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL,
  29091                                  policy_idx, policy_buf[unit]);
  29092               if (BCM_FAILURE(rv)) {
  29093                   goto cleanup;
  29094               }
  29095            }
  29096 
  29097            /* Read tcam entry from current tcam index. */
  29098            rv = soc_th_ifp_mem_read(unit, tcam_mem, MEM_BLOCK_ANY,
  29099                              tcam_idx_old[idx], entry_buf[unit]);
  29100            if (BCM_FAILURE(rv)) {
  29101                goto cleanup;
  29102            }
  29103 
  29104            /* Write duplicate  tcam entry to new tcam index. */
  29105            rv = soc_th_ifp_mem_write(unit, tcam_mem, MEM_BLOCK_ALL,
  29106                               tcam_idx_new[idx], entry_buf[unit]);
  29107            if (BCM_FAILURE(rv)) {
  29108                goto cleanup;
  29109            }
  29110        }
  29111     }
  29112 
  29113     for (idx = 0; idx < parts_count; idx++) {
  29114        /* Calculate entry new slice & offset in the slice. */
  29115        rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc,
  29116                                                     f_ent,
  29117                                                     tcam_idx_new[idx],
  29118                                                     &new_slice_numb,
  29119                                                     &new_slice_idx);
  29120        if (BCM_SUCCESS(rv)) {
  29121 
  29122            fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb];
  29123            /* Increment the HW Slice entry count */
  29124            fs->hw_ent_count++;
  29125        } else {
  29126            goto cleanup;
  29127        }
  29128 
  29129        /*
  29130         * fp_entry_move is invoked even for backup entry create
  29131         * to copy TCAM and FP_POLICY_TABLE tables. In this case
  29132         * TCAM and FP_POLICY_TABLEs should not be erased for
  29133         * original entry.
  29134         */
  29135        if (1 != is_backup_entry) {
  29136            /*
  29137             * Clear old location
  29138             */
  29139            rv = _bcm_field_th_tcam_policy_clear(unit, f_ent,
  29140                    tcam_idx_old[idx]);
  29141            BCM_IF_ERROR_RETURN(rv);
  29142        }
  29143     }
  29144     return (BCM_E_NONE);
  29145 
  29146 cleanup:
  29147        if (enabled == 1) {
  29148            for (idx = 0; idx < parts_count; idx++) {
  29149                /* Calculate entry new slice & offset in the slice. */
  29150                rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc,
  29151                                                             f_ent,
  29152                                                             tcam_idx_new[idx],
  29153                                                             &new_slice_numb,
  29154                                                             &new_slice_idx);
  29155                if (BCM_SUCCESS(rv)) {
  29156 
  29157                    fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb];
  29158                    if (fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE) {
  29159                        if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit, f_ent->group,
  29160                                                                       fs, 0))) {
  29161                            LOG_WARN(BSL_LS_BCM_FP, (BSL_META("Failed to Disable Field"
  29162                                                      " Slice[%d] for Entry[%d].\n\r"),
  29163                                                        fs->slice_number, f_ent->eid));
  29164                        }
  29165                        fs->slice_flags &= ~_BCM_FIELD_SLICE_HW_ENABLE;
  29166                    }
  29167                }
  29168           }
  29169       }
  29170       return rv;
  29171 }
  29172 
  29173 /*
  29174  * Function:
  29175  *     _bcm_field_th_tcam_policy_clear
  29176  *
  29177  * Purpose:
  29178  *     Writes a null entry into the TCAM plus Policy table.
  29179  *
  29180  * Parameters:
  29181  *     unit      -   (IN) BCM device number.
  29182  *     f_ent     -   (IN) Field entry.
  29183  *     tcam_idx  -   (IN) Entry tcam index.
  29184  *
  29185  * Returns:
  29186  *     BCM_E_XXX
  29187  *
  29188  * Note:
  29189  *     Unit lock should be held by calling function.
  29190  */
  29191 int
  29192 _bcm_field_th_tcam_policy_clear(int unit, _field_entry_t *f_ent, int tcam_idx)
  29193 {
  29194     bcm_error_t rv = BCM_E_NONE;        /* Operational Status.                */
  29195     soc_mem_t tcam_mem;                 /* TCAM memory id.                    */
  29196     soc_mem_t policy_mem;               /* Policy table memory id .           */
  29197     int new_slice_idx = 0;              /* New slice number.                  */
  29198     int new_slice_numb = 0;             /* New slice index.                   */
  29199     _field_slice_t *fs;                 /* Field Slice structure.             */
  29200     _field_stage_t *stage_fc;           /* Stage field control structure.     */
  29201 
  29202     if (NULL == f_ent) {
  29203         return (BCM_E_PARAM);
  29204     }
  29205 
  29206     /* Get field stage control . */
  29207     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, f_ent->group->stage_id,
  29208                                                  &stage_fc));
  29209 
  29210     switch (f_ent->group->stage_id) {
  29211        case _BCM_FIELD_STAGE_INGRESS:
  29212            BCM_IF_ERROR_RETURN (_field_th_ingress_tcam_policy_clear(unit, f_ent,
  29213                                                                      tcam_idx));
  29214 
  29215            /* Calculate entry new slice & offset in the slice. */
  29216            rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc,
  29217                                                         f_ent, tcam_idx,
  29218                                                         &new_slice_numb,
  29219                                                         &new_slice_idx);
  29220            BCM_IF_ERROR_RETURN(rv);
  29221 
  29222           break;
  29223        case _BCM_FIELD_STAGE_LOOKUP:
  29224        case _BCM_FIELD_STAGE_EGRESS:
  29225           BCM_IF_ERROR_RETURN (_bcm_field_th_tcam_policy_mem_get(unit, f_ent,
  29226                                                        &tcam_mem, &policy_mem));
  29227           /* Memory index sanity check. */
  29228           if (tcam_idx > soc_mem_index_max(unit, tcam_mem)) {
  29229              return (BCM_E_PARAM);
  29230           }
  29231 
  29232           /* Write the TCAM & Policy Tables */
  29233           SOC_IF_ERROR_RETURN
  29234             (soc_th_ifp_mem_write(unit, tcam_mem, MEM_BLOCK_ALL, tcam_idx,
  29235                                   soc_mem_entry_null(unit, tcam_mem)));
  29236           SOC_IF_ERROR_RETURN
  29237             (soc_th_ifp_mem_write(unit, policy_mem, MEM_BLOCK_ALL, tcam_idx,
  29238                                   soc_mem_entry_null(unit, policy_mem)));
  29239 
  29240           /* Calculate entry new slice & offset in the slice. */
  29241           rv = _bcm_field_tcam_idx_to_slice_offset(unit, stage_fc,
  29242                                                    f_ent->group->instance,
  29243                                                    tcam_idx,
  29244                                                    &new_slice_numb,
  29245                                                    &new_slice_idx);
  29246           BCM_IF_ERROR_RETURN(rv);
  29247 
  29248           break;
  29249 #if defined(BCM_FLOWTRACKER_SUPPORT)
  29250         case _BCM_FIELD_STAGE_FLOWTRACKER:
  29251           BCM_IF_ERROR_RETURN(_bcm_field_hx5_ft_tcam_policy_clear(unit, f_ent,
  29252                                                                     tcam_idx));
  29253            /* Calculate entry new slice & offset in the slice. */
  29254            rv = _bcm_field_th_tcam_idx_to_slice_offset (unit, stage_fc,
  29255                                                         f_ent, tcam_idx,
  29256                                                         &new_slice_numb,
  29257                                                         &new_slice_idx);
  29258           break;
  29259 #endif
  29260        default:
  29261           return BCM_E_INTERNAL;
  29262     }
  29263 
  29264     fs = &stage_fc->slices[f_ent->group->instance][new_slice_numb];
  29265     if ((fs->slice_flags & _BCM_FIELD_SLICE_HW_ENABLE) &&
  29266         (fs->hw_ent_count == 1)) {
  29267        /* Disable the Slice, if it the last entry */
  29268        if (BCM_FAILURE(_bcm_field_th_slice_enable_set(unit, f_ent->group,
  29269                                                       fs, 0))) {
  29270            LOG_WARN(BSL_LS_BCM_FP, (BSL_META("Failed to Disable Field"
  29271                                  " Slice[%d] for Entry[%d].\n\r"),
  29272                                    fs->slice_number, f_ent->eid));
  29273        }
  29274        fs->slice_flags &= ~_BCM_FIELD_SLICE_HW_ENABLE;
  29275        /* Decrement the HW Slice entry count */
  29276        fs->hw_ent_count = 0;
  29277     } else {
  29278        if (0 >= fs->hw_ent_count) {
  29279 
  29280            LOG_ERROR(BSL_LS_BCM_FP, (BSL_META("Mismatch b/w number of entries"
  29281                                     "created and deleted in Slice [%d].\n\r"),
  29282                                     fs->slice_number));
  29283 
  29284            return BCM_E_INTERNAL;
  29285        }
  29286        fs->hw_ent_count--;
  29287 
  29288     }
  29289 
  29290     return (BCM_E_NONE);
  29291 }
  29292 
  29293 /*
  29294  * Function:
  29295  *     _bcm_field_th_entry_remove
  29296  * Purpose:
  29297  *     Remove a previously installed physical entry.
  29298  * Parameters:
  29299  *     unit   - BCM device number
  29300  *     f_ent  - Physical entry data
  29301  * Returns:
  29302  *     BCM_E_XXX
  29303  *     BCM_E_NONE
  29304  * Notes:
  29305  *     FP unit lock should be held by calling function.
  29306  */
  29307 int
  29308 _bcm_field_th_entry_remove(int unit, _field_entry_t *f_ent, int tcam_idx)
  29309 {
  29310     int rv; /* Return value */
  29311 
  29312     if (NULL == f_ent) {
  29313         return (BCM_E_PARAM);
  29314     }
  29315 
  29316     if ((NULL == f_ent->fs) || (NULL == f_ent->group)) {
  29317         return (BCM_E_INTERNAL);
  29318     }
  29319 
  29320     /* Remove exact match entry from hardware. */
  29321     if (f_ent->group->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
  29322         return _field_th_em_entry_remove(unit, f_ent);
  29323     }
  29324 
  29325     rv = _bcm_field_th_tcam_policy_clear(unit, f_ent, tcam_idx);
  29326     if (BCM_FAILURE(rv)) {
  29327         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META(
  29328               "Failed to Remove the TCAM entry for entry[%d] tcam_idx[%d]."
  29329               "\n\r"), f_ent->eid, tcam_idx));
  29330         return rv;
  29331     }
  29332 
  29333     f_ent->flags |= _FP_ENTRY_DIRTY; /* Mark entry as not installed */
  29334     LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  29335         "==> %s(): Entry[%d] Un-installed - tcam_idx:%d slice:%d\n\r"), __func__,
  29336          f_ent->eid, tcam_idx, f_ent->fs->slice_number));
  29337     return (BCM_E_NONE);
  29338 }
  29339 
  29340 /*
  29341  * Function: _field_th_stage_entry_enable_set
  29342  *
  29343  * Purpose:
  29344  *     Enable/Disable an entry from the ingress field hw tables.
  29345  *
  29346  * Parameters:
  29347  *     unit        - (IN) BCM device number
  29348  *     f_ent       - (IN) Reference to Entry structure
  29349  *     enable_flag - (IN) Flag to enable or disable
  29350  *
  29351  * Returns:
  29352  *     BCM_E_XXX
  29353  *
  29354  * Notes:
  29355  *     This does not destroy the entry, nor deallocate any related resources;
  29356  *     it only enables/disables a rule from hardware table using VALIDf of the
  29357  *     corresponding hardware entry. To deallocate the memory used by the entry
  29358  *     call bcm_field_entry_destroy.
  29359  */
  29360 int
  29361 _field_th_stage_entry_enable_set(int unit, _field_entry_t *f_ent,
  29362                                    int enable_flag)
  29363 {
  29364     int                 rv;          /* Operation return status. */
  29365     int                 tcam_idx;
  29366     int                 valid = 0;
  29367     soc_mem_t           tcam_mem = INVALIDm;
  29368     soc_mem_t           policy_mem = INVALIDm;
  29369     uint32              tcam_entry[SOC_MAX_MEM_FIELD_WORDS] = {0};
  29370     _field_stage_t      *stage_fc;         /* Stage field control structure. */
  29371     int                 num_tcams = 0;     /* Number of TCAMs */
  29372     int                 ct;
  29373     uint8               per_pipe_mode = FALSE;
  29374     soc_mem_t           tcam_mem_global;     /* Global TCAM Id */
  29375 
  29376     if (NULL == f_ent) {
  29377         return (BCM_E_PARAM);
  29378     }
  29379 
  29380     if ((NULL == f_ent->fs) || (NULL == f_ent->group)) {
  29381         return (BCM_E_INTERNAL);
  29382     }
  29383 
  29384     /* Get tcam indexes for installed entry. */
  29385     rv = _bcm_field_entry_tcam_idx_get(unit, f_ent,
  29386                                        &tcam_idx);
  29387     if (BCM_FAILURE(rv)) {
  29388         return (rv);
  29389     }
  29390 
  29391     rv = _bcm_field_th_tcam_policy_mem_get(unit, f_ent,
  29392                                        &tcam_mem, &policy_mem);
  29393     BCM_IF_ERROR_RETURN(rv);
  29394     tcam_mem_global = tcam_mem;
  29395 
  29396     /* Get field stage control . */
  29397     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  29398     BCM_IF_ERROR_RETURN(rv);
  29399 
  29400     /*
  29401      * When the TCAM Mode is Wide on a global view,
  29402      * Access the entries per-pipe.
  29403      */
  29404     if (_BCM_FIELD_STAGE_INGRESS == f_ent->group->stage_id) {
  29405 
  29406         if (((tcam_mem == IFP_TCAM_WIDEm) ||
  29407             ((soc_feature(unit, soc_feature_th3_style_fp)) &&
  29408             (tcam_mem == IFP_TCAMm))) &&
  29409             (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) &&
  29410             (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) {
  29411            num_tcams = stage_fc->num_pipes;
  29412            per_pipe_mode = TRUE;
  29413         } else {
  29414            num_tcams = 1; /* tcam name is fetched in tcam_mem */
  29415         }
  29416 
  29417         if (enable_flag) {
  29418             int  mode;
  29419 
  29420             mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(f_ent->group->flags) ?
  29421                             _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW;
  29422             /* Update the valid bit based on the mode */
  29423             valid = (mode == _IFP_SLICE_MODE_WIDE) ? 3 : 1;
  29424         }
  29425 
  29426     } else if (_BCM_FIELD_STAGE_LOOKUP == f_ent->group->stage_id ||
  29427                _BCM_FIELD_STAGE_EGRESS == f_ent->group->stage_id) {
  29428         num_tcams = 1;
  29429 
  29430         /* Set the VALIDf bits appropriately */
  29431         if (((soc_feature(unit, soc_feature_field_multi_pipe_enhanced) ||
  29432            soc_feature(unit, soc_feature_td3_style_fp)) &&
  29433            (f_ent->group->stage_id == _BCM_FIELD_STAGE_LOOKUP)) ||
  29434            (SOC_IS_TOMAHAWK3(unit))) {
  29435            valid = (enable_flag) ? 1 : 0;
  29436         } else {
  29437            valid = (enable_flag) ? 3 : 2;
  29438         }
  29439 #if defined(BCM_FLOWTRACKER_SUPPORT)
  29440     } else if (_BCM_FIELD_STAGE_FLOWTRACKER == f_ent->group->stage_id) {
  29441             valid = (enable_flag) ? 3 : 2;
  29442             num_tcams = 1;
  29443 #endif
  29444     } else {
  29445         return BCM_E_INTERNAL;
  29446     }
  29447 
  29448     for (ct = 0; ct < num_tcams; ct++) {
  29449 
  29450        if (per_pipe_mode == TRUE) {
  29451            BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  29452                                        tcam_mem_global,
  29453                                        ct,
  29454                                        &tcam_mem));
  29455        }
  29456 
  29457        rv = soc_th_ifp_mem_read(unit, tcam_mem, MEM_BLOCK_ANY,
  29458                                 tcam_idx, tcam_entry);
  29459        if (BCM_FAILURE(rv)) {
  29460           return (rv);
  29461        }
  29462 
  29463        soc_mem_field32_set(unit, tcam_mem, tcam_entry, VALIDf, valid);
  29464 
  29465        BCM_IF_ERROR_RETURN(soc_th_ifp_mem_write(unit,
  29466                                                 tcam_mem,
  29467                                                 MEM_BLOCK_ALL,
  29468                                                 tcam_idx,
  29469                                                 tcam_entry));
  29470     }
  29471 
  29472     if (enable_flag) {
  29473        f_ent->flags |= _FP_ENTRY_ENABLED;
  29474     } else {
  29475        f_ent->flags &= ~_FP_ENTRY_ENABLED;
  29476     }
  29477 
  29478     return BCM_E_NONE;
  29479 }
  29480 
  29481 #if defined(BCM_TOMAHAWK2_SUPPORT)
  29482 /*
  29483  * Function: _field_th2_lookup_entry_enable_set
  29484  *
  29485  * Purpose:
  29486  *     Enable/Disable an entry from th2 vfp hw tables.
  29487  *
  29488  * Parameters:
  29489  *     unit        - (IN) BCM device number
  29490  *     f_ent       - (IN) Reference to Entry structure
  29491  *     enable_flag - (IN) Flag to enable or disable
  29492  *
  29493  * Returns:
  29494  *     BCM_E_XXX
  29495  *
  29496  * Notes:
  29497  *     This does not destroy the entry, nor deallocate any related resources;
  29498  *     it only enables/disables a rule from hardware table using one bit VALIDf of the
  29499  *     corresponding hardware entry. To deallocate the memory used by the entry
  29500  *     call bcm_field_entry_destroy.
  29501  */
  29502 int
  29503 _field_th2_lookup_entry_enable_set(int unit, _field_entry_t *f_ent,
  29504                                    int enable_flag)
  29505 {
  29506     int                 rv;          /* Operation return status. */
  29507     int                 tcam_idx;
  29508     int                 valid = 0;
  29509     soc_mem_t           tcam_mem = INVALIDm;
  29510     soc_mem_t           policy_mem = INVALIDm;
  29511     uint32              tcam_entry[SOC_MAX_MEM_FIELD_WORDS] = {0};
  29512 
  29513     if (NULL == f_ent) {
  29514         return (BCM_E_PARAM);
  29515     }
  29516 
  29517     if ((NULL == f_ent->fs) || (NULL == f_ent->group)) {
  29518         return (BCM_E_INTERNAL);
  29519     }
  29520 
  29521     /* Get tcam indexes for installed entry. */
  29522     rv = _bcm_field_entry_tcam_idx_get(unit, f_ent, &tcam_idx);
  29523     BCM_IF_ERROR_RETURN(rv);
  29524 
  29525     rv = _bcm_field_th_tcam_policy_mem_get(unit, f_ent, &tcam_mem, &policy_mem);
  29526     BCM_IF_ERROR_RETURN(rv);
  29527 
  29528     rv = soc_mem_read(unit, tcam_mem, MEM_BLOCK_ANY, tcam_idx, tcam_entry);
  29529     BCM_IF_ERROR_RETURN(rv);
  29530 
  29531     valid = enable_flag ? 1 : 0;
  29532     soc_mem_field32_set(unit, tcam_mem, tcam_entry, VALIDf, valid);
  29533     BCM_IF_ERROR_RETURN(soc_mem_write(unit,
  29534                                       tcam_mem,
  29535                                       MEM_BLOCK_ALL,
  29536                                       tcam_idx,
  29537                                       tcam_entry));
  29538 
  29539     if (enable_flag) {
  29540        f_ent->flags |= _FP_ENTRY_ENABLED;
  29541     } else {
  29542        f_ent->flags &= ~_FP_ENTRY_ENABLED;
  29543     }
  29544 
  29545     return BCM_E_NONE;
  29546 }
  29547 #endif /* BCM_TOMAHAWK2_SUPPORT */
  29548 
  29549 /*
  29550  * Function: _bcm_field_th_entry_enable_set
  29551  *
  29552  * Purpose:
  29553  *     Enable/Disable an entry from the hardware tables.
  29554  *
  29555  * Parameters:
  29556  *     unit        - (IN) BCM device number
  29557  *     f_ent       - (IN) Reference to Entry structure
  29558  *     enable_flag - (IN) Flag to enable or disable
  29559  *
  29560  * Returns:
  29561  *     BCM_E_XXX
  29562  *
  29563  * Notes:
  29564  *     This does not destroy the entry, nor deallocate any related resources;
  29565  *     it only enables/disables a rule from hardware table using VALIDf of the
  29566  *     corresponding hardware entry. To deallocate the memory used by the entry
  29567  *     call bcm_field_entry_destroy.
  29568  */
  29569 int
  29570 _bcm_field_th_entry_enable_set(int unit, _field_entry_t *f_ent, int enable_flag)
  29571 {
  29572     int rv = BCM_E_NONE;
  29573 
  29574     if (NULL == f_ent) {
  29575         return (BCM_E_PARAM);
  29576     }
  29577 
  29578     if ((NULL == f_ent->fs) || (NULL == f_ent->group)) {
  29579         return (BCM_E_INTERNAL);
  29580     }
  29581 
  29582     switch (f_ent->group->stage_id) {
  29583        case _BCM_FIELD_STAGE_LOOKUP:
  29584 #if defined(BCM_TOMAHAWK2_SUPPORT)
  29585            if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) {
  29586                 return _field_th2_lookup_entry_enable_set(unit, f_ent, enable_flag);
  29587             }
  29588 #endif /* BCM_TOMAHAWK2_SUPPORT */
  29589        case _BCM_FIELD_STAGE_INGRESS:
  29590        case _BCM_FIELD_STAGE_EGRESS:
  29591            rv = _field_th_stage_entry_enable_set(unit, f_ent, enable_flag);
  29592            break;
  29593        case _BCM_FIELD_STAGE_EXACTMATCH:
  29594            rv = BCM_E_UNAVAIL;
  29595            break;
  29596 #if defined(BCM_FLOWTRACKER_SUPPORT)
  29597        case _BCM_FIELD_STAGE_FLOWTRACKER:
  29598            rv = _field_hx5_ft_stage_entry_enable_set(unit, f_ent, enable_flag);
  29599            break;
  29600 #endif
  29601 
  29602        default:
  29603            rv = BCM_E_INTERNAL;
  29604            break;
  29605     }
  29606 
  29607     return rv;
  29608 }
  29609 
  29610 /*
  29611  * Function:
  29612  *      _field_ser_oper_mode_init
  29613  * Purpose:
  29614  *      Initialize the SER for the given operational mode
  29615  *      per-CAP stage.
  29616  * Parameters:
  29617  *      unit    - (IN) BCM Device number.
  29618  *      stage   - (IN) Field Stage Pipeline value.
  29619  *      mode    - (IN) Field Group Operational Mode enum value.
  29620  * Returns:
  29621  *      BCM_E_NONE   - Operation successful.
  29622  *      BCM_E_PARAM  - Invalid operational mode or Field Stage.
  29623  *      BCM_E_XXX    - For others.
  29624  *
  29625  * Notes:
  29626  *   1. Valid "stage" input parameter values supported by
  29627  *      this API are:
  29628  *              "bcmFieldQualifyStageLookup"
  29629  * 	            "bcmFieldQualifyStageIngress"
  29630  *              "bcmFieldQualifyStageEgress"
  29631  *              "bcmFieldQualifyStageIngressExactMatch"
  29632  *              "bcmFieldQualifyStageClass"
  29633  *              "bcmFieldQualifyStageClassExactMatch".
  29634  *   2. Irrespective of the given mode, the IFP_TCAM_WIDE is
  29635  *      always be initialized to Unique Mode.
  29636  */
  29637 STATIC int
  29638 _field_ser_oper_mode_init(
  29639     int unit,
  29640     int stage_id,
  29641     bcm_field_group_oper_mode_t mode)
  29642 {
  29643     int               idx;          /* Temp Index variable. */
  29644     int               ser_mode;     /* SER mode */
  29645     int               rv;           /* Return Value */
  29646     int8              num_tcam = 0, /* Number of tcams */
  29647                       ct;
  29648     soc_mem_t         tcam_mem[12] = {INVALIDm};  /* Tcam memory id */
  29649     int               set_mode[12] = {0};
  29650 
  29651    /* Validate input parameters */
  29652    if ((mode != bcmFieldGroupOperModeGlobal) &&
  29653        (mode != bcmFieldGroupOperModePipeLocal)) {
  29654       return BCM_E_PARAM;
  29655    }
  29656 
  29657    /* Update the SER mode */
  29658    ser_mode = (mode == bcmFieldGroupOperModeGlobal) ?
  29659                _SOC_SER_MEM_MODE_GLOBAL:_SOC_SER_MEM_MODE_PIPE_UNIQUE;
  29660 
  29661    /* Update stage_id and tcam memory for the given stage */
  29662    switch (stage_id) {
  29663      case _BCM_FIELD_STAGE_LOOKUP:
  29664           tcam_mem[0] = VFP_TCAMm;
  29665           num_tcam = 2;
  29666           break;
  29667      case _BCM_FIELD_STAGE_INGRESS:
  29668           tcam_mem[1] = IFP_LOGICAL_TABLE_SELECTm;
  29669           tcam_mem[2] = IFP_LOGICAL_TABLE_SELECT_TCAM_ONLYm;
  29670           tcam_mem[3] = IFP_TCAMm;
  29671           tcam_mem[4] = IFP_TCAM_WIDEm;
  29672           num_tcam = 5;
  29673           break;
  29674      case _BCM_FIELD_STAGE_EGRESS:
  29675           tcam_mem[0] = EFP_TCAMm;
  29676           num_tcam = 1;
  29677           break;
  29678      case _BCM_FIELD_STAGE_EXACTMATCH:
  29679           tcam_mem[0] = EXACT_MATCH_LOGICAL_TABLE_SELECTm;
  29680           tcam_mem[1] = EXACT_MATCH_LOGICAL_TABLE_SELECT_TCAM_ONLYm;
  29681           num_tcam = 2;
  29682           break;
  29683      case _BCM_FIELD_STAGE_CLASS:
  29684           tcam_mem[0] = SRC_COMPRESSIONm;
  29685           tcam_mem[1] = SRC_COMPRESSION_TCAM_ONLYm;
  29686           tcam_mem[2] = DST_COMPRESSIONm;
  29687           tcam_mem[3] = DST_COMPRESSION_TCAM_ONLYm;
  29688           tcam_mem[4] = TTL_FNm;
  29689           tcam_mem[5] = TOS_FNm;
  29690           tcam_mem[6] = TCP_FNm;
  29691           tcam_mem[7] = IP_PROTO_MAPm;
  29692           num_tcam = 8;
  29693           break;
  29694      default:
  29695           return BCM_E_PARAM;
  29696    }
  29697 
  29698    for (idx = 0; idx < num_tcam; idx++) {
  29699        /* In order to support the bcmFieldQualifyInPorts qualifier in
  29700         * Global Mode, reads/writes on IFP_TCAM_WIDE should always be
  29701         * in per pipe mode.
  29702         */
  29703        if (((IFP_TCAM_WIDEm == tcam_mem[idx]) ||
  29704            ((soc_feature(unit, soc_feature_th3_style_fp)) &&
  29705             (IFP_TCAMm == tcam_mem[idx]))) &&
  29706            (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) {
  29707           set_mode[idx] = _SOC_SER_MEM_MODE_PIPE_UNIQUE;
  29708        } else {
  29709           set_mode[idx] = ser_mode;
  29710        }
  29711    }
  29712 
  29713     SOC_IF_ERROR_RETURN(soc_generic_ser_mem_scan_stop(unit));
  29714     for (ct = 0; num_tcam > 0; ct++,num_tcam--) {
  29715         rv = soc_generic_ser_mem_update(unit, tcam_mem[ct], stage_id, set_mode[ct]);
  29716         if (SOC_FAILURE(rv)) {
  29717             LOG_ERROR(BSL_LS_BCM_FP,
  29718                      (BSL_META_U(unit,
  29719                       "SER memory update failed[%d] to set"
  29720                       " '%s' mode for tcam[%d].\n"),
  29721                       rv,
  29722                      (set_mode[ct] == _SOC_SER_MEM_MODE_GLOBAL)?"Global":"Unique",
  29723                      tcam_mem[ct]));
  29724         }
  29725     }
  29726     SOC_IF_ERROR_RETURN(soc_generic_ser_mem_scan_start(unit));
  29727 
  29728    return BCM_E_NONE;
  29729 }
  29730 
  29731 /*
  29732  * Function:
  29733  *     _bcm_th_field_stage_supported_qset_init
  29734  *
  29735  * Purpose:
  29736  *     Initialize field stages supported qset for each stage
  29737  *
  29738  * Parameters:
  29739  *     unit - (IN) BCM device number.
  29740  *
  29741  * Returns:
  29742  *     BCM_E_NONE   - Success
  29743  *     BCM_E_MEMORY - Allocation failure
  29744  */
  29745 int
  29746 _bcm_th_field_stage_supported_qset_init(int unit, _field_control_t *fc,
  29747                                         _field_stage_t   *stage_fc)
  29748 {
  29749     bcm_field_qset_t *qset;     /* Operation result.              */
  29750     int idx;                    /* Iteration index.               */
  29751     bcmi_keygen_qual_cfg_info_t **qual_cfg_info = NULL;
  29752 
  29753     /* Fill supported qset for each  pipeline stage. */
  29754     qset = &stage_fc->_field_supported_qset;
  29755 
  29756 #if defined (BCM_TOMAHAWK_SUPPORT)
  29757     if ((soc_feature(unit, soc_feature_th3_style_fp)) &&
  29758         ((_BCM_FIELD_STAGE_INGRESS == stage_fc->stage_id) ||
  29759         (_BCM_FIELD_STAGE_EXACTMATCH == stage_fc->stage_id))) {
  29760         if (stage_fc->qual_cfg_info_db != NULL ) {
  29761             for (idx = 0; idx < _bcmFieldQualifyCount; idx++) {
  29762                 if (NULL != stage_fc->qual_cfg_info_db->qual_cfg_info[idx]) {
  29763                     BCM_FIELD_QSET_ADD(*qset,
  29764                         (stage_fc->qual_cfg_info_db->qual_cfg_info[idx])->qual);
  29765                 }
  29766             }
  29767         }
  29768     } else
  29769 #endif
  29770     {
  29771         if (stage_fc->f_qual_arr != NULL ) {
  29772             for (idx = 0; idx < _bcmFieldQualifyCount; idx++) {
  29773                 if (NULL != stage_fc->f_qual_arr[idx]) {
  29774                     BCM_FIELD_QSET_ADD(*qset, (stage_fc->f_qual_arr[idx])->qid);
  29775                 }
  29776             }
  29777 #if defined(BCM_TOMAHAWK_SUPPORT)
  29778         } else if (stage_fc->qual_cfg_info_db != NULL) {
  29779             qual_cfg_info = stage_fc->qual_cfg_info_db->qual_cfg_info;
  29780             for (idx = 0; idx < BCM_FIELD_QUALIFY_MAX; idx++) {
  29781                 if (NULL != qual_cfg_info[idx]) {
  29782                     BCM_FIELD_QSET_ADD(*qset, (qual_cfg_info[idx])->qual);
  29783                 }
  29784             }
  29785 #endif
  29786        }
  29787    }
  29788 
  29789     return (BCM_E_NONE);
  29790 }
  29791 
  29792 
  29793 /*
  29794  * Function:
  29795  *      _bcm_field_wb_group_oper_mode_set
  29796  * Purpose:
  29797  *      Configure Field Processor Group operational mode
  29798  *      per-CAP stage.
  29799  * Parameters:
  29800  *      unit    - (IN) BCM Device number.
  29801  *      stage   - (IN) Field Stage Pipeline Qualifier enum value.
  29802  *      mode    - (IN) Field Group Operational Mode enum value.
  29803  * Returns:
  29804  *      BCM_E_NONE   - Operation successful.
  29805  *      BCM_E_PARAM  - Invalid operational mode or Field Stage.
  29806  *      BCM_E_INIT   - BCM unit not initialized.
  29807  *      BCM_E_BUSY   - Field stage has valid group/entry configured.
  29808  *
  29809  * Notes:
  29810  *      Valid "stage" input parameter values supported by
  29811  *      this API are:
  29812  *              "bcmFieldQualifyStageLookup"
  29813  * 	        "bcmFieldQualifyStageIngress"
  29814  *              "bcmFieldQualifyStageEgress"
  29815  *              "bcmFieldQualifyStageExactMatch".
  29816  */
  29817 
  29818 int
  29819 _bcm_field_wb_group_oper_mode_set(
  29820     int unit,
  29821     bcm_field_qualify_t stage,
  29822     _field_stage_t     **stage_fc,
  29823     bcm_field_group_oper_mode_t mode)
  29824 {
  29825    _field_control_t   *fc;          /* Field control structure. */
  29826    _field_stage_id_t  stage_id;     /* Pipeline stage id */
  29827    _field_group_t     *fg;          /* Field group structure */
  29828     int               rv;           /* Return Value */
  29829 
  29830    /* Validate input parameters */
  29831    if ((mode != bcmFieldGroupOperModeGlobal) &&
  29832        (mode != bcmFieldGroupOperModePipeLocal)) {
  29833       return BCM_E_PARAM;
  29834    }
  29835 
  29836    /* Update stage_id and tcam memory for the given stage */
  29837    switch (stage) {
  29838      case bcmFieldQualifyStageLookup:
  29839           stage_id = _BCM_FIELD_STAGE_LOOKUP;
  29840           break;
  29841      case bcmFieldQualifyStageIngress:
  29842           stage_id = _BCM_FIELD_STAGE_INGRESS;
  29843           break;
  29844      case bcmFieldQualifyStageEgress:
  29845           stage_id = _BCM_FIELD_STAGE_EGRESS;
  29846           break;
  29847      case bcmFieldQualifyStageIngressExactMatch:
  29848           stage_id = _BCM_FIELD_STAGE_EXACTMATCH;
  29849           break;
  29850      case bcmFieldQualifyStageClass:
  29851           stage_id = _BCM_FIELD_STAGE_CLASS;
  29852           break;
  29853      default:
  29854           return BCM_E_PARAM;
  29855    }
  29856 
  29857    /* Verify whether the mode is already set */
  29858    if ((*stage_fc)->oper_mode == mode) {
  29859       return BCM_E_NONE;
  29860    }
  29861 
  29862    /* Field control structure */
  29863    BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  29864 
  29865    /* Verify whether stage related group/entry is configured */
  29866    fg = fc->groups;
  29867    while (NULL != fg) {
  29868       if (fg->stage_id == stage_id) {
  29869          /* can't modify the stage as a group already exists */
  29870          return BCM_E_BUSY;
  29871       }
  29872       fg = fg->next;
  29873    }
  29874 
  29875    /* To reinitialize the stage, first delete the stage. */
  29876    rv = _field_th_stage_delete(unit, fc, *stage_fc);
  29877    if (BCM_FAILURE(rv)) {
  29878         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  29879             "FP(unit %d) Error: Stage=%d Delete failed = %d.\n"),
  29880             unit, (*stage_fc)->stage_id, rv));
  29881         return (rv);
  29882    }
  29883 
  29884 #if defined(BCM_TRIDENT3_SUPPORT)
  29885     if (soc_feature(unit, soc_feature_td3_style_fp) &&
  29886         ((stage_id == _BCM_FIELD_STAGE_INGRESS) ||
  29887          (stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) {
  29888         BCM_IF_ERROR_RETURN(_bcm_field_td3_flex_qual_ceh_db_init(unit));
  29889     }
  29890 #endif /* BCM_TRIDENT3_SUPPORT */
  29891 
  29892    /*
  29893     * Add the stage back. Stage structure is allocated in this function hence
  29894     * pass the stage ID as input parameter to this function.
  29895     * The oper_mode is updated in this function.
  29896     */
  29897    rv = _field_th_stage_add(unit, fc, stage_id, mode);
  29898    if (BCM_FAILURE(rv)) {
  29899         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  29900             "FP(unit %d) Error: Stage=%d Add failed = %d.\n"),
  29901                                          unit, stage_id, rv));
  29902         return (rv);
  29903    }
  29904 
  29905    /* SER initialization */
  29906    BCM_IF_ERROR_RETURN(_field_ser_oper_mode_init(unit, stage_id, mode));
  29907 
  29908    BCM_IF_ERROR_RETURN
  29909       (_field_stage_control_get(unit, stage_id, stage_fc));
  29910 
  29911    /* Initialize qualifiers info. */
  29912    BCM_IF_ERROR_RETURN(_field_th_qualifiers_init(unit, *stage_fc));
  29913 
  29914    /* Initialize stage actions information. */
  29915    BCM_IF_ERROR_RETURN(_field_th_actions_init(unit, *stage_fc));
  29916 
  29917    /* Initialize supported qset for each stage. */
  29918    BCM_IF_ERROR_RETURN(_bcm_th_field_stage_supported_qset_init(unit, fc, *stage_fc));
  29919 
  29920 #if defined(BCM_TRIDENT3_SUPPORT)
  29921     if (soc_feature(unit, soc_feature_td3_style_fp) &&
  29922         ((stage_id == _BCM_FIELD_STAGE_INGRESS) ||
  29923          (stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) {
  29924        rv = (_bcm_field_td3_flex_qual_ceh_db_clear(unit));
  29925     }
  29926 #endif
  29927 
  29928    return rv;
  29929 }
  29930 
  29931 int
  29932 _field_th_group_oper_mode_set(
  29933     int unit,
  29934     bcm_field_qualify_t stage,
  29935     bcm_field_group_oper_mode_t mode)
  29936 {
  29937    _field_stage_t     *stage_fc;    /* Stage field control structure. */
  29938    _field_control_t   *fc;          /* Field control structure. */
  29939    _field_stage_id_t  stage_id;     /* Pipeline stage id */
  29940    _field_group_t     *fg;          /* Field group structure */
  29941     int               rv;           /* Return Value */
  29942 
  29943    /* Validate input parameters */
  29944    if ((mode != bcmFieldGroupOperModeGlobal) &&
  29945        (mode != bcmFieldGroupOperModePipeLocal)) {
  29946       return BCM_E_PARAM;
  29947    }
  29948 
  29949    /* Update stage_id and tcam memory for the given stage */
  29950    switch (stage) {
  29951      case bcmFieldQualifyStageLookup:
  29952           stage_id = _BCM_FIELD_STAGE_LOOKUP;
  29953           break;
  29954      case bcmFieldQualifyStageIngress:
  29955           stage_id = _BCM_FIELD_STAGE_INGRESS;
  29956           break;
  29957      case bcmFieldQualifyStageEgress:
  29958           stage_id = _BCM_FIELD_STAGE_EGRESS;
  29959           break;
  29960      case bcmFieldQualifyStageIngressExactMatch:
  29961           stage_id = _BCM_FIELD_STAGE_EXACTMATCH;
  29962           break;
  29963      case bcmFieldQualifyStageClass:
  29964      case bcmFieldQualifyStageClassExactMatch:
  29965           stage_id = _BCM_FIELD_STAGE_CLASS;
  29966           break;
  29967      default:
  29968           return BCM_E_PARAM;
  29969    }
  29970 
  29971    /*
  29972     * Retrieve Field stage control structure,
  29973     * It also return BCM_E_INIT if the field is not initialized.
  29974     */
  29975    BCM_IF_ERROR_RETURN
  29976       (_field_stage_control_get(unit, stage_id, &stage_fc));
  29977 
  29978    /* Verify whether the mode is already set */
  29979    if (stage_fc->oper_mode == mode) {
  29980       return BCM_E_NONE;
  29981    }
  29982 
  29983    /* Field control structure */
  29984    BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  29985 
  29986    /* Restrict EM in per pipe mode for TH3 */
  29987 #if defined (BCM_TOMAHAWK3_SUPPORT)
  29988    if (soc_feature(unit, soc_feature_th3_style_fp)) {
  29989        if ((stage_id == _BCM_FIELD_STAGE_EXACTMATCH) &&
  29990               (mode == bcmFieldGroupOperModePipeLocal)) {
  29991            LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  29992                            "FP(unit %d) Error: Exact Match Stage Per Pipe Mode Not Supported.\n"),
  29993                        unit));
  29994            return (BCM_E_UNAVAIL);
  29995        }
  29996    }
  29997 #endif
  29998 
  29999    /* Verify whether stage related group/entry is configured */
  30000    fg = fc->groups;
  30001    while (NULL != fg) {
  30002        if (fg->stage_id == stage_id) {
  30003            return BCM_E_BUSY;
  30004        }
  30005        fg = fg->next;
  30006    }
  30007 
  30008    switch (stage_fc->oper_mode) {
  30009         case bcmFieldGroupOperModeGlobal:
  30010             /* Clear hardware table */
  30011             BCM_IF_ERROR_RETURN(_field_th_hw_clear(unit, stage_fc, fc));
  30012             break;
  30013         case bcmFieldGroupOperModePipeLocal:
  30014             /* Clear hardware table */
  30015             BCM_IF_ERROR_RETURN(_field_th_pipes_hw_clear(unit, stage_fc, fc));
  30016             break;
  30017         default:
  30018             return BCM_E_INTERNAL;
  30019    }
  30020 
  30021    /* To reinitialize the stage, first delete the stage. */
  30022    rv = _field_th_stage_delete(unit, fc, stage_fc);
  30023    if (BCM_FAILURE(rv)) {
  30024         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  30025             "FP(unit %d) Error: Stage=%d Delete failed = %d.\n"),
  30026             unit, stage_fc->stage_id, rv));
  30027         return (rv);
  30028    }
  30029 
  30030 #if defined(BCM_TRIDENT3_SUPPORT)
  30031     if (soc_feature(unit, soc_feature_td3_style_fp) &&
  30032         ((stage_id == _BCM_FIELD_STAGE_INGRESS) ||
  30033          (stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) {
  30034         BCM_IF_ERROR_RETURN(_bcm_field_td3_flex_qual_ceh_db_init(unit));
  30035     }
  30036 #endif /* BCM_TRIDENT3_SUPPORT */
  30037 
  30038    /*
  30039     * Add the stage back. Stage structure is allocated in this function hence
  30040     * pass the stage ID as input parameter to this function.
  30041     * The oper_mode is updated in this function.
  30042     */
  30043    rv = _field_th_stage_add(unit, fc, stage_id, mode);
  30044    if (BCM_FAILURE(rv)) {
  30045         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  30046             "FP(unit %d) Error: Stage=%d Add failed = %d.\n"),
  30047                                          unit, stage_id, rv));
  30048         goto cleanup;
  30049    }
  30050 
  30051    /* SER initialization */
  30052    rv = (_field_ser_oper_mode_init(unit, stage_id, mode));
  30053    if (BCM_FAILURE(rv)) {
  30054        goto cleanup;
  30055    }
  30056 
  30057    rv = (_field_stage_control_get(unit, stage_id, &stage_fc));
  30058    if (BCM_FAILURE(rv)) {
  30059        goto cleanup;
  30060    }
  30061 
  30062    switch (stage_fc->oper_mode) {
  30063         case bcmFieldGroupOperModeGlobal:
  30064             /* Clear hardware table */
  30065             rv = (_field_th_hw_clear(unit, stage_fc, fc));
  30066             break;
  30067         case bcmFieldGroupOperModePipeLocal:
  30068             /* Clear hardware table */
  30069             rv = (_field_th_pipes_hw_clear(unit, stage_fc, fc));
  30070             break;
  30071         default:
  30072             rv = BCM_E_INTERNAL;
  30073             break;
  30074    }
  30075 
  30076    if (BCM_FAILURE(rv)) {
  30077        goto cleanup;
  30078    }
  30079 
  30080    if ((stage_id == _BCM_FIELD_STAGE_INGRESS) ||
  30081         (stage_id == _BCM_FIELD_STAGE_EXACTMATCH)) {
  30082        /* Match ID width partition for each zone */
  30083        if (fc->functions.fp_zone_match_id_partition_init != NULL) {
  30084           fc->functions.fp_zone_match_id_partition_init(unit, stage_fc);
  30085        }
  30086    }
  30087 
  30088    /* Initialize qualifiers info. */
  30089    rv = (_field_th_qualifiers_init(unit, stage_fc));
  30090    if (BCM_FAILURE(rv)) {
  30091        goto cleanup;
  30092    }
  30093 
  30094    /* Initialize stage actions information. */
  30095    rv = (_field_th_actions_init(unit, stage_fc));
  30096    if (BCM_FAILURE(rv)) {
  30097        goto cleanup;
  30098    }
  30099 
  30100    /* IFP and EXACTMATCH stages are non-correlative if FLOWTRACKER_ENABLE is enabled*/
  30101    if ((stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) &&
  30102        soc_feature(unit, soc_feature_field_exact_match_support)){
  30103        /* Update exact match input bus when ingress oper mode is changed. */
  30104        rv = (_field_th_emstage_update(unit, stage_fc));
  30105        if (BCM_FAILURE(rv)) {
  30106           goto cleanup;
  30107        }
  30108    }
  30109 
  30110    /* Initialize supported qset for each stage seperately */
  30111    rv = (_bcm_th_field_stage_supported_qset_init(unit, fc, stage_fc));
  30112    if (BCM_FAILURE(rv)) {
  30113        goto cleanup;
  30114    }
  30115 
  30116 cleanup:
  30117 #if defined(BCM_TRIDENT3_SUPPORT)
  30118     if (soc_feature(unit, soc_feature_td3_style_fp) &&
  30119         ((stage_id == _BCM_FIELD_STAGE_INGRESS) ||
  30120          (stage_id == _BCM_FIELD_STAGE_EXACTMATCH))) {
  30121        rv = (_bcm_field_td3_flex_qual_ceh_db_clear(unit));
  30122     }
  30123 #endif
  30124 
  30125    return rv;
  30126 }
  30127 
  30128 /*
  30129  * Function:
  30130  *      _bcm_field_th_group_oper_mode_set
  30131  * Purpose:
  30132  *      Configure Field Processor Group operational mode
  30133  *      per-CAP stage.
  30134  * Parameters:
  30135  *      unit    - (IN) BCM Device number.
  30136  *      stage   - (IN) Field Stage Pipeline Qualifier enum value.
  30137  *      mode    - (IN) Field Group Operational Mode enum value.
  30138  * Returns:
  30139  *      BCM_E_NONE   - Operation successful.
  30140  *      BCM_E_PARAM  - Invalid operational mode or Field Stage.
  30141  *      BCM_E_INIT   - BCM unit not initialized.
  30142  *      BCM_E_BUSY   - Field stage has valid group/entry configured.
  30143  *
  30144  * Notes:
  30145  *      Valid "stage" input parameter values supported by
  30146  *      this API are:
  30147  *              "bcmFieldQualifyStageLookup"
  30148  * 	            "bcmFieldQualifyStageIngress"
  30149  *              "bcmFieldQualifyStageEgress"
  30150  *              "bcmFieldQualifyStageIngressExactMatch"
  30151  *              "bcmFieldQualifyStageClass"
  30152  *              "bcmFieldQualifyStageClassExactMatch".
  30153  *              "bcmFieldQualifyStageIngressFlowtracker."
  30154  */
  30155 int
  30156 _bcm_field_th_group_oper_mode_set(
  30157     int unit,
  30158     bcm_field_qualify_t stage,
  30159     bcm_field_group_oper_mode_t mode)
  30160 {
  30161     BCM_IF_ERROR_RETURN(_field_th_group_oper_mode_set(unit, stage, mode));
  30162     return BCM_E_NONE;
  30163 }
  30164 /*
  30165  * Function:
  30166  *      _bcm_field_th_group_oper_mode_get
  30167  * Purpose:
  30168  *      Retrieve Field Processor Group operational mode
  30169  *      per-CAP stage.
  30170  * Parameters:
  30171  *      unit    - (IN)  BCM Device number.
  30172  *      stage   - (IN)  Field Stage Pipeline Qualifier enum value.
  30173  *      mode    - (OUT) Reference to Field Group Operational
  30174  *                      Mode enum value.
  30175  * Returns:
  30176  *      BCM_E_NONE   - Operation successful.
  30177  *      BCM_E_PARAM  - Invalid parameter.
  30178  *      BCM_E_INIT   - BCM unit not initialized.
  30179  *
  30180  * Notes:
  30181  *      Valid "stage" input parameter values supported by
  30182  *      this API are:
  30183  *              "bcmFieldQualifyStageLookup"
  30184  * 	            "bcmFieldQualifyStageIngress"
  30185  *              "bcmFieldQualifyStageEgress"
  30186  *              "bcmFieldQualifyStageIngressExactMatch"
  30187  *              "bcmFieldQualifyStageClass"
  30188  *              "bcmFieldQualifyStageClassExactMatch."
  30189  *              "bcmFieldQualifyStageIngressFlowtracker."
  30190  */
  30191 
  30192 int
  30193 _bcm_field_th_group_oper_mode_get(
  30194     int unit,
  30195     bcm_field_qualify_t stage,
  30196     bcm_field_group_oper_mode_t *mode)
  30197 {
  30198    _field_stage_t     *stage_fc; /* Stage field control structure. */
  30199    _field_stage_id_t  stage_id;  /* Pipeline stage id */
  30200 
  30201    /* Validate input parameters */
  30202    if (mode == NULL) {
  30203       return BCM_E_PARAM;
  30204    }
  30205 
  30206    switch (stage) {
  30207      case bcmFieldQualifyStageLookup:
  30208           stage_id = _BCM_FIELD_STAGE_LOOKUP;
  30209           break;
  30210      case bcmFieldQualifyStageIngress:
  30211           stage_id = _BCM_FIELD_STAGE_INGRESS;
  30212           break;
  30213      case bcmFieldQualifyStageEgress:
  30214           stage_id = _BCM_FIELD_STAGE_EGRESS;
  30215           break;
  30216      case bcmFieldQualifyStageClass:
  30217      case bcmFieldQualifyStageClassExactMatch:
  30218           stage_id = _BCM_FIELD_STAGE_CLASS;
  30219           break;
  30220      case bcmFieldQualifyStageIngressExactMatch:
  30221           stage_id = _BCM_FIELD_STAGE_EXACTMATCH;
  30222           break;
  30223      case bcmFieldQualifyStageIngressFlowtracker:
  30224           stage_id = _BCM_FIELD_STAGE_FLOWTRACKER;
  30225           break;
  30226      default:
  30227           return BCM_E_PARAM;
  30228           break;
  30229    }
  30230 
  30231    /*
  30232     * Retrieve Field stage control structure,
  30233     * It also return BCM_E_INIT if the field is not initialized.
  30234     */
  30235    BCM_IF_ERROR_RETURN
  30236       (_field_stage_control_get (unit, stage_id, &stage_fc));
  30237 
  30238    /* update the mode */
  30239    *mode = stage_fc->oper_mode;
  30240    return BCM_E_NONE;
  30241 }
  30242 
  30243 /*
  30244  * Function:
  30245  *     _field_th_ingress_slice_enable_set
  30246  *
  30247  * Purpose:
  30248  *     Enables or disables packet lookup on a hardware slice
  30249  *     and configures the slice mode.
  30250  *
  30251  * Parameters:
  30252  *     unit     - (IN) BCM device number.
  30253  *     fg       - (IN) Reference to Group Structure.
  30254  *     fs       - (IN) Reference to Slice Structure.
  30255  *     enable   - (IN) enable/disable state of slice.
  30256  *
  30257  * Returns:
  30258  *     BCM_E_NONE      - Success
  30259  *     BCM_E_INTERNAL  - SOC read/write error
  30260  *
  30261  * Note:
  30262  *     Calling function is responsible for checking feature availability.
  30263  */
  30264 
  30265 int
  30266 _field_th_ingress_slice_enable_set(int            unit,
  30267                                    _field_group_t *fg,
  30268                                    uint8          slice_idx,
  30269                                    uint8          enable)
  30270 {
  30271     uint32              regval_old, regval_new;
  30272     uint8               mode;
  30273     _field_stage_t     *stage_fc;
  30274     soc_reg_t           reg;
  30275     int inst;
  30276 
  30277     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit,
  30278                         _BCM_FIELD_STAGE_INGRESS, &stage_fc));
  30279 
  30280     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  30281        inst = _FP_GLOBAL_INST;
  30282     } else {
  30283        inst = fg->instance;
  30284     }
  30285 
  30286     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, IFP_CONFIGr,
  30287                                                        inst, &reg));
  30288 
  30289     BCM_IF_ERROR_RETURN
  30290        (soc_reg32_get(unit, reg, REG_PORT_ANY, slice_idx, &regval_old));
  30291     regval_new = regval_old;
  30292 
  30293     enable = (enable == 0) ? 0 : 1;
  30294     soc_reg_field_set(unit, reg, &regval_new, IFP_SLICE_ENABLEf, enable);
  30295     soc_reg_field_set(unit, reg, &regval_new, IFP_SLICE_LOOKUP_ENABLEf, enable);
  30296 
  30297     if (!soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) {
  30298 
  30299        /* Determine the slice mode based on group flags. */
  30300        mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(fg->flags) ?
  30301               _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW;
  30302        soc_reg_field_set(unit, reg, &regval_new, IFP_SLICE_MODEf, mode);
  30303     }
  30304 
  30305     if (regval_new != regval_old) {
  30306        BCM_IF_ERROR_RETURN
  30307           (soc_reg32_set(unit, reg, REG_PORT_ANY, slice_idx, regval_new));
  30308     }
  30309 
  30310     return BCM_E_NONE;
  30311 }
  30312 
  30313 /*
  30314  * Function:
  30315  *     _field_th_stage_slice_enable_set
  30316  *
  30317  * Purpose:
  30318  *     Enables or disables packet lookup on a hardware slice for
  30319  *     VFP and EFP stages.
  30320  *
  30321  * Parameters:
  30322  *     unit     - (IN) BCM device number.
  30323  *     fg       - (IN) Reference to Group Structure.
  30324  *     fs       - (IN) Reference to Slice Structure.
  30325  *     enable   - (IN) enable/disable state of slice.
  30326  *
  30327  * Returns:
  30328  *     BCM_E_NONE      - Success
  30329  *     BCM_E_INTERNAL  - SOC read/write error
  30330  *
  30331  * Note:
  30332  *     Calling function is responsible for checking feature availability.
  30333  */
  30334 int
  30335 _field_th_stage_slice_enable_set(int unit, _field_group_t *fg,
  30336                                  int slice, int enable)
  30337 {
  30338     int                 inst;
  30339     soc_reg_t           reg;
  30340     _field_stage_t     *stage_fc;
  30341     uint32              val;
  30342 
  30343     static soc_field_t lookup_enable_field[4] = {LOOKUP_ENABLE_SLICE_0f,
  30344                                                 LOOKUP_ENABLE_SLICE_1f,
  30345                                                 LOOKUP_ENABLE_SLICE_2f,
  30346                                                 LOOKUP_ENABLE_SLICE_3f};
  30347 
  30348     static soc_field_t slice_enable_field[4] = {SLICE_ENABLE_SLICE_0f,
  30349                                                 SLICE_ENABLE_SLICE_1f,
  30350                                                 SLICE_ENABLE_SLICE_2f,
  30351                                                 SLICE_ENABLE_SLICE_3f};
  30352 
  30353     if (NULL == fg) {
  30354         return (BCM_E_PARAM);
  30355     }
  30356 
  30357     /* Validate slice. */
  30358     if (slice < 0 || slice >= COUNTOF(slice_enable_field)) {
  30359         return (BCM_E_PARAM);
  30360     }
  30361 
  30362     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit,
  30363                         fg->stage_id, &stage_fc));
  30364 
  30365     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  30366        inst = _FP_GLOBAL_INST;
  30367     } else {
  30368        inst = fg->instance;
  30369     }
  30370 
  30371     switch (fg->stage_id) {
  30372         case _BCM_FIELD_STAGE_LOOKUP:
  30373              BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  30374                                                        VFP_SLICE_CONTROLr,
  30375                                                        inst, &reg));
  30376              break;
  30377         case _BCM_FIELD_STAGE_EGRESS:
  30378              BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  30379                                                        EFP_SLICE_CONTROLr,
  30380                                                        inst, &reg));
  30381             break;
  30382         default:
  30383             return BCM_E_INTERNAL;
  30384     }
  30385 
  30386     val = (enable ? 1 : 0);
  30387 
  30388     /* SW WAR for TH3-5323 */
  30389     if ((soc_feature(unit, soc_feature_th3_style_fp)) &&
  30390          (fg->stage_id == _BCM_FIELD_STAGE_LOOKUP)) {
  30391 
  30392           BCM_IF_ERROR_RETURN(soc_reg_fields32_modify(unit, reg, REG_PORT_ANY, 1,
  30393                                               &slice_enable_field[slice], &val));
  30394     }
  30395 
  30396     BCM_IF_ERROR_RETURN(soc_reg_fields32_modify(unit, reg, REG_PORT_ANY, 1,
  30397                                         &lookup_enable_field[slice], &val));
  30398 
  30399     return (BCM_E_NONE);
  30400 }
  30401 
  30402 /*
  30403  * Function:
  30404  *     _bcm_field_th_slice_enable_set
  30405  *
  30406  * Purpose:
  30407  *     Enables or disables packet lookup on a hardware slice.
  30408  *
  30409  * Parameters:
  30410  *     unit     - (IN) BCM device number
  30411  *     fg       - (IN) Reference to Group Structure.
  30412  *     fs       - (IN) Reference to Slice Structure.
  30413  *     enable   - (IN) enable/disable state of slice.
  30414  *
  30415  * Returns:
  30416  *     BCM_E_NONE      - SUCCESS
  30417  *     BCM_E_INTERNAL  - SOC read/write error
  30418  *
  30419  * Note:
  30420  *     Calling function is responsible for checking feature availability.
  30421  */
  30422 int
  30423 _bcm_field_th_slice_enable_set(int                unit,
  30424                                _field_group_t     *fg,
  30425                                _field_slice_t     *fs,
  30426                                 uint8             enable)
  30427 {
  30428     if (NULL == fg || NULL == fs) {
  30429         return (BCM_E_PARAM);
  30430     }
  30431 
  30432     switch (fg->stage_id) {
  30433         case _BCM_FIELD_STAGE_INGRESS:
  30434              return
  30435                 (_field_th_ingress_slice_enable_set(unit, fg,
  30436                                                     fs->slice_number, enable));
  30437              break;
  30438         case _BCM_FIELD_STAGE_LOOKUP:
  30439         case _BCM_FIELD_STAGE_EGRESS:
  30440              return
  30441                 (_field_th_stage_slice_enable_set(unit, fg,
  30442                                                   fs->slice_number, enable));
  30443              break;
  30444         default:
  30445              LOG_VERBOSE(BSL_LS_BCM_FP, (BSL_META(
  30446                          "Invalid stage_id[%d].\n\r"),
  30447                          fg->stage_id));
  30448              break;
  30449     }
  30450 
  30451     return BCM_E_INTERNAL;
  30452 }
  30453 
  30454 /*
  30455  * Function:
  30456  *     _bcm_field_th_qualify_class
  30457  * Purpose:
  30458  *     Qualifies field entry classifier id data and mask value
  30459  * Parameters:
  30460  *     unit  - (IN) BCM device number
  30461  *     entry - (IN) Field entry identifier
  30462  *     data  - (IN) Classifier ID lookup key value
  30463  *     mask  - (IN) Classifier ID lookup mask value
  30464  * Returns:
  30465  *     BCM_E_XXXX
  30466  */
  30467 int
  30468 _bcm_field_th_qualify_class(int unit,
  30469                             bcm_field_entry_t entry,
  30470                             bcm_field_qualify_t qual,
  30471                             uint32 *data,
  30472                             uint32 *mask)
  30473 {
  30474     _field_entry_t *f_ent;
  30475     uint32 cl_width, cl_max;
  30476     uint32 ifp_cl_type; /* IFP Class Type propagted to EFP. */
  30477 
  30478     /* Get field entry part that contains the qualifier. */
  30479     BCM_IF_ERROR_RETURN(_bcm_field_entry_qual_get(unit, entry, qual, &f_ent));
  30480 
  30481     switch (f_ent->group->stage_id) {
  30482         case _BCM_FIELD_STAGE_INGRESS:
  30483         case _BCM_FIELD_STAGE_EXACTMATCH:
  30484         case _BCM_FIELD_STAGE_FLOWTRACKER:
  30485             switch (qual) {
  30486                 /* Class IDs from L2 Entry Table (10) */
  30487                 case bcmFieldQualifySrcClassL2:
  30488                 case bcmFieldQualifyDstClassL2:
  30489                     cl_width = 10;
  30490                     break;
  30491                 /* Class fields from VFP_CLASS_ID_HI */
  30492                 case bcmFieldQualifySrcClassField:
  30493                 /* Class fields from VFP_CLASS_ID_L0 */
  30494                 case bcmFieldQualifyDstClassField:
  30495                     cl_width = 10;
  30496                     break;
  30497                 /* Class IDs from L3 Entry table (12) */
  30498                 case bcmFieldQualifySrcClassL3:
  30499                     cl_width = 10;
  30500                     break;
  30501                 case bcmFieldQualifyDstClassL3:
  30502                     cl_width = 10;
  30503                     break;
  30504                 /* Class ID from VLAN table (12) */
  30505                 case bcmFieldQualifyInterfaceClassL2:
  30506                 /* Class ID from L3_IIF (12) */
  30507                 case bcmFieldQualifyInterfaceClassL3:
  30508                 /* Class ID from Port Table (12) */
  30509                 case bcmFieldQualifyInterfaceClassPort:
  30510                 /* Class ID from SVP (12) */
  30511                 case bcmFieldQualifyInterfaceClassVPort:
  30512                     cl_width = 12;
  30513                     break;
  30514                 case bcmFieldQualifyGroupClass:
  30515                     cl_width = 2;
  30516                     break;
  30517                 case bcmFieldQualifyUdfClass:
  30518                 case bcmFieldQualifyInterfaceLookupClassPort:
  30519                 case bcmFieldQualifyInterfaceIngressKeySelectClassPort:
  30520                     cl_width = 8;
  30521                     break;
  30522                 default:
  30523                     return (BCM_E_INTERNAL);
  30524             }
  30525 
  30526             cl_max = 1 << cl_width;
  30527 
  30528             if (*data >= cl_max) {
  30529                 return (BCM_E_PARAM);
  30530             }
  30531             break;
  30532 
  30533         case _BCM_FIELD_STAGE_LOOKUP:
  30534              return
  30535                 (_bcm_field_td2_qualify_class(unit, entry, qual,
  30536                                               data, mask));
  30537         case _BCM_FIELD_STAGE_EGRESS:
  30538             cl_width = 9;
  30539             /* Need to set IFP_CLASS_TYPE in TCAM (upper 4 bits) */
  30540             switch (qual) {
  30541                 case bcmFieldQualifySrcClassL2:
  30542                     ifp_cl_type = 6;
  30543                     break;
  30544                 case bcmFieldQualifySrcClassL3:
  30545                     ifp_cl_type = 8;
  30546                     break;
  30547                 case bcmFieldQualifySrcClassField:
  30548                     ifp_cl_type = 4;
  30549                     break;
  30550                 case bcmFieldQualifyDstClassL2:
  30551                     ifp_cl_type = 7;
  30552                     break;
  30553                 case bcmFieldQualifyDstClassL3:
  30554                     ifp_cl_type = 9;
  30555                     break;
  30556                 case bcmFieldQualifyDstClassField:
  30557                     ifp_cl_type = 5;
  30558                     break;
  30559                 case bcmFieldQualifyInterfaceClassL2:
  30560                     ifp_cl_type = 10;
  30561                     break;
  30562                 case bcmFieldQualifyInterfaceClassL3:
  30563                     ifp_cl_type = 3;
  30564                     break;
  30565                 case bcmFieldQualifyIngressClassField:
  30566                     ifp_cl_type = 15;
  30567                     break;
  30568                 case bcmFieldQualifyIngressInterfaceClassPort:
  30569                     ifp_cl_type = 1;
  30570                     break;
  30571                 case bcmFieldQualifyIngressInterfaceClassVPort:
  30572                     ifp_cl_type = 2;
  30573                     break;
  30574                 case bcmFieldQualifyEgressClass:
  30575                 case bcmFieldQualifyEgressClassL3Interface:
  30576                 case bcmFieldQualifyEgressClassTrill:
  30577                 case bcmFieldQualifyEgressClassL2Gre:
  30578                 case bcmFieldQualifyEgressClassVxlan:
  30579                 case bcmFieldQualifyEgressClassTunnel:
  30580                 case bcmFieldQualifyEgressClassL3InterfaceTunnel:
  30581 
  30582                     cl_width = 12;
  30583                     ifp_cl_type = 0;
  30584                     break;
  30585                 default:
  30586                     return (BCM_E_INTERNAL);
  30587             }
  30588 
  30589             cl_max   = 1 << cl_width;
  30590 
  30591             if (*data >= cl_max || (*mask != BCM_FIELD_EXACT_MATCH_MASK && *mask >= cl_max)) {
  30592                 return (BCM_E_PARAM);
  30593             }
  30594 
  30595             if (ifp_cl_type) {
  30596                 *data |= ifp_cl_type << cl_width;
  30597                 *mask |= 0xf << cl_width;
  30598             }
  30599             break;
  30600         default:
  30601             return (BCM_E_INTERNAL);
  30602     }
  30603 
  30604     return (BCM_E_NONE);
  30605 }
  30606 
  30607 /*
  30608  * Function:
  30609  *     _bcm_field_th_qualify_class_get
  30610  * Purpose:
  30611  *     Retrieve field entry classifier id data and mask values
  30612  * Parameters:
  30613  *     unit  - (IN) BCM device number
  30614  *     entry - (IN) Field entry identifier
  30615  *     qual  - (IN) Field entry qualifier enumeration
  30616  *     data  - (IN/OUT) Classifier ID lookup key value
  30617  *     mask  - (IN/OUT) Classifier ID lookup mask value
  30618  * Returns:
  30619  *     BCM_E_XXXX
  30620  */
  30621 int
  30622 _bcm_field_th_qualify_class_get(int unit,
  30623                                  bcm_field_entry_t entry,
  30624                                  bcm_field_qualify_t qual,
  30625                                  uint32 *data,
  30626                                  uint32 *mask
  30627                                  )
  30628 {
  30629     _field_entry_t *f_ent;
  30630     const uint32 m = (1 << 9) - 1;
  30631 
  30632     /* Get field entry part that contains the qualifier. */
  30633     BCM_IF_ERROR_RETURN(_bcm_field_entry_qual_get(unit, entry, qual, &f_ent));
  30634 
  30635     if (f_ent->group->stage_id == _BCM_FIELD_STAGE_EGRESS) {
  30636         switch (qual) {
  30637             case bcmFieldQualifySrcClassL2:
  30638             case bcmFieldQualifySrcClassL3:
  30639             case bcmFieldQualifySrcClassField:
  30640             case bcmFieldQualifyDstClassL2:
  30641             case bcmFieldQualifyDstClassL3:
  30642             case bcmFieldQualifyDstClassField:
  30643             case bcmFieldQualifyInterfaceClassL2:
  30644             case bcmFieldQualifyInterfaceClassL3:
  30645             case bcmFieldQualifyIngressClassField:
  30646             case bcmFieldQualifyIngressInterfaceClassPort:
  30647             case bcmFieldQualifyIngressInterfaceClassVPort:
  30648                 /* Mask off IFP_CLASSID_TYPE */
  30649                 *data &= m;
  30650                 *mask &= m;
  30651                 break;
  30652             default:
  30653                 break;
  30654         }
  30655     }
  30656 
  30657     return (BCM_E_NONE);
  30658 }
  30659 
  30660 /*
  30661  * Function: _bcm_field_th_ForwardingType_set
  30662  *
  30663  * Purpose:
  30664  *     Add qualification data to an entry for IP Type.
  30665  *
  30666  * Parameters:
  30667  *     unit     - (IN) BCM unit number.
  30668  *     stage_id - (IN) Stage ID.
  30669  *     entry    - (IN) Entry ID.
  30670  *     type     - (IN) Forwarding type.
  30671  *     data     - (OUT) Data.
  30672  *     mask     - (OUT) Mask.
  30673  *
  30674  * Returns:
  30675  *     BCM_E_XXX
  30676  */
  30677 int
  30678 _bcm_field_th_forwardingType_set(int unit, _field_stage_id_t stage_id,
  30679                                  bcm_field_entry_t entry,
  30680                                  bcm_field_ForwardingType_t type,
  30681                                  uint32 *data, uint32 *mask)
  30682 {
  30683 
  30684     if (NULL == data || NULL == mask) {
  30685        return BCM_E_PARAM;
  30686     }
  30687 
  30688     switch (stage_id) {
  30689        case _BCM_FIELD_STAGE_INGRESS:
  30690        case _BCM_FIELD_STAGE_EXACTMATCH:
  30691            switch (type) {
  30692             case bcmFieldForwardingTypeAny:
  30693                 *data = 0;
  30694                 *mask = 0;
  30695                 break;
  30696             case bcmFieldForwardingTypeL2:
  30697                 *data = 0;
  30698                 *mask = 0xE;
  30699                 break;
  30700             case bcmFieldForwardingTypeL2Independent:
  30701                 *data = 0;
  30702                 *mask = 0xF;
  30703                 break;
  30704             case bcmFieldForwardingTypeL2Shared:
  30705                 *data = 1;
  30706                 *mask = 0xF;
  30707                 break;
  30708             case bcmFieldForwardingTypeL2Vpn:
  30709                 *data = 2;
  30710                 *mask = 0xF;
  30711                 break;
  30712             case bcmFieldForwardingTypeL2VpnDirect:
  30713                 *data = 3;
  30714                 *mask = 0xF;
  30715                 break;
  30716             case bcmFieldForwardingTypeL3Direct:
  30717                 *data = 4;
  30718                 *mask = 0xF;
  30719                 break;
  30720             case bcmFieldForwardingTypeL3:
  30721                 *data = 5;
  30722                 *mask = 0xF;
  30723                 break;
  30724             case bcmFieldForwardingTypePortExtender:
  30725                 *data = 6;
  30726                 *mask = 0xF;
  30727                 break;
  30728             case bcmFieldForwardingTypeMpls:
  30729                 *data = 7;
  30730                 *mask = 0xF;
  30731                 break;
  30732             case bcmFieldForwardingTypeTrill:
  30733                 *data = 8;
  30734                 *mask = 0xF;
  30735                 break;
  30736             default:
  30737                return (BCM_E_PARAM);
  30738           }
  30739           break;
  30740       default:
  30741           return BCM_E_INTERNAL;
  30742     }
  30743 
  30744     return BCM_E_NONE;
  30745 }
  30746 
  30747 /*
  30748  * Function:
  30749  *      _bcm_field_th_forwardingType_get
  30750  * Purpose:
  30751  *      Get match criteria for bcmFieildQualifyForwardingType
  30752  *                     qualifier from the field entry.
  30753  * Parameters:
  30754  *      unit     - (IN) Unit number.
  30755  *      stage_id - (IN) Stage ID.
  30756  *      entry    - (IN) BCM field entry id.
  30757  *      type     - (OUT) Qualifier match forwarding type.
  30758  * Returns:
  30759  *      BCM_E_XXX
  30760  * Notes:
  30761  */
  30762 int
  30763 _bcm_field_th_forwardingType_get(int unit, _field_stage_id_t stage_id,
  30764                                  bcm_field_entry_t entry,
  30765                                  uint32 data,  uint32 mask,
  30766                                  bcm_field_ForwardingType_t *type)
  30767 {
  30768     if (NULL == type) {
  30769        return BCM_E_PARAM;
  30770     }
  30771 
  30772     switch (stage_id) {
  30773        case _BCM_FIELD_STAGE_INGRESS:
  30774        case _BCM_FIELD_STAGE_EXACTMATCH:
  30775           if ((0 == data) && (mask == 0)) {
  30776               *type = bcmFieldForwardingTypeAny;
  30777           } else if ((0 == data) && (mask == 0xE)) {
  30778               *type = bcmFieldForwardingTypeL2;
  30779           } else if ((0 == data) && (mask == 0xF)) {
  30780               *type = bcmFieldForwardingTypeL2Independent;
  30781           } else if ((1 == data) && (mask == 0xF)) {
  30782               *type = bcmFieldForwardingTypeL2Shared;
  30783           } else if ((2 == data) && (mask == 0xF)) {
  30784               *type =  bcmFieldForwardingTypeL2Vpn;
  30785           } else if ((3 == data) && (mask == 0xF)) {
  30786               *type = bcmFieldForwardingTypeL2VpnDirect;
  30787           } else if ((4 == data) && (mask == 0xF)) {
  30788               *type = bcmFieldForwardingTypeL3Direct;
  30789           } else if ((5 == data) && (mask == 0xF)) {
  30790               *type = bcmFieldForwardingTypeL3;
  30791           } else if ((6 == data) && (mask == 0xF)) {
  30792               *type = bcmFieldForwardingTypePortExtender;
  30793           } else if ((7 == data) && (mask == 0xF)) {
  30794               *type = bcmFieldForwardingTypeMpls;
  30795           } else if ((8 == data) && (mask == 0xF)) {
  30796               *type = bcmFieldForwardingTypeTrill;
  30797           } else {
  30798               return (BCM_E_INTERNAL);
  30799           }
  30800            break;
  30801        default:
  30802            return BCM_E_INTERNAL;
  30803     }
  30804 
  30805     return BCM_E_NONE;
  30806 }
  30807 
  30808 /*
  30809  * Function:
  30810  *      _bcm_field_th_qualify_svp
  30811  * Purpose:
  30812  *      Add source virtual port field qualification to a field entry.
  30813  * Parameters:
  30814  *      unit  - (IN) Unit number.
  30815  *      entry - (IN) BCM field entry id.
  30816  *      qual  - (IN) SVP Qualifier type
  30817  *      data  - (IN) SVP data
  30818  *      mask  - (IN) SVP Mask
  30819  *      svp_valid - (IN) Indication to SVP Valid field
  30820  * Returns:
  30821  *      BCM_E_XXX
  30822  * Notes:
  30823  */
  30824 int
  30825 _bcm_field_th_qualify_svp(int unit, bcm_field_entry_t entry,
  30826                           bcm_field_qualify_t qual,
  30827                           uint32 data, uint32 mask,
  30828                           int svp_valid)
  30829 {
  30830     int                        rv;        /* Operational Status */
  30831      _field_entry_t            *f_ent;    /* Field entry structure. */
  30832      _bcm_field_qual_offset_t  *q_offset; /* Field qualifier offset info. */
  30833 
  30834      /* Get the field entry operational structure. */
  30835      BCM_IF_ERROR_RETURN(_bcm_field_entry_qual_get(unit, entry,
  30836                                                    qual, &f_ent));
  30837 
  30838      /* Get qualifier offsets in the tcam. */
  30839      rv = _field_qual_offset_get(unit, f_ent, qual, &q_offset);
  30840      BCM_IF_ERROR_RETURN(rv);
  30841 
  30842     if (mask == (uint32)BCM_FIELD_EXACT_MATCH_MASK) {
  30843         uint32 multi_width;
  30844 
  30845         _BCM_FIELD_QUAL_MULTI_OFFSET_WIDTH(q_offset, multi_width);
  30846 
  30847         /* Exact match requested, make maximum mask value */
  30848         mask =  (1 << multi_width) - 1;
  30849     }
  30850 
  30851     /* coverity[address_of : FALSE] */
  30852     /* coverity[callee_ptr_arith : FALSE] */
  30853     rv = _bcm_field_th_qualify_set(unit, entry, qual, &data, &mask,
  30854                                    _FP_QUALIFIER_ADD);
  30855     BCM_IF_ERROR_RETURN(rv);
  30856 
  30857     f_ent->flags |= _FP_ENTRY_DIRTY;
  30858     return (BCM_E_NONE);
  30859 }
  30860 
  30861 /*
  30862  * Function:
  30863  *      _bcm_field_th_qualify_dvp
  30864  * Purpose:
  30865  *      Add destination virtual port field qualification to a field entry.
  30866  * Parameters:
  30867  *      unit  - (IN) Unit number.
  30868  *      entry - (IN) BCM field entry id.
  30869  *      qual  - (IN) SVP Qualifier type
  30870  *      data  - (IN) SVP data
  30871  *      mask  - (IN) SVP Mask
  30872  *      dvp_valid - (IN) Indication to DVP Valid field
  30873  * Returns:
  30874  *      BCM_E_XXX
  30875  * Notes:
  30876  */
  30877 int
  30878 _bcm_field_th_qualify_dvp(int unit,
  30879                           bcm_field_entry_t entry,
  30880                           bcm_field_qualify_t qual,
  30881                           uint32 data, uint32 mask,
  30882                           int dvp_valid)
  30883 {
  30884     int                       rv;        /* Operational Status */
  30885      _field_entry_t            *f_ent;   /* Field entry structure. */
  30886      _bcm_field_qual_offset_t  *q_offset; /* Field qualifier offset info. */
  30887 
  30888 
  30889      /* Get the field entry operational structure. */
  30890      BCM_IF_ERROR_RETURN(_bcm_field_entry_qual_get(unit, entry,
  30891                                                    qual, &f_ent));
  30892 
  30893      /* Get qualifier offsets in the tcam. */
  30894      rv = _field_qual_offset_get(unit, f_ent, qual, &q_offset);
  30895      BCM_IF_ERROR_RETURN(rv);
  30896 
  30897     if (mask == (uint32)BCM_FIELD_EXACT_MATCH_MASK) {
  30898         uint32 multi_width;
  30899 
  30900         _BCM_FIELD_QUAL_MULTI_OFFSET_WIDTH(q_offset, multi_width);
  30901         /* Exact match requested, make maximum mask value */
  30902         mask =  (1 << multi_width) - 1;
  30903     }
  30904 
  30905     /* coverity[address_of : FALSE] */
  30906     /* coverity[callee_ptr_arith : FALSE] */
  30907     rv = _bcm_field_th_qualify_set(unit, entry, qual, &data, &mask,
  30908                                    _FP_QUALIFIER_ADD);
  30909     BCM_IF_ERROR_RETURN(rv);
  30910 
  30911     f_ent->flags |= _FP_ENTRY_DIRTY;
  30912     return (BCM_E_NONE);
  30913 }
  30914 
  30915 /*
  30916  * Function:
  30917  *      _bcm_field_th_qualify_trunk
  30918  * Purpose:
  30919  *      Match on Source or Destination Trunk in Field Processor.
  30920  * Parameters:
  30921  *      unit  - (IN) Unit number.
  30922  *      entry - (IN) BCM field entry id.
  30923  *      qual  - (IN) Trunk Qualifier type
  30924  *      data  - (IN) Trunk data
  30925  *      mask  - (IN) Trunk Mask
  30926  * Returns:
  30927  *      BCM_E_XXX
  30928  * Notes:
  30929  */
  30930 int
  30931 _bcm_field_th_qualify_trunk(int unit,
  30932                             bcm_field_entry_t entry,
  30933                             bcm_field_qualify_t qual,
  30934                             bcm_trunk_t data, bcm_trunk_t mask)
  30935 {
  30936     int              rv;          /* Operational Status. */
  30937     uint32           hw_data = 0; /* HW buffer data. */
  30938     uint32           hw_mask = 0; /* HW buffer mask. */
  30939      _field_entry_t  *f_ent;      /* Field entry structure. */
  30940 
  30941 
  30942     TRUNK_CHK_TGID_EXTENDED(unit, data);
  30943 
  30944     rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent);
  30945     BCM_IF_ERROR_RETURN(rv);
  30946 
  30947     if ((_BCM_FIELD_STAGE_INGRESS == f_ent->group->stage_id) ||
  30948         (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id)) {
  30949 
  30950         /* set the trunk bit */
  30951         hw_data = data | (0x1 << SOC_TRUNK_BIT_POS(unit));
  30952         hw_mask = mask | (0x1 << SOC_TRUNK_BIT_POS(unit));
  30953 
  30954         /* coverity[address_of : FALSE] */
  30955         /* coverity[callee_ptr_arith : FALSE] */
  30956         rv = _bcm_field_th_qualify_set(unit, entry, qual, &hw_data, &hw_mask,
  30957                                        _FP_QUALIFIER_ADD);
  30958         BCM_IF_ERROR_RETURN(rv);
  30959 
  30960         f_ent->flags |= _FP_ENTRY_DIRTY;
  30961     } else {
  30962         return _bcm_field_qualify_trunk(unit, entry, qual, data, mask);
  30963     }
  30964 
  30965     return (BCM_E_NONE);
  30966 }
  30967 
  30968 /*
  30969  * Function:
  30970  *      _bcm_field_th_qualify_trunk_get
  30971  * Purpose:
  30972  *      Get Source or Destination Trunk qualified in Field Processor Key.
  30973  * Parameters:
  30974  *      unit  - (IN) Unit number.
  30975  *      entry - (IN) BCM field entry id.
  30976  *      qual  - (IN) Trunk Qualifier type
  30977  *      data  - (OUT) Trunk data
  30978  *      mask  - (OUT) Trunk Mask
  30979  * Returns:
  30980  *      BCM_E_XXX
  30981  * Notes:
  30982  */
  30983 
  30984 int
  30985 _bcm_field_th_qualify_trunk_get(int unit,
  30986                                 bcm_field_entry_t entry,
  30987                                 bcm_field_qualify_t qual,
  30988                                 bcm_trunk_t *data, bcm_trunk_t *mask)
  30989 {
  30990     int       rv;          /* Operational Status. */
  30991     uint32    hw_data = 0; /* HW buffer data. */
  30992     uint32    hw_mask = 0; /* HW buffer mask. */
  30993     _field_entry_t *f_ent; /* Field entry structure. */
  30994 
  30995 
  30996     /* Input parameters check. */
  30997     if ((NULL == data) || (NULL == mask))  {
  30998         return (BCM_E_PARAM);
  30999     }
  31000 
  31001     if ((qual != bcmFieldQualifySrcTrunk) && (qual != bcmFieldQualifyDstTrunk)) {
  31002         return (BCM_E_INTERNAL);
  31003     }
  31004 
  31005     rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent);
  31006     BCM_IF_ERROR_RETURN(rv);
  31007 
  31008     if ((_BCM_FIELD_STAGE_INGRESS == f_ent->group->stage_id) ||
  31009         (_BCM_FIELD_STAGE_EXACTMATCH == f_ent->group->stage_id)) {
  31010 
  31011         /* Read qualifier match value and mask. */
  31012         rv = _bcm_field_entry_qualifier_uint32_get(unit, entry, qual,
  31013                                                    &hw_data, &hw_mask);
  31014 
  31015         /* set the trunk bit */
  31016         *data = hw_data & ~(0x1 << SOC_TRUNK_BIT_POS(unit));
  31017         *mask = hw_mask & ~(0x1 << SOC_TRUNK_BIT_POS(unit));
  31018 
  31019     } else {
  31020         return _bcm_field_qualify_trunk_get(unit, entry, qual, data, mask);
  31021     }
  31022 
  31023     return (BCM_E_NONE);
  31024 }
  31025 
  31026 /*
  31027  * Function:
  31028  *      _bcm_field_th_qualify_PortBitmap
  31029  * Purpose:
  31030  *      Match on IPBM Source bitmap for the given bitmap.
  31031  * Parameters:
  31032  *      unit  - (IN) Unit number.
  31033  *      entry - (IN) BCM field entry id.
  31034  *      qual  - (IN) IPBM Qualifier type
  31035  *      data  - (IN) IPBM data
  31036  *      mask  - (IN) IPBM Mask
  31037  * Returns:
  31038  *      BCM_E_XXX
  31039  * Notes:
  31040  */
  31041 STATIC int
  31042 _bcm_field_th_qualify_PortBitmap(int unit,
  31043                                  bcm_field_entry_t entry,
  31044                                  bcm_field_qualify_t qual,
  31045                                  bcm_pbmp_t data,
  31046                                  bcm_pbmp_t mask)
  31047 {
  31048     int               rv;          /* Operational Status.           */
  31049     uint8             instance;    /* Field group pipe information. */
  31050     bcm_port_t        port;        /* Holds physical port number.   */
  31051     bcm_pbmp_t        temp_pbm;    /* Holds valid pbm supported.    */
  31052     bcm_pbmp_t        valid_pbm;   /* Holds valid pbm supported     */
  31053     _field_stage_t   *stage_fc;    /* Stage operational Structure.  */
  31054     _field_group_t   *fg;          /* Field group structure.        */
  31055     _field_entry_t   *f_ent;       /* Field entry structure.        */
  31056 
  31057     /* Validate the qualifier. */
  31058     if (!_BCM_FIELD_IS_PBMP_QUALIFIER(qual)) {
  31059         return BCM_E_PARAM;
  31060     }
  31061 
  31062     /* Get field entry structure pointer. */
  31063     rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent);
  31064     BCM_IF_ERROR_RETURN(rv);
  31065 
  31066     fg = f_ent->group;
  31067     /* Get the stage control structure. */
  31068     rv = _field_stage_control_get(unit, fg->stage_id, &stage_fc);
  31069     BCM_IF_ERROR_RETURN(rv);
  31070 
  31071     /* Confirm that InPorts/PortBitmap Qualifiers are in group's Qset. */
  31072     if (!_BCM_FIELD_QSET_PBMP_TEST(fg->qset)) {
  31073         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  31074                   "Error: %s not in Group=%d Qset.\n"),
  31075                   _field_qual_name(qual), fg->gid));
  31076         return (BCM_E_NOT_FOUND);
  31077     }
  31078 
  31079     if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) {
  31080        instance = fg->instance;
  31081     } else {
  31082        /*
  31083         * In-case of Atomic update, InPorts/PortBitmap qualifiers are not
  31084         * support in Global mode.
  31085         */
  31086        if (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == TRUE) {
  31087           return BCM_E_UNAVAIL;
  31088        }
  31089 
  31090        instance = _BCM_FIELD_GLOBAL_GROUP;
  31091     }
  31092 
  31093     BCM_PBMP_CLEAR(valid_pbm);
  31094     /* Retreive Valid PBMP for the given pipe */
  31095     _BCM_FIELD_VALID_PIPE_PBMP_GET(unit, instance, valid_pbm);
  31096 
  31097     /* Validate data */
  31098     BCM_PBMP_ASSIGN(temp_pbm, valid_pbm);
  31099     BCM_PBMP_OR(temp_pbm, data);
  31100     if (BCM_PBMP_NEQ(temp_pbm, valid_pbm)) {
  31101        return BCM_E_PARAM;
  31102     }
  31103 
  31104     /*
  31105      * Check and clear invalid ports in the mask.
  31106      */
  31107     BCM_PBMP_AND(valid_pbm, mask);
  31108     BCM_PBMP_ASSIGN(mask, valid_pbm);
  31109 
  31110     BCM_PBMP_CLEAR(f_ent->pbmp.data);
  31111     BCM_PBMP_CLEAR(f_ent->pbmp.mask);
  31112 
  31113     switch (instance) {
  31114         case _BCM_FIELD_PIPE0_GROUP:
  31115         case _BCM_FIELD_PIPE1_GROUP:
  31116         case _BCM_FIELD_PIPE2_GROUP:
  31117         case _BCM_FIELD_PIPE3_GROUP:
  31118         case _BCM_FIELD_PIPE4_GROUP:
  31119         case _BCM_FIELD_PIPE5_GROUP:
  31120         case _BCM_FIELD_PIPE6_GROUP:
  31121         case _BCM_FIELD_PIPE7_GROUP:
  31122 
  31123             BCM_PBMP_ITER(data, port)  {
  31124                  if ((port - (_FP_TCAM_IPBMP_SIZE(unit) * instance)) < 0) {
  31125                      return BCM_E_PARAM;
  31126                  }
  31127                  BCM_PBMP_PORT_ADD(f_ent->pbmp.data, port -
  31128                                 (_FP_TCAM_IPBMP_SIZE(unit) * f_ent->group->instance));
  31129             }
  31130             BCM_PBMP_ITER(mask, port)  {
  31131                  if ((port - (_FP_TCAM_IPBMP_SIZE(unit) * instance)) < 0) {
  31132                      return BCM_E_PARAM;
  31133                  }
  31134                  BCM_PBMP_PORT_ADD(f_ent->pbmp.mask, port -
  31135                                 (_FP_TCAM_IPBMP_SIZE(unit) * f_ent->group->instance));
  31136             }
  31137             break;
  31138         case _BCM_FIELD_GLOBAL_GROUP:
  31139             BCM_PBMP_ASSIGN(f_ent->pbmp.data, data);
  31140             BCM_PBMP_ASSIGN(f_ent->pbmp.mask, mask);
  31141             break;
  31142         default:
  31143             return BCM_E_INTERNAL;
  31144     }
  31145 
  31146     if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) {
  31147         /* coverity[address_of : FALSE] */
  31148         /* coverity[callee_ptr_arith : FALSE] */
  31149         rv = _bcm_field_th_qualify_set(unit, entry, qual,
  31150                                    (uint32 *)&f_ent->pbmp.data,
  31151                                    (uint32 *)&f_ent->pbmp.mask,
  31152                                    _FP_QUALIFIER_ADD);
  31153         BCM_IF_ERROR_RETURN(rv);
  31154     }
  31155 
  31156     f_ent->flags |= _FP_ENTRY_DIRTY;
  31157 
  31158     return BCM_E_NONE;
  31159 }
  31160 
  31161 
  31162 
  31163 /*
  31164  * Function:
  31165  *      _bcm_field_th_qualify_InPorts
  31166  * Purpose:
  31167  *      Match on Source or Destination Trunk in Field Processor.
  31168  * Parameters:
  31169  *      unit  - (IN) Unit number.
  31170  *      entry - (IN) BCM field entry id.
  31171  *      qual  - (IN) IPBM Qualifier type
  31172  *      data  - (IN) IPBM data
  31173  *      mask  - (IN) IPBM Mask
  31174  * Returns:
  31175  *      BCM_E_XXX
  31176  * Notes:
  31177  */
  31178 int
  31179 _bcm_field_th_qualify_InPorts(int unit,
  31180                               bcm_field_entry_t entry,
  31181                               bcm_field_qualify_t qual,
  31182                               bcm_pbmp_t data,
  31183                               bcm_pbmp_t mask)
  31184 {
  31185     int               rv;          /* Operational Status.           */
  31186     uint8             instance;    /* Field group pipe information. */
  31187     bcm_port_t        port;        /* Holds physical port number.   */
  31188     bcm_pbmp_t        temp_pbm;    /* Holds valid pbm supported.    */
  31189     bcm_pbmp_t        valid_pbm;   /* Holds valid pbm supported     */
  31190     _field_stage_t   *stage_fc;    /* Stage operational Structure.  */
  31191     _field_group_t   *fg;          /* Field group structure.        */
  31192     _field_entry_t   *f_ent;       /* Field entry structure.        */
  31193 
  31194     /* Validate the qualifier. */
  31195     if (!_BCM_FIELD_IS_PBMP_QUALIFIER(qual)) {
  31196         return BCM_E_PARAM;
  31197     }
  31198 
  31199     if (qual != bcmFieldQualifyInPorts) {
  31200        return _bcm_field_th_qualify_PortBitmap(unit, entry, qual, data, mask);
  31201     }
  31202     if (soc_feature(unit, soc_feature_ifp_no_inports_support)
  31203         && qual == bcmFieldQualifyInPorts) {
  31204         return (BCM_E_UNAVAIL);
  31205     }
  31206     /* Get field entry structure pointer. */
  31207     rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent);
  31208     BCM_IF_ERROR_RETURN(rv);
  31209 
  31210     fg = f_ent->group;
  31211     /* Get the stage control structure. */
  31212     rv = _field_stage_control_get(unit, fg->stage_id, &stage_fc);
  31213     BCM_IF_ERROR_RETURN(rv);
  31214 
  31215     /* Confirm that InPorts/PortBitmap Qualifiers are in group's Qset. */
  31216     if (!_BCM_FIELD_QSET_PBMP_TEST(fg->qset)) {
  31217         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  31218                   "Error: %s not in Group=%d Qset.\n"),
  31219                   _field_qual_name(qual), fg->gid));
  31220         return (BCM_E_NOT_FOUND);
  31221     }
  31222 
  31223     if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) {
  31224        instance = fg->instance;
  31225        /* Retreive Valid Pipe PBMP */
  31226        BCM_PBMP_ASSIGN(valid_pbm, PBMP_PIPE(unit, fg->instance));
  31227        BCM_PBMP_REMOVE(valid_pbm, PBMP_LB(unit));
  31228     } else {
  31229        /*
  31230         * In-case of Atomic update, InPorts/PortBitmap qualifiers are not
  31231         * support in Global mode.
  31232         */
  31233        if (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == TRUE) {
  31234           return BCM_E_UNAVAIL;
  31235        }
  31236 
  31237        instance = _BCM_FIELD_GLOBAL_GROUP;
  31238        /* Retreive Valid PBMP for all the ports */
  31239        BCM_PBMP_CLEAR(valid_pbm);
  31240        BCM_IF_ERROR_RETURN(_bcm_field_valid_pbmp_get(unit, &valid_pbm));
  31241     }
  31242 
  31243     /* Validate data */
  31244     BCM_PBMP_ASSIGN(temp_pbm, valid_pbm);
  31245     BCM_PBMP_AND(temp_pbm, data);
  31246     if (BCM_PBMP_NEQ(temp_pbm, data)) {
  31247        return BCM_E_PARAM;
  31248     }
  31249 
  31250     /*
  31251      * Check and clear invalid ports in the mask.
  31252      */
  31253     BCM_PBMP_AND(valid_pbm, mask);
  31254     BCM_PBMP_ASSIGN(mask, valid_pbm);
  31255     /*
  31256      * Add Loopback ports to mask so that Loopback packets
  31257      * will not hit entry if InPorts is qualified.
  31258      */
  31259     if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) {
  31260         bcm_pbmp_t pipe_lb_mask;
  31261         int prt_no;
  31262         BCM_PBMP_CLEAR(pipe_lb_mask);
  31263         /* Getting Loopback PBM per pipe */
  31264         for (prt_no = instance * _FP_TCAM_IPBMP_SIZE(unit);
  31265                 prt_no < (instance + 1) * _FP_TCAM_IPBMP_SIZE(unit); prt_no++) {
  31266             BCM_PBMP_PORT_ADD(pipe_lb_mask, prt_no);
  31267         }
  31268         BCM_PBMP_AND(pipe_lb_mask, PBMP_LB(unit));
  31269         BCM_PBMP_OR(mask, pipe_lb_mask);
  31270     } else {
  31271         BCM_PBMP_OR(mask, PBMP_LB(unit));
  31272     }
  31273 
  31274 
  31275     BCM_PBMP_CLEAR(f_ent->pbmp.data);
  31276     BCM_PBMP_CLEAR(f_ent->pbmp.mask);
  31277 
  31278 
  31279     switch (instance) {
  31280         case _BCM_FIELD_PIPE0_GROUP:
  31281         case _BCM_FIELD_PIPE1_GROUP:
  31282         case _BCM_FIELD_PIPE2_GROUP:
  31283         case _BCM_FIELD_PIPE3_GROUP:
  31284         case _BCM_FIELD_PIPE4_GROUP:
  31285         case _BCM_FIELD_PIPE5_GROUP:
  31286         case _BCM_FIELD_PIPE6_GROUP:
  31287         case _BCM_FIELD_PIPE7_GROUP:
  31288             BCM_PBMP_ITER(data, port)  {
  31289                  if ((port - (_FP_TCAM_IPBMP_SIZE(unit) * instance)) < 0) {
  31290                      return BCM_E_PARAM;
  31291                  }
  31292                  BCM_PBMP_PORT_ADD(f_ent->pbmp.data, port -
  31293                                    (_FP_TCAM_IPBMP_SIZE(unit)
  31294                                     * f_ent->group->instance));
  31295             }
  31296             BCM_PBMP_ITER(mask, port)  {
  31297                  if ((port - (_FP_TCAM_IPBMP_SIZE(unit) * instance)) < 0) {
  31298                      return BCM_E_PARAM;
  31299                  }
  31300                  BCM_PBMP_PORT_ADD(f_ent->pbmp.mask, port -
  31301                                    (_FP_TCAM_IPBMP_SIZE(unit)
  31302                                     * f_ent->group->instance));
  31303             }
  31304             break;
  31305         case _BCM_FIELD_GLOBAL_GROUP:
  31306             BCM_PBMP_ITER(data, port)  {
  31307                  BCM_PBMP_PORT_ADD(f_ent->pbmp.data, port);
  31308             }
  31309             BCM_PBMP_ITER(mask, port)  {
  31310                  BCM_PBMP_PORT_ADD(f_ent->pbmp.mask, port);
  31311             }
  31312             break;
  31313         default:
  31314             return BCM_E_INTERNAL;
  31315     }
  31316 
  31317     if (bcmFieldGroupOperModePipeLocal == stage_fc->oper_mode) {
  31318         /* coverity[address_of : FALSE] */
  31319         /* coverity[callee_ptr_arith : FALSE] */
  31320         rv = _bcm_field_th_qualify_set(unit, entry, qual,
  31321                                    (uint32 *)&f_ent->pbmp.data,
  31322                                    (uint32 *)&f_ent->pbmp.mask,
  31323                                    _FP_QUALIFIER_ADD);
  31324         BCM_IF_ERROR_RETURN(rv);
  31325     }
  31326 
  31327     f_ent->flags |= _FP_ENTRY_DIRTY;
  31328 
  31329     return BCM_E_NONE;
  31330 }
  31331 
  31332 int
  31333 _bcm_field_th_qualify_VlanTranslationHit(int               unit,
  31334                                           bcm_field_entry_t entry,
  31335                                           uint8             *data,
  31336                                           uint8             *mask)
  31337 {
  31338     _field_entry_t *f_ent = NULL;
  31339     int (*func)(int, bcm_field_entry_t, uint8 *, uint8 *) =
  31340                                          _field_qualify_VlanTranslationHit;
  31341 
  31342     if (soc_feature(unit, soc_feature_field_preselector_support) &&
  31343             (_BCM_FIELD_IS_PRESEL_ENTRY(entry) == FALSE))
  31344     {
  31345         BCM_IF_ERROR_RETURN(_field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent));
  31346 
  31347 #if defined(BCM_TRIDENT3_SUPPORT)
  31348         if (soc_feature(unit, soc_feature_td3_style_fp)
  31349                 && (_BCM_FIELD_STAGE_EGRESS == f_ent->group->stage_id)) {
  31350             func = _bcm_field_td3_qualify_VlanTranslationHit;
  31351         } else
  31352 #endif
  31353         if (SOC_IS_TD2_TT2(unit)
  31354             && (_BCM_FIELD_STAGE_EGRESS != f_ent->group->stage_id)) {
  31355             func = _bcm_field_td2_qualify_VlanTranslationHit;
  31356         } 
  31357     } else {
  31358         func = _bcm_field_td2_qualify_VlanTranslationHit;
  31359     }
  31360 
  31361     BCM_IF_ERROR_RETURN((*func)(unit, entry, data, mask));
  31362     return BCM_E_NONE;
  31363 
  31364 }
  31365 /*
  31366  * Function:
  31367  *  _bcm_field_th_entry_check_full_mask
  31368  * Purpose:
  31369  *  To check if mask for qualifier is exact match mask
  31370  * Parameters:
  31371  *  unit       - (IN) BCM device number.
  31372  *  qid        - (IN) Qualifier id.
  31373  *  stage_fc   - (IN) Stage Control Structure.
  31374  *  mask       - (IN) Qualifying Mask.
  31375  *  flags      - (IN) Qualifier Flags.
  31376  * Returns:
  31377  *  BCM_E_XXX
  31378  */
  31379 int
  31380 _bcm_field_th_entry_check_full_mask(int unit, int qid,
  31381                                     _field_stage_t *stage_fc,
  31382                                     uint32 *mask, uint8 flags)
  31383 {
  31384     int rv = BCM_E_NONE;           /* BCM Operational Status.   */
  31385     uint32 qual_width = 0;         /* Actual Qualifier Width.   */
  31386     uint32 keywords = 0;           /* Width Keywords.           */
  31387     uint32 leftover_width = 0;     /* Qualifier Leftover width. */
  31388     uint32 idx = 0;                /* Index for Iteration.      */
  31389     uint32 mask_exact = ~0;        /* Exact Match Mask.         */
  31390     uint32 mask_orig = 0;          /* Original Mask Data.       */
  31391 
  31392     /* Input Parameter Check. */
  31393     if ((stage_fc == NULL) ||
  31394         (mask == NULL)) {
  31395         return (BCM_E_PARAM);
  31396     }
  31397 
  31398     /* If Called for Delete then ignore. */
  31399     if (flags & _FP_QUALIFIER_DEL) {
  31400         return (BCM_E_NONE);
  31401     }
  31402 
  31403     /* For Certain Qualifiers mask is internal.
  31404      * It can be ignored. */
  31405     if ((qid == bcmFieldQualifyL2Format) ||
  31406         (qid == bcmFieldQualifyVlanTranslationHit) ||
  31407         (qid == bcmFieldQualifyForwardingType) ||
  31408         (qid == bcmFieldQualifyTunnelType) ||
  31409         (qid == bcmFieldQualifyLoopbackType) ||
  31410         (qid == bcmFieldQualifySrcModPortGport) ||
  31411         (qid == bcmFieldQualifySrcModPortGports) ||
  31412         (qid == bcmFieldQualifySrcModuleGport) ||
  31413         (qid == bcmFieldQualifySrcTrunkMemberGport) ||
  31414         (qid == bcmFieldQualifySrcTrunk) ||
  31415         (qid == bcmFieldQualifySrcMplsGport) ||
  31416         (qid == bcmFieldQualifySrcMplsGports) ||
  31417         (qid == bcmFieldQualifySrcMimGport) ||
  31418         (qid == bcmFieldQualifySrcMimGports) ||
  31419         (qid == bcmFieldQualifySrcWlanGport) ||
  31420         (qid == bcmFieldQualifySrcWlanGports) ||
  31421         (qid == bcmFieldQualifySrcVlanGport) ||
  31422         (qid == bcmFieldQualifySrcVlanGports) ||
  31423         (qid == bcmFieldQualifySrcVxlanGport) ||
  31424         (qid == bcmFieldQualifySrcVxlanGports) ||
  31425         (qid == bcmFieldQualifySrcNivGport) ||
  31426         (qid == bcmFieldQualifySrcNivGports) ) {
  31427         return (BCM_E_NONE);
  31428     }
  31429 
  31430     /* For all data qualifiers exact match mask checks are done
  31431      * in _field_qualify_data
  31432      */
  31433     if ((qid == _bcmFieldQualifyData0) ||
  31434         (qid == _bcmFieldQualifyData1) ||
  31435         (qid == _bcmFieldQualifyData2) ||
  31436         (qid == _bcmFieldQualifyData3) ||
  31437         (qid == _bcmFieldQualifyData4) ||
  31438         (qid == _bcmFieldQualifyData5) ||
  31439         (qid == _bcmFieldQualifyData6) ||
  31440         (qid == _bcmFieldQualifyData7) ||
  31441         (qid == _bcmFieldQualifyData8) ||
  31442         (qid == _bcmFieldQualifyData9) ||
  31443         (qid == _bcmFieldQualifyData10) ||
  31444         (qid == _bcmFieldQualifyData11) ||
  31445         (qid == _bcmFieldQualifyData12) ||
  31446         (qid == _bcmFieldQualifyData13) ||
  31447         (qid == _bcmFieldQualifyData14) ||
  31448         (qid == _bcmFieldQualifyData15)) {
  31449         return BCM_E_NONE;
  31450     }
  31451 
  31452     /* Check if qualifier database info is present. */
  31453     if((stage_fc->f_qual_arr[qid] != NULL) &&
  31454        (stage_fc->f_qual_arr[qid]->conf_arr != NULL)) {
  31455 
  31456         /* Retreive Actual Qualifier Width. */
  31457         qual_width = stage_fc->f_qual_arr[qid]->conf_arr->offset.qual_width;
  31458 
  31459         /* Calculate data words and leftover width. */
  31460         keywords = qual_width/32;
  31461         leftover_width = qual_width%32;
  31462 
  31463         /* Go to last MSB part of qualifier. */
  31464         for (idx = 0; idx < keywords; idx++) {
  31465             mask_exact = ~0;
  31466             if (*mask != mask_exact) {
  31467                 LOG_ERROR(BSL_LS_BCM_FP,
  31468                    (BSL_META_U(unit,
  31469                     "FP(unit %d) Error: Qual(%s) "
  31470                     "mask = 0x%08x is not exact match.\n"),
  31471                     unit, _field_qual_name(qid), *mask));
  31472                 return (BCM_E_PARAM);
  31473             }
  31474             mask++;
  31475         }
  31476 
  31477         if (leftover_width != 0) {
  31478             /* Check if mask is exact, ignore higher mask bits */
  31479             mask_exact = ((1 << leftover_width) - 1);
  31480             mask_orig = *mask & ((1 << leftover_width) - 1);
  31481 
  31482             if (mask_orig != mask_exact) {
  31483                 LOG_ERROR(BSL_LS_BCM_FP,
  31484                         (BSL_META_U(unit,
  31485                          "FP(unit %d) Error: Qual(%s) "
  31486                          "mask = 0x%08x is not exact match.\n"),
  31487                          unit, _field_qual_name(qid), *mask));
  31488                 return (BCM_E_PARAM);
  31489             }
  31490         }
  31491     } else {
  31492         /* No info about qualifier in stage database. */
  31493         return (BCM_E_INTERNAL);
  31494     }
  31495 
  31496     return (rv);
  31497 }
  31498 
  31499 /*
  31500  * Function:
  31501  *     _bcm_field_th_qual_part_offset_get
  31502  * Purpose:
  31503  *     Retrieve qualifier offsets
  31504  * Parameters:
  31505  *     unit       - (IN) BCM device number.
  31506  *     f_ent      - (IN) Field entry structure.
  31507  *     entry_part - (IN) Entry part
  31508  *     qid        - (IN) Qualifier id.
  31509  *     offset     - (OUT) Qualifier offset and width.
  31510  * Returns:
  31511  *     BCM_E_XXX
  31512  */
  31513 int
  31514 _bcm_field_th_qual_part_offset_get(int unit, _field_entry_t *f_ent,
  31515                                    int entry_part, int qid,
  31516                                    _bcm_field_qual_offset_t *offset)
  31517 {
  31518     _bcm_field_group_qual_t *q_arr;     /* Qualifiers array.          */
  31519     _field_group_t          *fg;        /* Field group structure.     */
  31520     uint8                   entry_type; /* Index to tcam entries
  31521                                            of multiple types      */
  31522     int                     idx;        /* Entry qualifiers iterator. */
  31523 
  31524     LOG_DEBUG(BSL_LS_BCM_FP,
  31525               (BSL_META_U(unit,
  31526                "_field_qual_offset_get\n")));
  31527 
  31528     /* Input parameters check. */
  31529     if ((NULL == offset) || (NULL == f_ent)) {
  31530         return (BCM_E_PARAM);
  31531     }
  31532 
  31533     /* Validate Entry Part */
  31534     if (entry_part > _FP_MAX_ENTRY_WIDTH) {
  31535         return (BCM_E_PARAM);
  31536     }
  31537 
  31538     /* Get entry group. */
  31539     fg = f_ent->group;
  31540 
  31541     if (0 == BCM_FIELD_QSET_TEST(fg->qset, qid)) {
  31542         /* Only qualifiers that were explicitly requested may be used */
  31543         LOG_DEBUG(BSL_LS_BCM_FP,
  31544                   (BSL_META_U(unit,
  31545                   "FP(unit %d) Error: qual=%s not in group=%d Qset\n"),
  31546                    unit, _field_qual_name(qid), f_ent->group->gid));
  31547         return (BCM_E_PARAM);
  31548     }
  31549 
  31550     entry_type = _FP_ENTRY_TYPE_DEFAULT;
  31551     /* Get qualifier information. */
  31552     q_arr = &(fg->qual_arr[entry_type][entry_part]);
  31553     for (idx = 0; idx < q_arr->size; idx++) {
  31554         if (qid == q_arr->qid_arr[idx]) {
  31555             sal_memcpy(offset, q_arr->offset_arr + idx,
  31556                           sizeof(_bcm_field_qual_offset_t));
  31557             break;
  31558         }
  31559     }
  31560 
  31561     if (idx == q_arr->size) {
  31562         offset = NULL;
  31563         return (BCM_E_NOT_FOUND);
  31564     }
  31565 
  31566     /*
  31567      *  For Single wide mode, MSB 80-bits of 160-bits are valid
  31568      *  in the final key, hence shift the offset by 80-bit.
  31569      */
  31570     if (fg->stage_id == _BCM_FIELD_STAGE_INGRESS) {
  31571         if ((fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) &&
  31572                 !(fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)) {
  31573             int qual_part;
  31574 
  31575             for (qual_part = 0; qual_part < (offset)->num_offsets; ++qual_part) {
  31576                 if ((offset)->width[qual_part] > 0) {
  31577                     (offset)->offset[qual_part] -= 80;
  31578                 }
  31579             }
  31580         }
  31581     } else  if (fg->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
  31582         /* In Exact Match Mode 128 - whole key is not presented
  31583          * for lookup. Instead Bit 0-47 and Bit 80-160 are provided
  31584          * to UFT. Hence qualifier offsets at position greater than
  31585          * 80 bit are shifted by 32 bit for key.
  31586          */
  31587         if(fg->em_mode == _FieldExactMatchMode128) {
  31588            if (soc_feature(unit, soc_feature_th3_style_fp)) {
  31589                int q_part;
  31590                for (q_part = 0; q_part < (offset)->num_offsets; ++q_part) {
  31591                    if ((offset)->width[q_part] > 0) {
  31592                        if(((offset)->offset[q_part]) > 51) {
  31593                            (offset)->offset[q_part] -= 32;
  31594                        }
  31595                    }
  31596                }
  31597             } else {
  31598                 int q_part;
  31599                 for (q_part = 0; q_part < (offset)->num_offsets; ++q_part) {
  31600                     if ((offset)->width[q_part] > 0) {
  31601                         if(((offset)->offset[q_part]) > 79) {
  31602                             (offset)->offset[q_part] -= 32;
  31603                         }
  31604                     }
  31605                 }
  31606             }
  31607         }
  31608 #if defined(BCM_FLOWTRACKER_SUPPORT)
  31609     } else if (fg->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) {
  31610         int q_part;
  31611         /*
  31612          * Flowtracker stage support 2 modes - Single (180 bits) and
  31613          * Double (360 bits) using 1 and 2 indices in TCAM.
  31614          * Each entry has 7-bit Keytype and 1-bit keymode at bit position 0 to
  31615          * 7th in KEYf. So, substacting 180 bits and then adding 8 bits to the
  31616          * correct offset per hw entry.
  31617          */
  31618         for (q_part = 0; q_part < (offset)->num_offsets; ++q_part) {
  31619             if ((offset)->width[q_part] > 0) {
  31620                 (offset)->offset[q_part] -= (entry_part * 180);
  31621                 (offset)->offset[q_part] += 8;
  31622             }
  31623         }
  31624 #endif
  31625     } else {
  31626         /* Invalid Stage. */
  31627         return (BCM_E_PARAM);
  31628     }
  31629 
  31630     return (BCM_E_NONE);
  31631 }
  31632 
  31633 int
  31634 _field_udf_internal_qual_valid_get(int unit, int int_qual,
  31635                                    uint32 chunk_bitmap, uint8 *valid)
  31636 {
  31637     uint8 compound_chunk = 0;
  31638 
  31639     if (NULL == valid) {
  31640         return BCM_E_PARAM;
  31641     }
  31642 
  31643     compound_chunk = !(soc_feature(unit, soc_feature_td3_style_fp)
  31644                         || soc_feature(unit, soc_feature_udf_selector_support));
  31645     switch (int_qual) {
  31646         case _bcmFieldQualifyData0:
  31647              *valid = (chunk_bitmap & (1 << 0));
  31648              break;
  31649         case _bcmFieldQualifyData1:
  31650              *valid = (chunk_bitmap & (1 << 1));
  31651              break;
  31652         case _bcmFieldQualifyData2:
  31653              if (compound_chunk) {
  31654                  *valid = (chunk_bitmap & (1 << 2)) || (chunk_bitmap & (1 << 3));
  31655              } else {
  31656                  *valid = (chunk_bitmap & (1 << 2));
  31657              }
  31658              break;
  31659         case _bcmFieldQualifyData3:
  31660              if (compound_chunk) {
  31661                  *valid = (chunk_bitmap & (1 << 4)) || (chunk_bitmap & (1 << 5));
  31662              } else {
  31663                  *valid = (chunk_bitmap & (1 << 3));
  31664              }
  31665              break;
  31666         case _bcmFieldQualifyData4:
  31667              if (compound_chunk) {
  31668                  *valid = (chunk_bitmap & (1 << 6)) || (chunk_bitmap & (1 << 7));
  31669              } else {
  31670                  *valid = (chunk_bitmap & (1 << 4));
  31671              }
  31672              break;
  31673         case _bcmFieldQualifyData5:
  31674              if (compound_chunk) {
  31675                  *valid = (chunk_bitmap & (1 << 8)) || (chunk_bitmap & (1 << 9));
  31676              } else {
  31677                  *valid = (chunk_bitmap & (1 << 5));
  31678              }
  31679              break;
  31680         case _bcmFieldQualifyData6:
  31681              if (compound_chunk) {
  31682                  *valid = (chunk_bitmap & (1 << 9)) || (chunk_bitmap & (1 << 10));
  31683              } else {
  31684                  *valid = (chunk_bitmap & (1 << 6));
  31685              }
  31686              break;
  31687         case _bcmFieldQualifyData7:
  31688              if (compound_chunk) {
  31689                  *valid = (chunk_bitmap & (1 << 10)) || (chunk_bitmap & (1 << 11));
  31690              } else {
  31691                  *valid = (chunk_bitmap & (1 << 7));
  31692              }
  31693              break;
  31694         case _bcmFieldQualifyData8:
  31695              if (compound_chunk) {
  31696                  *valid = (chunk_bitmap & (1 << 12)) || (chunk_bitmap & (1 << 13));
  31697              } else {
  31698                  *valid = (chunk_bitmap & (1 << 8));
  31699              }
  31700              break;
  31701         case _bcmFieldQualifyData9:
  31702              if (compound_chunk) {
  31703                  *valid = (chunk_bitmap & (1 << 14)) || (chunk_bitmap & (1 << 15));
  31704              } else {
  31705                  *valid = (chunk_bitmap & (1 << 9));
  31706              }
  31707              break;
  31708         case _bcmFieldQualifyData10:
  31709              *valid = (chunk_bitmap & (1 << 10));
  31710              break;
  31711         case _bcmFieldQualifyData11:
  31712              *valid = (chunk_bitmap & (1 << 11));
  31713              break;
  31714         case _bcmFieldQualifyData12:
  31715              *valid = (chunk_bitmap & (1 << 12));
  31716              break;
  31717         case _bcmFieldQualifyData13:
  31718              *valid = (chunk_bitmap & (1 << 13));
  31719              break;
  31720         case _bcmFieldQualifyData14:
  31721              *valid = (chunk_bitmap & (1 << 14));
  31722              break;
  31723         case _bcmFieldQualifyData15:
  31724              *valid = (chunk_bitmap & (1 << 15));
  31725              break;
  31726         default:
  31727              return BCM_E_INTERNAL;
  31728     }
  31729     return BCM_E_NONE;
  31730 }
  31731 
  31732 int
  31733 _field_udf_chunk_to_internal_qual_get(int unit, uint16 chunk, int *int_qual)
  31734 {
  31735     uint8 compound_chunk = 0;
  31736     if (NULL == int_qual) {
  31737         return BCM_E_PARAM;
  31738     }
  31739 
  31740     compound_chunk = !(soc_feature(unit, soc_feature_td3_style_fp)
  31741                         || soc_feature(unit, soc_feature_udf_selector_support));
  31742     switch(chunk) {
  31743         case 0x0:
  31744             *int_qual = _bcmFieldQualifyData0;
  31745             break;
  31746         case 0x1:
  31747             *int_qual = _bcmFieldQualifyData1;
  31748             break;
  31749         case 0x2:
  31750             *int_qual = _bcmFieldQualifyData2;
  31751             break;
  31752         case 0x3:
  31753             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData2) : (_bcmFieldQualifyData3);
  31754             break;
  31755         case 0x4:
  31756             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData3) : (_bcmFieldQualifyData4);
  31757             break;
  31758         case 0x5:
  31759             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData3) : (_bcmFieldQualifyData5);
  31760             break;
  31761         case 0x6:
  31762             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData4) : (_bcmFieldQualifyData6);
  31763             break;
  31764         case 0x7:
  31765             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData4) : (_bcmFieldQualifyData7);
  31766             break;
  31767         case 0x8:
  31768             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData5) : (_bcmFieldQualifyData8);
  31769             break;
  31770         case 0x9:
  31771             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData6) : (_bcmFieldQualifyData9);
  31772             break;
  31773         case 10:
  31774             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData7) : (_bcmFieldQualifyData10);
  31775             break;
  31776         case 11:
  31777             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData7) : (_bcmFieldQualifyData11);
  31778             break;
  31779         case 12:
  31780             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData8) : (_bcmFieldQualifyData12);
  31781             break;
  31782         case 13:
  31783             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData8) : (_bcmFieldQualifyData13);
  31784             break;
  31785         case 14:
  31786             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData9) : (_bcmFieldQualifyData14);
  31787             break;
  31788         case 15:
  31789             *int_qual = (compound_chunk) ? (_bcmFieldQualifyData9) : (_bcmFieldQualifyData15);
  31790             break;
  31791         default:
  31792             return BCM_E_INTERNAL;
  31793     }
  31794     return BCM_E_NONE;
  31795 }
  31796 int
  31797 _bcm_th_qual_hint_bmp_get(int unit, int qual,
  31798                           uint8 em_keygen_mask,
  31799                           _field_hint_t *hint_node,
  31800                           uint32 *qual_bitmap,
  31801                           uint8 partial,
  31802                           bcm_field_qset_t *qset,
  31803                           bcmi_keygen_qual_info_t *qual_info)
  31804 {
  31805     bcm_udf_id_t udf_id;
  31806     int idx = 0;
  31807     uint8 valid = 0;
  31808     uint8 start_second_chunk = 0;
  31809     uint8 end_second_chunk = 0;
  31810 #if defined(BCM_TRIDENT3_SUPPORT)
  31811     _bcm_udf_td3_obj_info_t *obj_info = NULL;
  31812 #endif
  31813     bcmi_xgs4_udf_offset_info_t *offset_info = NULL;
  31814     uint32 chunk_bmap = 0;
  31815     uint32 temp_bitmap = 0;
  31816     uint32 start_width = 0;
  31817     uint32 start_bit = 0;
  31818     uint32 end_bit = 0;
  31819     uint32 cont_width = 0;
  31820     uint32 end_width = 0;
  31821     uint16 chunk = 0;
  31822     uint16 extra_width = 0;
  31823     uint16 max_chunks = 0;
  31824     uint16 start_chunk = 0;
  31825     uint16 start_chunk_valid = 0;
  31826     uint16 end_chunk = 0;
  31827     int int_qual_start = 0;
  31828     int int_qual_end = 0;
  31829 
  31830     udf_id =  hint_node->hint->udf_id;
  31831     /* Get UDF info. */
  31832 #if defined(BCM_TRIDENT3_SUPPORT)
  31833     if (soc_feature(unit, soc_feature_td3_style_fp)) {
  31834         BCM_IF_ERROR_RETURN(_bcm_udf_td3_object_info_get(unit, udf_id, &obj_info));
  31835         chunk_bmap = obj_info->chunk_bmap;
  31836         cont_width = obj_info->width;
  31837         max_chunks = _BCM_UDF_CTRL_MAX_UDF_CHUNKS(unit);
  31838     } else
  31839 #endif
  31840     {
  31841         BCM_IF_ERROR_RETURN(bcmi_xgs4_udf_offset_node_get(unit, udf_id, &offset_info));
  31842         chunk_bmap = offset_info->hw_bmap;
  31843         cont_width = offset_info->width;
  31844         max_chunks = BCMI_XGS4_UDF_CTRL_MAX_UDF_CHUNKS(unit);
  31845     }
  31846 
  31847     /* Logical Start and end chunks  based on user given inputs */
  31848     if (!soc_feature(unit, soc_feature_td3_style_fp)) {
  31849         /*
  31850          * Check whether UDF container width is multiple of 16 or not.
  31851          * cont_width is multiple of bytes. It has to be even number for multiple of 16 bits
  31852          */
  31853         if (cont_width & 1) {
  31854             /*
  31855              * For the UDFs whcih are not multiples of 16,
  31856              * Chunk allocation is always be mutlples of 16 bit.
  31857              * Need to think that the given start and end bit be
  31858              * 8 bits extra width.
  31859              */
  31860             extra_width = partial ? 8 : 0;
  31861         }
  31862     }
  31863 
  31864     if ((hint_node->hint->start_bit > (cont_width * 8))
  31865             || (hint_node->hint->end_bit) > (cont_width * 8)) {
  31866         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  31867               "Provided hint has wrong start/end bit\n\r")));
  31868         return BCM_E_PARAM;
  31869     }
  31870 
  31871     start_chunk = hint_node->hint->start_bit/16 + extra_width;
  31872     end_chunk = hint_node->hint->end_bit/16 + extra_width;
  31873     chunk = 0;
  31874     start_chunk_valid = 0;
  31875     /* Derive physical chunks with logical moves */
  31876     for (idx = max_chunks - 1; idx >= 0; idx--) {
  31877         if ((chunk_bmap & (1 << idx))) {
  31878             if ((0 == start_chunk_valid) && (chunk == start_chunk)) {
  31879                 start_chunk = idx;
  31880                 start_chunk_valid = 1;
  31881             }
  31882             if (chunk == end_chunk) {
  31883                 end_chunk = idx;
  31884                 break;
  31885             }
  31886             chunk++;
  31887         }
  31888     }
  31889 
  31890     BCM_IF_ERROR_RETURN(_field_udf_chunk_to_internal_qual_get(unit, start_chunk, &int_qual_start));
  31891     BCM_IF_ERROR_RETURN(_field_udf_chunk_to_internal_qual_get(unit, end_chunk, &int_qual_end));
  31892 
  31893     if ((_bcmFieldQualifyCount == int_qual_start)
  31894             || (_bcmFieldQualifyCount == int_qual_end)) {
  31895         return BCM_E_INTERNAL;
  31896     }
  31897 
  31898     if (soc_feature(unit, soc_feature_td3_style_fp)
  31899             || soc_feature(unit, soc_feature_udf_selector_support)) {
  31900         start_bit = hint_node->hint->start_bit%16;
  31901         end_width = hint_node->hint->end_bit%16;
  31902         start_width = _UDF_CHUNK_WIDTH_ - start_bit;
  31903         /* End chunk starts from 0 for all 16bit chunks */
  31904         end_bit = 0;
  31905     } else if (SOC_IS_TOMAHAWK(unit) || SOC_IS_TOMAHAWK2(unit)) {
  31906         switch (int_qual_start) {
  31907             case _bcmFieldQualifyData0:
  31908             case _bcmFieldQualifyData1:
  31909             case _bcmFieldQualifyData5:
  31910             case _bcmFieldQualifyData6:
  31911                 start_bit = hint_node->hint->start_bit%(_UDF_CHUNK_WIDTH_);
  31912                 start_width = _UDF_CHUNK_WIDTH_ - start_bit;
  31913                 break;
  31914             case _bcmFieldQualifyData2:
  31915                  _FIELD_UDF_START_CHUNK_OFFSET_GET(2, 3);
  31916                 break;
  31917             case _bcmFieldQualifyData3:
  31918                  _FIELD_UDF_START_CHUNK_OFFSET_GET(4, 5);
  31919                 break;
  31920             case _bcmFieldQualifyData4:
  31921                  _FIELD_UDF_START_CHUNK_OFFSET_GET(6, 7);
  31922                 break;
  31923             case _bcmFieldQualifyData7:
  31924                  _FIELD_UDF_START_CHUNK_OFFSET_GET(10, 11);
  31925                 break;
  31926             case _bcmFieldQualifyData8:
  31927                  _FIELD_UDF_START_CHUNK_OFFSET_GET(12, 13);
  31928                 break;
  31929             case _bcmFieldQualifyData9:
  31930                  _FIELD_UDF_START_CHUNK_OFFSET_GET(14, 15);
  31931                 break;
  31932             default:
  31933                 return BCM_E_INTERNAL;
  31934         }
  31935 
  31936         switch (int_qual_end) {
  31937             case _bcmFieldQualifyData0:
  31938             case _bcmFieldQualifyData1:
  31939             case _bcmFieldQualifyData5:
  31940             case _bcmFieldQualifyData6:
  31941                 end_width = hint_node->hint->end_bit%(_UDF_CHUNK_WIDTH_);
  31942                 break;
  31943             case _bcmFieldQualifyData2:
  31944                 _FIELD_UDF_END_CHUNK_OFFSET_GET(2, 3);
  31945                 break;
  31946             case _bcmFieldQualifyData3:
  31947                 _FIELD_UDF_END_CHUNK_OFFSET_GET(4, 5);
  31948                 break;
  31949             case _bcmFieldQualifyData4:
  31950                 _FIELD_UDF_END_CHUNK_OFFSET_GET(6, 7);
  31951                 break;
  31952             case _bcmFieldQualifyData7:
  31953                 _FIELD_UDF_END_CHUNK_OFFSET_GET(10, 11);
  31954                 break;
  31955             case _bcmFieldQualifyData8:
  31956                 _FIELD_UDF_END_CHUNK_OFFSET_GET(12, 13);
  31957                 break;
  31958             case _bcmFieldQualifyData9:
  31959                 _FIELD_UDF_END_CHUNK_OFFSET_GET(14, 15);
  31960                 break;
  31961             default:
  31962                 return BCM_E_INTERNAL;
  31963         }
  31964     } else {
  31965         return BCM_E_INTERNAL;
  31966     }
  31967 
  31968     if (partial && (start_second_chunk || end_second_chunk)) {
  31969         temp_bitmap = *qual_bitmap;
  31970         *qual_bitmap = 0;
  31971     }
  31972 
  31973     idx = 0;
  31974     if (em_keygen_mask && (*qual_bitmap)) {
  31975         /*
  31976          * EM KEYGEN needs to set the number of bits needed for the qualfiier
  31977          * not the bit positions bitmap.
  31978          * So whenever Same qualifier has mutliple hints,
  31979          * need to consider previous hint width too.
  31980          */
  31981         for (idx = 0; (idx < 32) && (SHR_BITGET(qual_bitmap, idx)); idx++);
  31982     }
  31983 
  31984     if ((int_qual_start == qual) && (int_qual_end == qual)) {
  31985         SHR_BITSET_RANGE(qual_bitmap,
  31986                     em_keygen_mask ? 0 : start_bit,
  31987                     (idx + hint_node->hint->end_bit - hint_node->hint->start_bit + 1));
  31988 
  31989         if (start_second_chunk) {
  31990             SHR_BITSET_RANGE(qual_bitmap,
  31991                     (start_bit >= _UDF_CHUNK_WIDTH_) ? 0 : _UDF_CHUNK_WIDTH_,
  31992                     _UDF_CHUNK_WIDTH_);
  31993         }
  31994 
  31995         if ((0 == start_second_chunk) && end_second_chunk) {
  31996             SHR_BITSET_RANGE(qual_bitmap,
  31997                     (end_width >= _UDF_CHUNK_WIDTH_) ? 0 : _UDF_CHUNK_WIDTH_,
  31998                     _UDF_CHUNK_WIDTH_);
  31999         }
  32000 
  32001         if (partial && (NULL != qual_info)) {
  32002             qual_info->partial = TRUE;
  32003         }
  32004     } else {
  32005         if (qual == int_qual_start) {
  32006             SHR_BITSET_RANGE(qual_bitmap,
  32007                     em_keygen_mask ? 0 : start_bit,
  32008                     idx + start_width);
  32009             if (start_second_chunk) {
  32010                 SHR_BITSET_RANGE(qual_bitmap,
  32011                         (start_bit >= _UDF_CHUNK_WIDTH_) ? 0 : _UDF_CHUNK_WIDTH_,
  32012                         _UDF_CHUNK_WIDTH_);
  32013             }
  32014             if (partial && (NULL != qual_info)) {
  32015                 qual_info->partial = TRUE;
  32016             }
  32017         } else if (qual == int_qual_end) {
  32018             SHR_BITSET_RANGE(qual_bitmap,
  32019                     em_keygen_mask ? 0 : end_bit, (idx + end_width + 1));
  32020             if (end_second_chunk) {
  32021                 SHR_BITSET_RANGE(qual_bitmap,
  32022                         (end_width >= _UDF_CHUNK_WIDTH_) ? 0 : _UDF_CHUNK_WIDTH_,
  32023                         _UDF_CHUNK_WIDTH_);
  32024             }
  32025             if (partial && (NULL != qual_info)) {
  32026                 qual_info->partial = TRUE;
  32027             }
  32028         } else if ((int_qual_start < qual) || (qual < int_qual_end)) {
  32029             if (partial && (NULL != qual_info)) {
  32030                 /* Check whether qual belongs to this UDF Object */
  32031                 BCM_IF_ERROR_RETURN(_field_udf_internal_qual_valid_get(unit, qual, chunk_bmap, &valid));
  32032                 if (valid) {
  32033                     qual_info->partial = TRUE;
  32034                 }
  32035             }
  32036         }
  32037     }
  32038 
  32039     if (partial && temp_bitmap && (start_second_chunk || end_second_chunk)) {
  32040         *qual_bitmap &= temp_bitmap;
  32041     }
  32042 
  32043     return BCM_E_NONE;
  32044 }
  32045 
  32046 /*
  32047  * Function:
  32048  *     _bcm_field_th_qual_hints_get
  32049  * Purpose:
  32050  *     Get the hints for the given qualifier.
  32051  * Parameters:
  32052  *     unit       - (IN) BCM device number.
  32053  *     qual       - (IN) Field Qualifier.
  32054  *     hintid     - (IN) HintId attached to the field group.
  32055  *     hints_present  - (OUT) Flag to indicate whetehr hints
  32056  *                            present for the qualifier or not.
  32057  *     qual_bitmap    - (OUT) Required bit to extract for the qualifier.
  32058  * Returns:
  32059  *     BCM_E_XXX
  32060  */
  32061 int
  32062 _bcm_field_th_qual_hints_get(int unit, int qual,
  32063                              bcm_field_hintid_t hintid,
  32064                              bcm_field_qset_t *qset,
  32065                              uint8 *hints_present,
  32066                              _bcm_field_qual_data_t qual_bitmap)
  32067 {
  32068     int idx = 0;                             /* Index variablre. */
  32069     uint8 hints_p = 0;                       /* hints present status */
  32070     _field_hints_t        *f_ht = NULL;      /* Field hints Structure. */
  32071     _field_hint_t         *hint_node = NULL; /* Field hint Structure. */
  32072 
  32073     /* Parameters Check */
  32074     if (NULL == hints_present) {
  32075         return BCM_E_PARAM;
  32076     }
  32077 
  32078     *hints_present = 0;
  32079     _FP_QUAL_DATA_CLEAR(qual_bitmap);
  32080 
  32081     BCM_IF_ERROR_RETURN(_field_hints_control_get (unit, hintid, &f_ht));
  32082 
  32083     /* Not a valid hint Id. */
  32084     if (NULL == f_ht) {
  32085         return BCM_E_NONE;
  32086     }
  32087 
  32088     /* No hinta are attached to the hintid. */
  32089     if (NULL == f_ht->hints) {
  32090         return BCM_E_NONE;
  32091     }
  32092 
  32093     /* Go through all the hints in the hintid. */
  32094     hint_node = f_ht->hints;
  32095     while (NULL != hint_node) {
  32096 
  32097         if (bcmFieldQualifyUdf != hint_node->hint->qual) {
  32098             if ((bcmFieldHintTypeExtraction == hint_node->hint->hint_type) &&
  32099                     (qual == hint_node->hint->qual)) {
  32100                 *hints_present = 1;
  32101                 break;
  32102             }
  32103         } else {
  32104             if ((bcmFieldHintTypeExtraction == hint_node->hint->hint_type) &&
  32105                     (_FIELD_IS_INTERNAL_UDF_QUAL(qual))) {
  32106                 *hints_present = 1;
  32107                 break;
  32108             }
  32109         }
  32110 
  32111         hint_node = hint_node->next;
  32112     }
  32113 
  32114     /* Hints not present for the qualifier. */
  32115     if (!(*hints_present)) {
  32116         return BCM_E_NONE;
  32117     }
  32118 
  32119     hint_node = f_ht->hints;
  32120 
  32121     /* Update the required bits for the qualifier. */
  32122     while (NULL != hint_node) {
  32123 
  32124         if (bcmFieldQualifyUdf != hint_node->hint->qual) {
  32125             if (bcmFieldHintTypeExtraction == hint_node->hint->hint_type &&
  32126                     qual != hint_node->hint->qual) {
  32127                 hint_node = hint_node->next;
  32128                 continue;
  32129             }
  32130         } else {
  32131             if ((bcmFieldHintTypeExtraction == hint_node->hint->hint_type) &&
  32132                     (!(_FIELD_IS_INTERNAL_UDF_QUAL(qual)))) {
  32133                 hint_node = hint_node->next;
  32134                 continue;
  32135             }
  32136         }
  32137 
  32138 #if defined(BCM_FLOWTRACKER_SUPPORT)
  32139         if ((qual == bcmFieldQualifyDosAttackEvents) ||
  32140             (qual == bcmFieldQualifyInnerDosAttackEvents)) {
  32141             SHR_BITOR_RANGE(&(hint_node->hint->dosattack_event_flags),
  32142                     qual_bitmap, 0, 32, qual_bitmap);
  32143             hint_node = hint_node->next;
  32144             continue;
  32145         }
  32146 #endif
  32147 
  32148         if (bcmFieldQualifyUdf != hint_node->hint->qual) {
  32149             for (idx = hint_node->hint->start_bit;
  32150                     idx <= hint_node->hint->end_bit; idx++) {
  32151                 SHR_BITSET(qual_bitmap, idx);
  32152             }
  32153         } else {
  32154             BCM_IF_ERROR_RETURN(_bcm_th_qual_hint_bmp_get(unit, qual, 0, hint_node,
  32155                                            qual_bitmap, 1, qset, NULL));
  32156             if (*qual_bitmap) {
  32157                 hints_p = 1;
  32158                 *hints_present = 1;
  32159             }
  32160 
  32161             if (hints_p == 0) {
  32162                 *hints_present = 0;
  32163             }
  32164         }
  32165         hint_node = hint_node->next;
  32166     }
  32167 
  32168     return BCM_E_NONE;
  32169 }
  32170 
  32171 /*
  32172  * Function:
  32173  *      _bcm_field_th_qualify_set
  32174  *
  32175  * Purpose:
  32176  *      Utility routine for qualify APIs taking 32 bits or less
  32177  *
  32178  * Parameters:
  32179  *      unit - BCM device number
  32180  *      entry - Entry ID
  32181  *      qual  - Qualifier field
  32182  *      data  - Matching data
  32183  *      mask  - Bit mask for data
  32184  *      flags - Qualifier Flags.
  32185  * Returns:
  32186  *     BCM_E_NONE     - BCM device number
  32187  *     BCM_E_PARAM    - Qualifier not in group's Qset
  32188  *     BCM_E_CONFIG   - entry is groups default entry
  32189  */
  32190 
  32191 int
  32192 _bcm_field_th_qualify_set(int unit, bcm_field_entry_t entry,
  32193                           int qual, uint32 *data, uint32 *mask, uint8 flags)
  32194 {
  32195     int                      rv;
  32196     _bcm_field_qual_offset_t q_offset;
  32197     _field_entry_t           *f_ent;
  32198     _bcm_field_qual_data_t   out_data1;
  32199     _bcm_field_qual_data_t   out_mask1;
  32200     _bcm_field_qual_data_t   out_data2;
  32201     _bcm_field_qual_data_t   out_mask2;
  32202     _bcm_field_qual_data_t   actual_data;
  32203     _bcm_field_qual_data_t   actual_mask;
  32204     _bcm_field_qual_data_t   qual_bitmap;
  32205     uint32                   start_offset = 0;
  32206     int                      parts_cnt;
  32207     int                      miss_count;
  32208     int                      part_idx;
  32209     int                      idx;
  32210     int                      get_start_bit;
  32211     int                      set_start_bit;
  32212     uint16                   width;
  32213     uint16                   total_width;
  32214     uint8                    hints_present;
  32215     _bcm_field_qual_data_t   null_data;
  32216     uint16                   chunk_size[_BCM_FIELD_QUAL_OFFSET_MAX] = {0};
  32217     uint16                   chunk_offset[_BCM_FIELD_QUAL_OFFSET_MAX] = {0};
  32218     _field_stage_t           *stage_fc;
  32219 
  32220     /* Input Parameter Check. */
  32221     if (NULL == data || NULL == mask) {
  32222         return BCM_E_PARAM;
  32223     }
  32224 
  32225     /* Retrieve the field entry. */
  32226     rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent);
  32227     BCM_IF_ERROR_RETURN(rv);
  32228 
  32229     /* Currently this function handles qualifiers related to IFP,FT and EM */
  32230     if ((f_ent->group->stage_id != _BCM_FIELD_STAGE_INGRESS) &&
  32231         (f_ent->group->stage_id != _BCM_FIELD_STAGE_EXACTMATCH) &&
  32232         (f_ent->group->stage_id != _BCM_FIELD_STAGE_FLOWTRACKER)) {
  32233         return BCM_E_INTERNAL;
  32234     }
  32235 
  32236     /* Check if it is group default entry. */
  32237     if (f_ent->flags & _FP_ENTRY_EXACT_MATCH_GROUP_DEFAULT) {
  32238         return (BCM_E_CONFIG);
  32239     }
  32240 
  32241     /* Retrieve group entry parts */
  32242     rv = _bcm_field_th_entry_tcam_parts_count(unit, f_ent->group->flags,
  32243                                                              &parts_cnt);
  32244     BCM_IF_ERROR_RETURN(rv);
  32245 
  32246     /* Retreive stage control. */
  32247     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  32248     BCM_IF_ERROR_RETURN(rv);
  32249 
  32250     _FP_QUAL_DATA_CLEAR(actual_data);
  32251     _FP_QUAL_DATA_CLEAR(actual_mask);
  32252 
  32253     /* Check if mask is full, do it only for exact match entries. */
  32254     if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
  32255         rv = _bcm_field_th_entry_check_full_mask(unit, qual,
  32256                                              stage_fc, mask, flags);
  32257         BCM_IF_ERROR_RETURN(rv);
  32258     }
  32259 
  32260     /* Initialize q_offset to NULL */
  32261     sal_memset(&q_offset, 0x0, sizeof(q_offset));
  32262     _FP_QUAL_DATA_CLEAR(null_data);
  32263     miss_count = 0;
  32264     total_width = 0;
  32265     hints_present = 0;
  32266     get_start_bit = -1;
  32267     set_start_bit = 0;
  32268     width = 0;
  32269 
  32270     /* Update each chunk size of the qualifier. */
  32271     for (part_idx = 0; part_idx < parts_cnt; ++part_idx) {
  32272         /* Retrieve the Qualifier offsets for the particular entry part */
  32273         rv = _bcm_field_th_qual_part_offset_get(unit, f_ent + part_idx,
  32274                                                 part_idx, qual, &q_offset);
  32275 
  32276         if (rv == BCM_E_NOT_FOUND) {
  32277             continue;
  32278         } else if (BCM_FAILURE(rv)) {
  32279             return rv;
  32280         }
  32281 
  32282         for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) {
  32283             if (q_offset.width[idx]) {
  32284                 chunk_size[idx] = q_offset.width[idx];
  32285                 total_width += chunk_size[idx];
  32286             }
  32287         }
  32288     }
  32289 
  32290     _FP_QUAL_DATA_CLEAR(actual_data);
  32291     _FP_QUAL_DATA_CLEAR(actual_mask);
  32292 
  32293     rv = _bcm_field_th_qual_hints_get(unit, qual, f_ent->group->hintid,
  32294                                       &f_ent->group->qset,
  32295                                       &hints_present, qual_bitmap);
  32296     BCM_IF_ERROR_RETURN(rv);
  32297 
  32298     if (hints_present) {
  32299         for (idx = 0; idx < _FP_QUAL_DATA_WORDS * 32; idx++) {
  32300             if (SHR_BITGET(qual_bitmap, idx)) {
  32301                if (-1 == get_start_bit) {
  32302                   get_start_bit = idx;
  32303                }
  32304                width++;
  32305             } else {
  32306                if (-1 != get_start_bit) {
  32307 
  32308                   _FP_QUAL_DATA_CLEAR(out_data1);
  32309                   _FP_QUAL_DATA_CLEAR(out_mask1);
  32310 
  32311                   rv = _bcm_field_qual_partial_data_get(data, get_start_bit,
  32312                                                         width, out_data1);
  32313                   BCM_IF_ERROR_RETURN(rv);
  32314 
  32315                   rv = _bcm_field_qual_partial_data_set(out_data1,
  32316                                                         set_start_bit,
  32317                                                         width, actual_data);
  32318                   BCM_IF_ERROR_RETURN(rv);
  32319 
  32320                   rv = _bcm_field_qual_partial_data_get(mask, get_start_bit,
  32321                                                         width, out_mask1);
  32322                   BCM_IF_ERROR_RETURN(rv);
  32323 
  32324                   rv = _bcm_field_qual_partial_data_set(out_mask1,
  32325                                                         set_start_bit,
  32326                                                         width, actual_mask);
  32327                   BCM_IF_ERROR_RETURN(rv);
  32328 
  32329                   set_start_bit += width;
  32330                   get_start_bit = -1;
  32331                   width = 0;
  32332                }
  32333             }
  32334         }
  32335     } else {
  32336         rv = _bcm_field_qual_partial_data_set(data, 0,
  32337                                               total_width, actual_data);
  32338         BCM_IF_ERROR_RETURN(rv);
  32339 
  32340         rv = _bcm_field_qual_partial_data_set(mask, 0,
  32341                                               total_width, actual_mask);
  32342         BCM_IF_ERROR_RETURN(rv);
  32343     }
  32344 
  32345     /* Update each chunk offset of the qualifier. offsets in q_offset
  32346      * are local to the partition but chunk_offset array will have offsets
  32347      * across the partitions.
  32348      */
  32349     for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) {
  32350 
  32351         if (idx == 0) {
  32352             chunk_offset[idx] = 0;
  32353             continue;
  32354         }
  32355 
  32356         if (chunk_size[idx]) {
  32357            chunk_offset[idx] = chunk_offset[idx-1] + chunk_size[idx - 1];
  32358         } else {
  32359            break;
  32360         }
  32361     }
  32362 
  32363     for (part_idx = 0; part_idx < parts_cnt; ++part_idx) {
  32364         /* Retrieve the Qualifier offsets for the particular entry part */
  32365         rv = _bcm_field_th_qual_part_offset_get(unit, f_ent + part_idx,
  32366                                                 part_idx, qual, &q_offset);
  32367         if (rv == BCM_E_NOT_FOUND) {
  32368             miss_count += 1;
  32369             continue;
  32370         } else if (BCM_FAILURE(rv)) {
  32371            return rv;
  32372         }
  32373 
  32374         _FP_QUAL_DATA_CLEAR(out_data2);
  32375         _FP_QUAL_DATA_CLEAR(out_mask2);
  32376 
  32377         start_offset = 0;
  32378 
  32379         /* Extract relevent data for this partion from user passed data. */
  32380         for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) {
  32381 
  32382             if (0 == q_offset.width[idx]) {
  32383                 continue;
  32384             }
  32385 
  32386             _FP_QUAL_DATA_CLEAR(out_data1);
  32387             _FP_QUAL_DATA_CLEAR(out_mask1);
  32388 
  32389 
  32390             rv = _bcm_field_qual_partial_data_get(actual_data,
  32391                                                   chunk_offset[idx],
  32392                                                   q_offset.width[idx],
  32393                                                   out_data1);
  32394             BCM_IF_ERROR_RETURN(rv);
  32395 
  32396             rv = _bcm_field_qual_partial_data_set(out_data1, start_offset,
  32397                                               q_offset.width[idx], out_data2);
  32398             BCM_IF_ERROR_RETURN(rv);
  32399 
  32400             rv = _bcm_field_qual_partial_data_get(actual_mask,
  32401                                                   chunk_offset[idx],
  32402                                                   q_offset.width[idx],
  32403                                                   out_mask1);
  32404             BCM_IF_ERROR_RETURN(rv);
  32405 
  32406             rv = _bcm_field_qual_partial_data_set(out_mask1, start_offset,
  32407                                               q_offset.width[idx], out_mask2);
  32408             BCM_IF_ERROR_RETURN(rv);
  32409 
  32410             start_offset += q_offset.width[idx];
  32411 
  32412         }
  32413 
  32414         /* Program data/mask pair to tcam buffer. */
  32415         /* coverity[callee_ptr_arith : FALSE] */
  32416         rv = _bcm_field_qual_value_set(unit, &q_offset, f_ent + part_idx,
  32417                                        out_data2, out_mask2);
  32418         BCM_IF_ERROR_RETURN(rv);
  32419 
  32420     }
  32421 
  32422     /*
  32423      * Verify whether qualifier offset is present in the qual Array.
  32424      */
  32425     if (miss_count == parts_cnt) {
  32426         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  32427               "Qualifier[%s] Offset not found for Entry:%d\n\r"),
  32428                _field_qual_name(qual), entry));
  32429 
  32430         return BCM_E_NOT_FOUND;
  32431     }
  32432 
  32433     f_ent->flags |= _FP_ENTRY_DIRTY;
  32434     return (BCM_E_NONE);
  32435 }
  32436 
  32437 /*
  32438  * Function:
  32439  *     _bcm_field_th_entry_qualifier_key_get
  32440  *
  32441  * Purpose:
  32442  *     Get qualifier match value and mask.
  32443  *
  32444  * Parameters:
  32445  *     unit      - BCM device number
  32446  *     entry     - Entry id.
  32447  *     qual_id   - qualifier id.
  32448  *     q_data    - Qualifier data array.
  32449  *     q_mask    - Qualifier mask array.
  32450  * Returns:
  32451  *     Nothing.
  32452  */
  32453 int
  32454 _bcm_field_th_entry_qualifier_key_get(int unit,
  32455                                       bcm_field_entry_t entry,
  32456                                       int qual_id,
  32457                                       _bcm_field_qual_data_t q_data,
  32458                                       _bcm_field_qual_data_t q_mask)
  32459 {
  32460     int     rv;         /* Operation return status.      */
  32461     int     miss_count; /* Number of partitions having
  32462                          * no offset info for qual_id.
  32463                          */
  32464     int     idx;        /* Temp variable used for indexing. */
  32465     int     entry_parts; /* Number of TCAM partitions. */
  32466     int     part_ct;     /* Varable to hold the current partiotion number. */
  32467     int     get_start_bit = -1;
  32468     int     set_start_bit = -1;
  32469     uint8   hints_present = 0;
  32470     uint16  total_width = 0;
  32471     uint16  chunk_size[_BCM_FIELD_QUAL_OFFSET_MAX] = {0}; /* Size of all chunks
  32472                                                    * of a qualifier distributed
  32473                                                * across different partitions. */
  32474     uint16  chunk_offset[_BCM_FIELD_QUAL_OFFSET_MAX] = {0}; /* offsets of all
  32475                                                * chunks of a qualifier w.r.t
  32476                                                * actual qualifier size. */
  32477     uint32  width = 0;   /* Width of a qualifier in a partition. */
  32478 
  32479     uint32  start_offset = 0; /* Start offset for each chunk in a prtition*/
  32480 #if 0
  32481     uint32  qual_width = 0; /* Actual width of qualifier in the shared chunk. */
  32482     _field_stage_t  *stage_fc; /* Field stage operational structure. */
  32483 #endif
  32484     _field_entry_t  *f_ent;      /* Field entry structure.        */
  32485     _bcm_field_qual_data_t    part_data; /* Qualifier data in a partition. */
  32486     _bcm_field_qual_data_t    part_mask; /* Qualifier mask in a partition. */
  32487     _bcm_field_qual_data_t    chunk_data; /* Qual data of a particular chunk. */
  32488     _bcm_field_qual_data_t    chunk_mask; /* Qual mask of a particular chunk. */
  32489     _bcm_field_qual_data_t    actual_data;
  32490     _bcm_field_qual_data_t    actual_mask;
  32491     _bcm_field_qual_data_t    qual_bitmap;
  32492     _bcm_field_qual_offset_t  q_offset; /* Qual offset in the tcam part. */
  32493 
  32494     /* Get entry part that contains requested qualifier. */
  32495     rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent);
  32496     BCM_IF_ERROR_RETURN(rv);
  32497 
  32498     if ((f_ent->group->stage_id != _BCM_FIELD_STAGE_INGRESS) &&
  32499         (f_ent->group->stage_id != _BCM_FIELD_STAGE_EXACTMATCH) &&
  32500         (f_ent->group->stage_id != _BCM_FIELD_STAGE_FLOWTRACKER)) {
  32501        return BCM_E_INTERNAL;
  32502     }
  32503 
  32504     /* Get number of parts in field entry based on group flags. */
  32505     rv = _bcm_field_th_entry_tcam_parts_count (unit, f_ent->group->flags,
  32506                                                &entry_parts);
  32507     BCM_IF_ERROR_RETURN(rv);
  32508 
  32509     /* Update each chunk size of the qualifier. */
  32510     for (part_ct = 0; part_ct < entry_parts; ++part_ct) {
  32511 
  32512         sal_memset(&q_offset, 0, sizeof(_bcm_field_qual_offset_t));
  32513         /* Retrieve the Qualifier offsets for the particular entry part */
  32514         rv = _bcm_field_th_qual_part_offset_get(unit, f_ent + part_ct,
  32515                                                 part_ct, qual_id, &q_offset);
  32516 
  32517         if (rv == BCM_E_NOT_FOUND) {
  32518             continue;
  32519         } else if (BCM_FAILURE(rv)) {
  32520            return rv;
  32521         }
  32522 
  32523         for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) {
  32524              if (q_offset.width[idx]) {
  32525                  chunk_size[idx] = q_offset.width[idx];
  32526                  total_width += chunk_size[idx];
  32527              }
  32528         }
  32529     }
  32530 
  32531     /* Update each chunk offset of the qualifier. offsets in q_offset
  32532      * are local to the partition but chunk_offset array will have offsets
  32533      * across the partitions.
  32534      */
  32535     for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) {
  32536 
  32537         if (idx == 0) {
  32538             chunk_offset[idx] = 0;
  32539             continue;
  32540         }
  32541 
  32542         if (chunk_size[idx]) {
  32543            chunk_offset[idx] = chunk_offset[idx-1] + chunk_size[idx - 1];
  32544         } else {
  32545            break;
  32546         }
  32547     }
  32548 
  32549     miss_count = 0;
  32550     _FP_QUAL_DATA_CLEAR(actual_data);
  32551     _FP_QUAL_DATA_CLEAR(actual_mask);
  32552     for (part_ct = 0; part_ct < entry_parts; part_ct++) {
  32553 
  32554         /* Initialize q_offset to NULL */
  32555         sal_memset(&q_offset, 0x0, sizeof(q_offset));
  32556 
  32557         /* Retrieve the Qualifier offsets for the particular entry part */
  32558         rv = _bcm_field_th_qual_part_offset_get(unit, f_ent, part_ct,
  32559                                                qual_id, &q_offset);
  32560         if (rv == BCM_E_NOT_FOUND) {
  32561            miss_count += 1;
  32562            continue;
  32563         } else if (BCM_FAILURE(rv)) {
  32564            return rv;
  32565         }
  32566 
  32567         width = 0;
  32568         _FP_QUAL_DATA_CLEAR(part_data);
  32569         _FP_QUAL_DATA_CLEAR(part_mask);
  32570 
  32571         /* Combined width of a qualifier for a given part */
  32572         _BCM_FIELD_QUAL_MULTI_OFFSET_WIDTH(&q_offset, width);
  32573         if (width > 0) {
  32574            /* Read qualifier match value and mask. */
  32575            rv = _bcm_field_qual_value_get(unit, &q_offset, f_ent + part_ct,
  32576                                           part_data, part_mask);
  32577            BCM_IF_ERROR_RETURN(rv);
  32578         } else {
  32579            continue;
  32580         }
  32581 
  32582         start_offset = 0;
  32583         /* Extract relevent data for this partion from user passed data. */
  32584         for (idx = 0; idx < _BCM_FIELD_QUAL_OFFSET_MAX; idx++) {
  32585 
  32586             if (0 == q_offset.width[idx]) {
  32587                 continue;
  32588             }
  32589 
  32590             _FP_QUAL_DATA_CLEAR(chunk_data);
  32591             _FP_QUAL_DATA_CLEAR(chunk_mask);
  32592 
  32593 
  32594             rv = _bcm_field_qual_partial_data_get(part_data, start_offset,
  32595                                                q_offset.width[idx], chunk_data);
  32596             BCM_IF_ERROR_RETURN(rv);
  32597 
  32598             rv = _bcm_field_qual_partial_data_get(part_mask, start_offset,
  32599                                                q_offset.width[idx], chunk_mask);
  32600             BCM_IF_ERROR_RETURN(rv);
  32601 
  32602             /* Adjust Data and Mask based on the part offsets. */
  32603             rv = _bcm_field_qual_partial_data_set(chunk_data, chunk_offset[idx],
  32604                                               q_offset.width[idx], actual_data);
  32605             BCM_IF_ERROR_RETURN(rv);
  32606             rv = _bcm_field_qual_partial_data_set(chunk_mask, chunk_offset[idx],
  32607                                               q_offset.width[idx], actual_mask);
  32608             BCM_IF_ERROR_RETURN(rv);
  32609 
  32610             /* Increment the offset for the next part */
  32611             start_offset += q_offset.width[idx];
  32612         }
  32613     }
  32614 
  32615     /*
  32616      * Verify whether qualifier offset is present in the qual Array.
  32617      */
  32618     if (miss_count == entry_parts) {
  32619         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  32620               "Qualifier[%s] Offset not found for Entry:%d\n\r"),
  32621                _field_qual_name(qual_id), entry));
  32622 
  32623         return BCM_E_NOT_FOUND;
  32624     }
  32625 
  32626 
  32627     _FP_QUAL_DATA_CLEAR(q_data);
  32628     _FP_QUAL_DATA_CLEAR(q_mask);
  32629 
  32630     rv = _bcm_field_th_qual_hints_get(unit, qual_id, f_ent->group->hintid,
  32631                                       &f_ent->group->qset,
  32632                                       &hints_present, qual_bitmap);
  32633     BCM_IF_ERROR_RETURN(rv);
  32634 
  32635     width = 0;
  32636     set_start_bit = -1;
  32637     get_start_bit = 0;
  32638     if (hints_present) {
  32639         for (idx = 0; idx < _FP_QUAL_DATA_WORDS * 32; idx++) {
  32640             if (SHR_BITGET(qual_bitmap, idx)) {
  32641                if (-1 == set_start_bit) {
  32642                   set_start_bit = idx;
  32643                }
  32644 
  32645                width++;
  32646             } else {
  32647                if (-1 != set_start_bit) {
  32648 
  32649                   _FP_QUAL_DATA_CLEAR(part_data);
  32650                   _FP_QUAL_DATA_CLEAR(part_mask);
  32651 
  32652                   rv = _bcm_field_qual_partial_data_get(actual_data,
  32653                                                         get_start_bit,
  32654                                                         width, part_data);
  32655                   BCM_IF_ERROR_RETURN(rv);
  32656 
  32657                   rv = _bcm_field_qual_partial_data_set(part_data,
  32658                                                         set_start_bit,
  32659                                                         width, q_data);
  32660                   BCM_IF_ERROR_RETURN(rv);
  32661 
  32662                   rv = _bcm_field_qual_partial_data_get(actual_mask,
  32663                                                         get_start_bit,
  32664                                                         width, part_mask);
  32665                   BCM_IF_ERROR_RETURN(rv);
  32666 
  32667                   rv = _bcm_field_qual_partial_data_set(part_mask,
  32668                                                         set_start_bit,
  32669                                                         width, q_mask);
  32670                   BCM_IF_ERROR_RETURN(rv);
  32671 
  32672 
  32673                   get_start_bit += width;
  32674                   set_start_bit = -1;
  32675                   width = 0;
  32676                }
  32677             }
  32678         }
  32679     } else {
  32680         sal_memcpy(q_data, actual_data, sizeof(actual_data));
  32681         sal_memcpy(q_mask, actual_mask, sizeof(actual_mask));
  32682     }
  32683 
  32684     return (BCM_E_NONE);
  32685 }
  32686 
  32687 /*
  32688  * Function:
  32689  *      _bcm_field_th_qualifier_delete
  32690  * Purpose:
  32691  *      Remove match criteria from a field processor entry.
  32692  * Parameters:
  32693  *      unit    - (IN) Unit number.
  32694  *      entry   - (IN) BCM field entry id.
  32695  *      qual_id - (IN) BCM field qualifier id.
  32696  * Returns:
  32697  *      BCM_E_XXX
  32698  * Notes:
  32699  *   The assumption is that all qualifiers are less then 128 bit.
  32700  */
  32701 int
  32702 _bcm_field_th_qualifier_delete(int unit, bcm_field_entry_t entry,
  32703                                bcm_field_qualify_t qual_id)
  32704 {
  32705     _bcm_field_qual_data_t    q_data;  /* Qualifier match data.     */
  32706     _bcm_field_qual_data_t    q_mask;  /* Qualifier match mask.     */
  32707     int rv = BCM_E_NONE;      /* Operation return status.  */
  32708     _field_entry_t            *f_ent; /* Field Entry */
  32709 
  32710     sal_memset(q_data, 0, sizeof(_bcm_field_qual_data_t));
  32711     sal_memset(q_mask, 0, sizeof(_bcm_field_qual_data_t));
  32712 
  32713     /* Retrieve the field entry. */
  32714     rv = _field_entry_get(unit, entry, _FP_ENTRY_PRIMARY, &f_ent);
  32715     BCM_IF_ERROR_RETURN(rv);
  32716 
  32717     if ((BCM_FIELD_QSET_TEST(f_ent->group->qset, qual_id)) &&
  32718         (_BCM_FIELD_IS_PBMP_QUALIFIER(qual_id))) {
  32719         BCM_PBMP_CLEAR(f_ent->pbmp.data);
  32720         BCM_PBMP_CLEAR(f_ent->pbmp.mask);
  32721     }
  32722 
  32723     if (_BCM_FIELD_IS_PRESEL_ENTRY(entry) == TRUE) {
  32724        rv = _bcm_field_presel_qualify_set(unit, entry, qual_id,
  32725                                           q_data, q_mask);
  32726 
  32727        if (qual_id == bcmFieldQualifyMixedSrcClassId) {
  32728            rv = _bcm_field_th_qualifier_MixedSrcClassId_delete(unit, entry);
  32729        }
  32730 
  32731     } else {
  32732         if ((qual_id != bcmFieldQualifyExactMatchActionClassId) &&
  32733             (qual_id != bcmFieldQualifyExactMatchHitStatus) &&
  32734             (qual_id != bcmFieldQualifyExactMatchGroupClassId)) {
  32735             rv = _bcm_field_th_qualify_set(unit, entry, qual_id,
  32736                                                  q_data, q_mask,
  32737                                                  _FP_QUALIFIER_DEL);
  32738         } else {
  32739             rv = _field_th_em_qualifier_set(unit, entry, qual_id,
  32740                                                   q_data, q_mask);
  32741         }
  32742     }
  32743 
  32744     if (BCM_FAILURE(rv)) {
  32745         LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  32746               "Qualifier[%s] delete failed for Entry:%d (0x%x)\n\r"),
  32747                _field_qual_name(qual_id), entry, entry));
  32748     }
  32749     return (rv);
  32750 }
  32751 
  32752 /*
  32753  * Function:
  32754  *     _bcm_field_th_lt_tcam_data_mem_get
  32755  *
  32756  * Purpose:
  32757  *     Retrieve Preselector tcam & data memories for a specific pipeline stage.
  32758  *
  32759  * Parameters:
  32760  *     unit       -  (IN)  BCM device number.
  32761  *     stage_fc   -  (IN)  Reference to Field Stage Control structure.
  32762  *     instance   -  (IN)  Pipe Instance.
  32763  *     mem_type   -  (IN)  Type of Memory (_BCM_FIELD_MEM_TYPE_xx).
  32764  *     view_type  -  (IN)  Memory View type (_BCM_FIELD_MEM_VIEW_TYPE_xx).
  32765  *     tcam_mem   -  (OUT) Reference to TCAM Memory id.
  32766  *     data_mem   -  (OUT) Reference to DATA Memory id.
  32767  *
  32768  * Returns:
  32769  *     BCM_E_XXX
  32770  */
  32771 int
  32772 _bcm_field_th_lt_tcam_policy_mem_get(int unit, _field_stage_t *stage_fc,
  32773                                      int instance, int mem_type, int view_type,
  32774                                      soc_mem_t *tcam_mem, soc_mem_t *data_mem)
  32775 {
  32776     soc_mem_t tcam_ptr, data_ptr, comb_ptr;
  32777 
  32778     /* Input parameters check. */
  32779     if (NULL == stage_fc) {
  32780         return (BCM_E_PARAM);
  32781     }
  32782 
  32783     if ((((view_type & _BCM_FIELD_MEM_VIEW_TYPE_TCAM) ||
  32784           (view_type & _BCM_FIELD_MEM_VIEW_TYPE_TCAM_DATA_COMB)) &&
  32785          (tcam_mem == NULL)) ||
  32786         ((view_type & _BCM_FIELD_MEM_VIEW_TYPE_DATA) &&
  32787          (data_mem == NULL))) {
  32788         return (BCM_E_PARAM);
  32789     }
  32790 
  32791     /* Validate instance */
  32792     if ((instance < 0) || (instance >= _FP_MAX_NUM_PIPES)) {
  32793         return (BCM_E_PARAM);
  32794     }
  32795 
  32796     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  32797        instance = _FP_GLOBAL_INST;
  32798     }
  32799 
  32800     switch (mem_type) {
  32801        case _BCM_FIELD_MEM_TYPE_IFP_LT:
  32802             if (stage_fc->stage_id != _BCM_FIELD_STAGE_INGRESS) {
  32803                return BCM_E_PARAM;
  32804             }
  32805             BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  32806                                             IFP_LOGICAL_TABLE_SELECT_TCAM_ONLYm,
  32807                                             instance, &tcam_ptr));
  32808             BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  32809                                             IFP_LOGICAL_TABLE_SELECT_DATA_ONLYm,
  32810                                             instance, &data_ptr));
  32811             BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  32812                                             IFP_LOGICAL_TABLE_SELECTm,
  32813                                             instance, &comb_ptr));
  32814 
  32815             break;
  32816 
  32817        case _BCM_FIELD_MEM_TYPE_EM_LT:
  32818             if (stage_fc->stage_id != _BCM_FIELD_STAGE_EXACTMATCH) {
  32819                return BCM_E_PARAM;
  32820             }
  32821             BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  32822                                     EXACT_MATCH_LOGICAL_TABLE_SELECT_TCAM_ONLYm,
  32823                                     instance, &tcam_ptr));
  32824             BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  32825                                     EXACT_MATCH_LOGICAL_TABLE_SELECT_DATA_ONLYm,
  32826                                     instance, &data_ptr));
  32827             BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  32828                                     EXACT_MATCH_LOGICAL_TABLE_SELECTm,
  32829                                     instance, &comb_ptr));
  32830             break;
  32831 
  32832 #if defined(BCM_FLOWTRACKER_SUPPORT)
  32833         case _BCM_FIELD_MEM_TYPE_FT_LT:
  32834             if (stage_fc->stage_id != _BCM_FIELD_STAGE_FLOWTRACKER) {
  32835                 return BCM_E_PARAM;
  32836             }
  32837             /* Only global mode is supported */
  32838             tcam_ptr = BSK_FTFP_LTS_LOGICAL_TBL_SEL_TCAMm;
  32839             data_ptr = BSK_FTFP_LTS_LOGICAL_TBL_SEL_SRAMm;
  32840             comb_ptr = INVALIDm;
  32841             break;
  32842 #endif
  32843 
  32844        default:
  32845             return BCM_E_PARAM;
  32846     }
  32847     switch (view_type) {
  32848        case _BCM_FIELD_MEM_VIEW_TYPE_TCAM:
  32849            *tcam_mem = tcam_ptr;
  32850            break;
  32851        case _BCM_FIELD_MEM_VIEW_TYPE_DATA:
  32852            *data_mem = data_ptr;
  32853            break;
  32854        case (_BCM_FIELD_MEM_VIEW_TYPE_TCAM |
  32855              _BCM_FIELD_MEM_VIEW_TYPE_DATA):
  32856            *tcam_mem = tcam_ptr;
  32857            *data_mem = data_ptr;
  32858          break;
  32859        case _BCM_FIELD_MEM_VIEW_TYPE_TCAM_DATA_COMB:
  32860            *tcam_mem = comb_ptr;
  32861            break;
  32862        default:
  32863            return (BCM_E_PARAM);
  32864     }
  32865 
  32866     return (BCM_E_NONE);
  32867 }
  32868 
  32869 /*
  32870  * Function:
  32871  *     _field_th_write_slice_map_vfp
  32872  *
  32873  * Purpose:
  32874  *     Write the VFP_SLICE_MAP (Lookup) or EFP_SLICE_MAP (Egress)
  32875  *
  32876  * Parameters:
  32877  *     unit     - Device number.
  32878  *     stage_fc - pointer to stage control block.
  32879  *     fg       - Field Group Structure.
  32880  *
  32881  * Returns:
  32882  *     BCM_E_XXX
  32883  */
  32884 STATIC int
  32885 _field_th_write_slice_map_vfp_efp(int unit,
  32886                                   _field_stage_t *stage_fc,
  32887                                   _field_group_t *fg)
  32888 {
  32889     soc_reg_t reg;                   /* HW Register.             */
  32890     soc_field_t field;               /* HW entry fields.         */
  32891     uint32 map_entry;                /* HW entry buffer.         */
  32892     int vmap_size;                   /* Virtual map index count. */
  32893     uint32 value;                    /* Field entry value.       */
  32894     int idx;                         /* Map fields iterator.     */
  32895     int rv;                          /* Operation return status. */
  32896     int inst;                        /* Pipe Instance.           */
  32897 
  32898 
  32899     /* Input parameters check. */
  32900     if (NULL == stage_fc || NULL == fg) {
  32901         return (BCM_E_PARAM);
  32902     }
  32903 
  32904     if ((stage_fc->stage_id != _BCM_FIELD_STAGE_LOOKUP) &&
  32905         (stage_fc->stage_id != _BCM_FIELD_STAGE_EGRESS)) {
  32906         return BCM_E_PARAM;
  32907     }
  32908 
  32909     /* Calculate virtual map size. */
  32910     rv = _bcm_field_virtual_map_size_get(unit, stage_fc, &vmap_size);
  32911     BCM_IF_ERROR_RETURN(rv);
  32912 
  32913     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  32914         inst = _FP_GLOBAL_INST;
  32915     } else {
  32916         inst = fg->instance;
  32917     }
  32918 
  32919     if ((stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP)) {
  32920          BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  32921                                                             VFP_SLICE_MAPr,
  32922                                                             inst, &reg));
  32923     } else {
  32924          BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  32925                                                             EFP_SLICE_MAPr,
  32926                                                             inst, &reg));
  32927     }
  32928 
  32929     inst = fg->instance;
  32930 
  32931     rv = soc_reg32_get(unit, reg, REG_PORT_ANY, 0, &map_entry);
  32932     BCM_IF_ERROR_RETURN(rv);
  32933 
  32934     for (idx = 0; idx < vmap_size; idx++) {
  32935         value = (stage_fc->vmap[inst][_FP_VMAP_DEFAULT][idx]).vmap_key;
  32936         field = vfp_efp_virtual_to_physical_map[idx];
  32937         soc_reg_field_set(unit, reg, &map_entry, field, value);
  32938 
  32939         value = (stage_fc->vmap[inst][_FP_VMAP_DEFAULT][idx]).virtual_group;
  32940         field = vfp_efp_virtual_to_group_map[idx];
  32941         soc_reg_field_set(unit, reg, &map_entry, field, value);
  32942     }
  32943 
  32944     rv = soc_reg32_set(unit, reg, REG_PORT_ANY, 0, map_entry);
  32945     BCM_IF_ERROR_RETURN(rv);
  32946 
  32947     return (BCM_E_NONE);
  32948 }
  32949 
  32950 /*
  32951  * Function:
  32952  *     _bcm_field_th_write_slice_map
  32953  * Purpose:
  32954  *     Write EFP_SLICE_MAP, VFP_SLICE_MAP for egress and lookup stages.
  32955  * Parameters:
  32956  *     unit       - (IN) BCM device number
  32957  *     stage_fc   - (IN) stage control structure
  32958  *     fg         - (IN) reference to field group structure.
  32959  * Returns:
  32960  *     BCM_E_XXX
  32961  */
  32962 
  32963 int
  32964 _bcm_field_th_write_slice_map(int unit,
  32965                               _field_stage_t *stage_fc,
  32966                               _field_group_t *fg)
  32967 {
  32968     switch (stage_fc->stage_id) {
  32969         case _BCM_FIELD_STAGE_LOOKUP:
  32970         case _BCM_FIELD_STAGE_EGRESS:
  32971             return (_field_th_write_slice_map_vfp_efp(unit, stage_fc, fg));
  32972 
  32973         default:
  32974             ;
  32975     }
  32976 
  32977     return (BCM_E_INTERNAL);
  32978 }
  32979 
  32980 /*
  32981  * Function:
  32982  *      _field_th_qset_comb_set
  32983  * Purpose:
  32984  *      set combination for qset array
  32985  * Parameters:
  32986  *      unit   - (IN)    Unit number.
  32987  *      arr    - (IN)    Qual data array
  32988  *      start  - (IN)    Start index of iteration
  32989  *      end    - (IN)    End index of iteration
  32990  *      index  - (IN)    Last member index
  32991  *      range  - (IN)    Combination Range
  32992  *      fc     - (IN) field_control to accesss qset_comb
  32993  * Returns:
  32994  *      BCM_E_***
  32995  * Notes:
  32996  */
  32997 /* keep track qset_comb index */
  32998 static uint32 qset_count ;
  32999 
  33000 void _field_th_qset_comb_set(int arr[], int data[], int start,
  33001                              int end,   int index,  int range,
  33002                              _field_control_t *fc)
  33003 {
  33004     int qual_index, comb_index;
  33005 
  33006     if (index == range)
  33007     {
  33008         fc->extd_qset_comb[qset_count][0] = 0;
  33009 
  33010         for (qual_index = 0; qual_index < range; qual_index++) {
  33011             fc->extd_qset_comb[qset_count][0]++;
  33012             fc->extd_qset_comb[qset_count][qual_index+1]
  33013                                 = data[qual_index];
  33014         }
  33015 
  33016         qset_count++;
  33017     }
  33018 
  33019     /* replace index with all possible elements. */
  33020     for (comb_index=start;
  33021          comb_index<=end && end-comb_index+1 >= range-index; comb_index++)
  33022     {
  33023         data[index] = arr[comb_index];
  33024         _field_th_qset_comb_set(arr, data, comb_index+1,
  33025                                 end, index+1, range, fc);
  33026     }
  33027 }
  33028 
  33029 /*
  33030  * Function:
  33031  *      _field_th_qset_comb_init
  33032  * Purpose:
  33033  *      initialize qset combination array
  33034  * Parameters:
  33035  *      unit   - (IN)    Unit number.
  33036  *      fc     - (INOUT) field_control
  33037  * Returns:
  33038  *      BCM_E_***
  33039  * Notes:
  33040  */
  33041 
  33042 int
  33043 _field_th_qset_comb_init(int unit, _field_control_t *fc)
  33044 {
  33045 
  33046     int qual_data_arr[] =
  33047             {_bcmFieldQualifyData0, _bcmFieldQualifyData1,
  33048              _bcmFieldQualifyData2, _bcmFieldQualifyData3,
  33049              _bcmFieldQualifyData4, _bcmFieldQualifyData5,
  33050              _bcmFieldQualifyData6, _bcmFieldQualifyData7,
  33051              _bcmFieldQualifyData8, _bcmFieldQualifyData9};
  33052     int temp_store_data[COUNTOF(qual_data_arr)];
  33053     int range, max_range, array_size;
  33054 
  33055     qset_count = 0;
  33056     max_range  = COUNTOF(fc->extd_qset_comb[0]) - 1;
  33057     array_size = COUNTOF(qual_data_arr);
  33058     sal_memset(fc->extd_qset_comb, -1, sizeof(fc->extd_qset_comb));
  33059 
  33060     for (range = 1; range <= max_range; range++) {
  33061         /* Program all combination using qual_data_arr[] */
  33062         _field_th_qset_comb_set(
  33063                         qual_data_arr, temp_store_data,
  33064                         0, array_size - 1,
  33065                         0, range, fc);
  33066     }
  33067 
  33068     fc->extd_qset_comb_init = 1;
  33069 
  33070     return BCM_E_NONE;
  33071 }
  33072 
  33073 /*
  33074  * Function:
  33075  *      _bcm_field_th_udf_chunks_to_int_qset
  33076  * Purpose:
  33077  *      Sets internal data qualifiers corrspeonding to the
  33078  *      offset chunks used by the UDF.
  33079  * Parameters:
  33080  *      unit                - (IN)  Unit number.
  33081  *      udf_chunks_bmap     - (IN)  UDF offsets chunks map
  33082  *      qset                - (OUT) Qualifier set
  33083  * Returns:
  33084  *      BCM_E_NONE
  33085  * Notes:
  33086  */
  33087 int
  33088 _bcm_field_th_udf_chunks_to_int_qset(int unit, uint32 udf_chunks_bmap,
  33089                                       bcm_field_qset_t *qset)
  33090 {
  33091     int idx, max_chunks = 0;
  33092 
  33093     max_chunks = BCMI_XGS4_UDF_CTRL_MAX_UDF_CHUNKS(unit);
  33094 
  33095 
  33096     for (idx = 0; idx < max_chunks; idx++) {
  33097         if(udf_chunks_bmap & (1 << idx)) {
  33098             if (idx == 0) {
  33099                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData0);
  33100             }
  33101             if (idx == 1) {
  33102                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData1);
  33103             }
  33104             if (idx == 2 || idx == 3) {
  33105                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData2);
  33106             }
  33107             if (idx == 4 || idx == 5) {
  33108                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData3);
  33109             }
  33110             if (idx == 6 || idx == 7) {
  33111                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData4);
  33112             }
  33113             if (idx == 8) {
  33114                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData5);
  33115             }
  33116             if (idx == 9) {
  33117                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData6);
  33118             }
  33119             if (idx == 0xa || idx == 0xb) {
  33120                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData7);
  33121             }
  33122             if (idx == 0xc || idx == 0xd) {
  33123                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData8);
  33124             }
  33125             if (idx == 0xe || idx == 0xf) {
  33126                 BCM_FIELD_QSET_ADD_INTERNAL(*qset, _bcmFieldQualifyData9);
  33127             }
  33128         }
  33129     }
  33130     return BCM_E_NONE;
  33131 }
  33132 
  33133 /*
  33134  * Function:
  33135  *      _bcm_field_th_qset_udf_offsets_alloc
  33136  * Purpose:
  33137  *      Allocates offset chunks based on the INPUT qset.
  33138  * Parameters:
  33139  *      unit          - (IN)  Unit number.
  33140  *      stage         - (IN)  Field Group Stage.
  33141  *      qset          - (IN)  Qualifier set.
  33142  *      req_offsets   - (IN)  Number of chunks to be allocated.
  33143  *      offset_array  - (OUT) Offset chunks in the order of availability.
  33144  * Returns:
  33145  *      BCM_E_XXX
  33146  * Notes:
  33147  */
  33148 int
  33149 _bcm_field_th_qset_udf_offsets_alloc(int unit, _field_stage_id_t stage,
  33150      bcm_field_qset_t qset, int req_offsets, int offset_array[], int *max_chunks,
  33151      int pipe_num)
  33152 {
  33153     int group_flags[5] =  {
  33154             /* SINGLE */
  33155             (_FP_GROUP_SPAN_SINGLE_SLICE),
  33156             /* DOUBLE_INTRA */
  33157             (_FP_GROUP_SPAN_SINGLE_SLICE | _FP_GROUP_INTRASLICE_DOUBLEWIDE),
  33158             /* DOUBLE */
  33159             (_FP_GROUP_SPAN_DOUBLE_SLICE),
  33160             /* QUAD_INTRA */
  33161             (_FP_GROUP_SPAN_DOUBLE_SLICE | _FP_GROUP_INTRASLICE_DOUBLEWIDE),
  33162             /* TRIPLE */
  33163             (_FP_GROUP_SPAN_TRIPLE_SLICE)
  33164         };
  33165 
  33166     int i, j;
  33167     int qid;
  33168     int qual_count;
  33169     int rv = BCM_E_NONE;
  33170     int num_chunks = 0;
  33171     _field_group_t fg;
  33172     bcm_field_qset_t qset_test;
  33173     int idx;
  33174 
  33175     uint32 qset_comb_count;
  33176 
  33177     _field_control_t *fc = NULL;
  33178     _field_group_add_fsm_t fsm_ptr;
  33179     _field_stage_t *stage_fc; /* Stage Field control structure*/
  33180 
  33181     BCM_IF_ERROR_RETURN(
  33182             _field_control_get(unit,  &fc));
  33183 
  33184     if (fc->extd_qset_comb_init != 1) {
  33185         BCM_IF_ERROR_RETURN(_field_th_qset_comb_init(unit, fc));
  33186     }
  33187 
  33188     qset_comb_count =  COUNTOF(fc->extd_qset_comb);
  33189 
  33190     /* Initialize group creation tracking structure. */
  33191     sal_memset(&fg, 0, sizeof(fg));
  33192 
  33193     fg.stage_id = stage;
  33194 
  33195     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, fg.stage_id,
  33196         &stage_fc));
  33197 
  33198     for (i = 0; i < COUNTOF(group_flags); i++) {
  33199 
  33200         /* TD_TT family  support intra_double mode group only in VFP */
  33201         if (soc_feature(unit, soc_feature_field_intraslice_double_wide)) {
  33202             if (((i == 1) || (i == 4)) && (stage != _BCM_FIELD_STAGE_LOOKUP)) {
  33203                 continue;
  33204             }
  33205         }
  33206 
  33207         if ((soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) && (i == 0)) {
  33208             continue;
  33209         }
  33210         if ((stage == _BCM_FIELD_STAGE_INGRESS) ||
  33211             (stage == _BCM_FIELD_STAGE_EXACTMATCH)) {
  33212             /* Skip quad mode for ingress and EM */
  33213             if ( i == 3)  {
  33214                 continue;
  33215             }
  33216         }
  33217 
  33218         fg.flags = group_flags[i];
  33219 
  33220         for (j = 0; j < qset_comb_count; j++) {
  33221 
  33222             num_chunks = 0;
  33223             qual_count = fc->extd_qset_comb[j][0];
  33224 
  33225             sal_memcpy(&qset_test, &qset, sizeof(bcm_field_qset_t));
  33226 
  33227             for (qid = 0; qid < qual_count; qid++) {
  33228                 BCM_FIELD_QSET_ADD_INTERNAL(qset_test, fc->extd_qset_comb[j][1 + qid]);
  33229             }
  33230             if (BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageLookup) ||
  33231                 (_BCM_FIELD_STAGE_LOOKUP == stage)) {
  33232                 rv = _field_selcode_assign(unit, qset_test, 1, &fg);
  33233             } else if
  33234             (BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageIngress) ||
  33235             !(BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageLookup)) ||
  33236             BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageEgress) ||
  33237             BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageClass) ||
  33238             BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageClassExactMatch) ||
  33239             BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageIngressExactMatch)) {
  33240                 sal_memset(&fsm_ptr, 0, sizeof(_field_group_add_fsm_t));
  33241                 fsm_ptr.fg = &fg;
  33242                 fsm_ptr.fc = fc;
  33243                 fsm_ptr.stage_fc = stage_fc;
  33244                 fg.qset = qset_test;
  33245                 fsm_ptr.flags |= _FP_GROUP_CONFIG_VALIDATE;
  33246                 rv = _field_th_ext_code_assign(unit, 1, &fsm_ptr);
  33247             } else {
  33248                 return BCM_E_PARAM;
  33249             }
  33250 
  33251             if (BCM_SUCCESS(rv)) {
  33252 
  33253                 for (qid = 0; qid < qual_count; qid++) {
  33254                     rv = _bcm_esw_field_qual_udf_offsets_get(unit,
  33255                                      fc->extd_qset_comb[j][1 + qid], &fg,
  33256                                      offset_array+num_chunks, &num_chunks,
  33257                                      pipe_num);
  33258                     if (BCM_FAILURE(rv)) {
  33259                         if (BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageLookup)) {
  33260                             for (idx = 0; idx < _FP_MAX_ENTRY_WIDTH; idx++) {
  33261                                 BCM_IF_ERROR_RETURN(_bcm_field_group_qualifiers_free(&fg, idx));
  33262                             }
  33263                         }
  33264                         return rv;
  33265                     }
  33266                 }
  33267 
  33268                 if (num_chunks >= req_offsets) {
  33269                     break;
  33270                 }
  33271             }
  33272         }
  33273         if (num_chunks >= req_offsets) {
  33274             break;
  33275         }
  33276     }
  33277 
  33278 #if 0
  33279     if (BCM_FIELD_QSET_TEST(qset_test, bcmFieldQualifyStageLookup)) {
  33280         for (idx = 0; idx < _FP_MAX_ENTRY_WIDTH; idx++) {
  33281             BCM_IF_ERROR_RETURN(_bcm_field_group_qualifiers_free(&fg, idx));
  33282         }
  33283     }
  33284 #endif
  33285 
  33286     /* The UDF offset allocation to suit in an fp group
  33287      * that consists of the user specified qset is not possible */
  33288     if (num_chunks < req_offsets) {
  33289         return BCM_E_RESOURCE;
  33290     }
  33291 
  33292     *max_chunks = num_chunks;
  33293 
  33294     return BCM_E_NONE;
  33295 }
  33296 
  33297 /*
  33298  * Function:
  33299  *      _bcm_field_th_qual_udf_offsets_get
  33300  * Purpose:
  33301  *      Gets list of udf id objects in a qset
  33302  * Parameters:
  33303  *      unit          - (IN)  Unit number.
  33304  *      qid           - (IN)  Internal Data qualifier.
  33305  *      chunk_order   - (IN)  Offset chunks in the order of availability.
  33306  *      num_chunks    - (OUT) Number of chunks.
  33307  * Returns:
  33308  *      BCM_E_NONE
  33309  * Notes:
  33310  */
  33311 int
  33312 _bcm_field_th_qual_udf_offsets_get(int unit, int qid,
  33313                                    int chunk_order[], int *num_chunks,
  33314                                    uint32 hw_bmap)
  33315 {
  33316     int idx;
  33317     int alloc_count = 0;
  33318 
  33319     int max_chunks = BCMI_XGS4_UDF_CTRL_MAX_UDF_CHUNKS(unit);
  33320 
  33321     _field_control_t *fc;
  33322 
  33323     BCM_IF_ERROR_RETURN(
  33324             _field_control_get(unit,  &fc));
  33325 
  33326 
  33327     for (idx = 0; idx < max_chunks; idx++) {
  33328         /* coverity[ptr_arith] */
  33329         if (SHR_BITGET(&hw_bmap, idx)) {
  33330             continue;
  33331         }
  33332 
  33333 
  33334         if (((qid == _bcmFieldQualifyData0) && (idx == 0)) ||
  33335             ((qid == _bcmFieldQualifyData1) && (idx == 1)) ||
  33336             ((qid == _bcmFieldQualifyData2) && ((idx == 2) || (idx == 3))) ||
  33337             ((qid == _bcmFieldQualifyData3) && ((idx == 4) || (idx == 5))) ||
  33338             ((qid == _bcmFieldQualifyData4) && ((idx == 6) || (idx == 7))) ||
  33339             ((qid == _bcmFieldQualifyData5) && ((idx == 8))) ||
  33340             ((qid == _bcmFieldQualifyData6) && ((idx == 9))) ||
  33341             ((qid == _bcmFieldQualifyData7) && ((idx == 0xa) || (idx == 0xb))) ||
  33342             ((qid == _bcmFieldQualifyData8) && ((idx == 0xc) || (idx == 0xd))) ||
  33343             ((qid == _bcmFieldQualifyData9) && ((idx == 0xe) || (idx == 0xf)))) {
  33344 
  33345                 chunk_order[alloc_count] = idx;
  33346                 alloc_count++;
  33347 
  33348                 if ((*num_chunks + alloc_count) >= max_chunks) {
  33349                     break;
  33350                 }
  33351             }
  33352         }
  33353 
  33354     *num_chunks += alloc_count;
  33355 
  33356     return BCM_E_NONE;
  33357 }
  33358 
  33359 
  33360 /*
  33361  * Function:
  33362  *      _bcm_field_th_qualify_udf_data_elem_get
  33363  * Purpose:
  33364  *       get qualifier id based on udf chunk index
  33365  * Parameters:
  33366  *      unit       - (IN)  Unit number.
  33367  *      idx        - (IN)  Index of UDF chunk
  33368  *      max_chunks - (IN)  Total number of UDF chunk
  33369  *      qid        - (INOUT)  Qualifier ID
  33370  * Returns:
  33371  *      BCM_E_XXX
  33372  * Notes:
  33373  */
  33374 int
  33375 _bcm_field_th_qualify_udf_data_elem_get(int unit, int idx,
  33376                                         int max_chunks,
  33377                                         int *qid)
  33378 {
  33379     if ((idx >= 0) && (idx < max_chunks)) {
  33380         if (idx == 0) {
  33381             *qid = _bcmFieldQualifyData0;
  33382         }
  33383         if (idx == 1) {
  33384             *qid = _bcmFieldQualifyData1;
  33385         }
  33386         if (idx == 2 || idx == 3) {
  33387             *qid = _bcmFieldQualifyData2;
  33388         }
  33389         if (idx == 4 || idx == 5) {
  33390             *qid = _bcmFieldQualifyData3;
  33391         }
  33392         if (idx == 6 || idx == 7) {
  33393             *qid = _bcmFieldQualifyData4;
  33394         }
  33395         if (idx == 8) {
  33396             *qid = _bcmFieldQualifyData5;
  33397         }
  33398         if (idx == 9) {
  33399             *qid = _bcmFieldQualifyData6;
  33400         }
  33401         if (idx == 0xa || idx == 0xb) {
  33402             *qid = _bcmFieldQualifyData7;
  33403         }
  33404         if (idx == 0xc || idx == 0xd) {
  33405             *qid = _bcmFieldQualifyData8;
  33406         }
  33407         if (idx == 0xe || idx == 0xf) {
  33408             *qid = _bcmFieldQualifyData9;
  33409         }
  33410         return BCM_E_NONE;
  33411     } else {
  33412         return BCM_E_PARAM;
  33413     }
  33414 }
  33415 
  33416 /*
  33417  * Function:
  33418  *      bcm_field_th_qualify_udf_get
  33419  * Purpose:
  33420  *      Qualify the field entry with data/mask corresponding to an offset chunk.
  33421  * Parameters:
  33422  *      unit            - (IN)  Unit number.
  33423  *      eid             - (IN)  Field Entry.
  33424  *      udf_id          - (IN)  UDF ID.
  33425  *      max_length      - (IN)  Length of bytes of data/mask to fetch.
  33426  *      data            - (OUT) Data to qualify the entry.
  33427  *      mask            - (OUT  Mask to qualify the entry.
  33428  *      actual_length   - (OUT) Length of bytes of data/mask fetched.
  33429  * Returns:
  33430  *      BCM_E_XXX
  33431  * Notes:
  33432  */
  33433 int
  33434 bcmi_field_th_qualify_udf_get(int unit, bcm_field_entry_t eid,
  33435                               bcm_udf_id_t udf_id, int max_length,
  33436                               uint8 *data, uint8 *mask, int *actual_length)
  33437 {
  33438     _field_stage_t          *stage_fc;          /* Stage field control.       */
  33439     _field_entry_t          *f_ent = NULL;
  33440     _field_group_t          *fg;
  33441     bcm_field_qset_t        *qset;
  33442     _bcm_field_udf_data_t   q_data;
  33443     _bcm_field_udf_data_t   q_mask;
  33444     uint32 local_data, local_mask;
  33445     bcmi_xgs4_udf_offset_info_t *offset_info = NULL;   /* UDF offset info.   */
  33446     uint8 *p_data = (uint8 *) &q_data;  /* qualifier data pointer */
  33447     uint8 *p_mask = (uint8 *) &q_mask;  /* qualifier mask pointer */
  33448     uint8 *p_local_data = (uint8 *) &local_data;  /* 32bit qualifier data pointer      */
  33449     uint8 *p_local_mask = (uint8 *) &local_mask;  /* 32bit qualifier mask pointer      */
  33450     int  num_elems = 0;
  33451     int  qid = 0, qual_index = 0;
  33452     int  iter_idx = 0, hw_idx = 0;    /* HW bitmap iteration index. */
  33453     int  rv;                          /* Operation return status.   */
  33454     int  copy_mem = 0, shift = 2, num_qual = 0;
  33455     int  copy_len;
  33456     int  len = 0;
  33457     int  offset_2_3 = 0;  /* HW offset 0 and 1 usage status. */
  33458     int  offset_4_5 = 0;  /* HW offset 2 and 3 usage status. */
  33459     int  offset_6_7 = 0;  /* HW offset 4 and 5 usage status. */
  33460     int  offset_a_b = 0;  /* HW offset 8 and 9 usage status. */
  33461     int  offset_c_d = 0;  /* HW offset a and b usage status. */
  33462     int  offset_e_f = 0;  /* HW offset c and d usage status. */
  33463 
  33464 #ifdef LE_HOST
  33465     uint32 data_swap, mask_swap;
  33466 #endif /* LE_HOST */
  33467 
  33468 
  33469     FP_LOCK(unit);
  33470     UDF_LOCK(unit);
  33471 
  33472     /* Get UDF info. */
  33473     rv = bcmi_xgs4_udf_offset_node_get(unit, udf_id,  &offset_info);
  33474     if (BCM_FAILURE(rv)) {
  33475         FP_UNLOCK(unit);
  33476         UDF_UNLOCK(unit);
  33477         return (rv);
  33478     }
  33479 
  33480     /* Get stage field control structure. */
  33481     rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc);
  33482     if (BCM_FAILURE(rv)) {
  33483         FP_UNLOCK(unit);
  33484         UDF_UNLOCK(unit);
  33485         return (rv);
  33486     }
  33487 
  33488     rv = _bcm_field_entry_get_by_id(unit, eid, &f_ent);
  33489     if (BCM_FAILURE(rv)) {
  33490         FP_UNLOCK(unit);
  33491         UDF_UNLOCK(unit);
  33492         return (rv);
  33493     }
  33494 
  33495     /* Get field group */
  33496     fg = f_ent->group;
  33497 
  33498     num_elems = BCMI_XGS4_UDF_CTRL_MAX_UDF_CHUNKS(unit);
  33499 
  33500     /* get qset */
  33501     qset = &(fg->qset);
  33502 
  33503     for (qual_index = _bcmFieldQualifyData0;
  33504          qual_index < _bcmFieldQualifyCount; qual_index++) {
  33505 
  33506         num_qual = 1;
  33507 
  33508         if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33509             qual_index == _bcmFieldQualifyData0) {
  33510             if (SHR_BITGET(qset->udf_map, 0x0)) {
  33511                 qid = _bcmFieldQualifyData0;
  33512                 hw_idx   = 0x0;
  33513                 copy_mem = 1;
  33514             }
  33515         }
  33516         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33517             qual_index == _bcmFieldQualifyData1) {
  33518             if (SHR_BITGET(qset->udf_map, 0x1)) {
  33519                 qid = _bcmFieldQualifyData1;
  33520                 hw_idx   = 0x1;
  33521                 copy_mem = 1;
  33522             }
  33523         }
  33524         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33525             qual_index == _bcmFieldQualifyData5) {
  33526             if (SHR_BITGET(qset->udf_map, 0x8)) {
  33527                 qid = _bcmFieldQualifyData5;
  33528                 hw_idx   = 0x8;
  33529                 copy_mem = 1;
  33530             }
  33531         }
  33532         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33533             qual_index == _bcmFieldQualifyData6) {
  33534             if (SHR_BITGET(qset->udf_map, 0x9)) {
  33535                 qid = _bcmFieldQualifyData6;
  33536                 hw_idx   = 0x9;
  33537                 copy_mem = 1;
  33538             }
  33539         }
  33540         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33541             qual_index == _bcmFieldQualifyData2) {
  33542             SHR_BITTEST_RANGE(qset->udf_map, 0x2, 2, offset_2_3);
  33543             if (offset_2_3) {
  33544                 num_qual = 2;
  33545                 qid = _bcmFieldQualifyData2;
  33546                 hw_idx   = 0x2;
  33547                 copy_mem = 1;
  33548             }
  33549         }
  33550         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33551             qual_index == _bcmFieldQualifyData3) {
  33552             SHR_BITTEST_RANGE(qset->udf_map, 0x4, 2, offset_4_5);
  33553             if (offset_4_5) {
  33554                 num_qual = 2;
  33555                 qid = _bcmFieldQualifyData3;
  33556                 hw_idx   = 0x4;
  33557                 copy_mem = 1;
  33558             }
  33559         }
  33560         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33561             qual_index == _bcmFieldQualifyData4) {
  33562             SHR_BITTEST_RANGE(qset->udf_map, 0x6, 2, offset_6_7);
  33563             if (offset_6_7) {
  33564                 num_qual = 2;
  33565                 qid = _bcmFieldQualifyData4;
  33566                 hw_idx   = 0x6;
  33567                 copy_mem = 1;
  33568             }
  33569         }
  33570         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33571             qual_index == _bcmFieldQualifyData7) {
  33572             SHR_BITTEST_RANGE(qset->udf_map, 0xa, 2, offset_a_b);
  33573             if (offset_a_b) {
  33574                 num_qual = 2;
  33575                 qid = _bcmFieldQualifyData7;
  33576                 hw_idx   = 0xa;
  33577                 copy_mem = 1;
  33578             }
  33579         }
  33580         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33581             qual_index == _bcmFieldQualifyData8) {
  33582             SHR_BITTEST_RANGE(qset->udf_map, 0xc, 2, offset_c_d);
  33583             if (offset_c_d) {
  33584                 num_qual = 2;
  33585                 qid = _bcmFieldQualifyData8;
  33586                 hw_idx   = 0xc;
  33587                 copy_mem = 1;
  33588             }
  33589         }
  33590         else if (BCM_FIELD_QSET_TEST_INTERNAL(*qset, qual_index) &&
  33591             qual_index == _bcmFieldQualifyData9) {
  33592             SHR_BITTEST_RANGE(qset->udf_map, 0xe, 2, offset_e_f);
  33593             if (offset_e_f) {
  33594                 num_qual = 2;
  33595                 qid = _bcmFieldQualifyData9;
  33596                 hw_idx   = 0xe;
  33597                 copy_mem = 1;
  33598             }
  33599         } else {
  33600             hw_idx = 0;
  33601             num_qual = 0;
  33602         }
  33603 
  33604         if (copy_mem == 1) {
  33605             _bcm_field_entry_qualifier_uint32_get(unit, eid, qid, &local_data, &local_mask);
  33606         }
  33607 
  33608 
  33609 #ifdef LE_HOST
  33610         data_swap = _shr_swap32(local_data);
  33611         local_data = data_swap;
  33612 
  33613         mask_swap = _shr_swap32(local_mask);
  33614         local_mask = mask_swap;
  33615 
  33616 #endif /* LE_HOST */
  33617 
  33618         /* Copy the data and mask */
  33619         if ((hw_idx < num_elems) && (copy_mem) &&
  33620             (len < offset_info->width)) {
  33621 
  33622             for (iter_idx = 0; iter_idx < num_qual; iter_idx++) {
  33623                 if (!(offset_info->hw_bmap & (1 << hw_idx))) {
  33624                     continue;
  33625                 }
  33626 
  33627                 copy_len = ((offset_info->width - len) == 1)? 1 : 2;
  33628 
  33629                 if (len == 0) {
  33630                     sal_memcpy((p_data + len), p_local_data + offset_info->byte_offset, copy_len);
  33631                     sal_memcpy((p_mask + len), p_local_mask + offset_info->byte_offset, copy_len);
  33632                 }
  33633                 else if ((num_qual == 1) || (iter_idx %2 == 0)) {
  33634                     sal_memcpy((p_data + len), p_local_data, copy_len);
  33635                     sal_memcpy((p_mask + len), p_local_mask, copy_len);
  33636                 } else {
  33637                     sal_memcpy((p_data + len), p_local_data + shift, copy_len);
  33638                     sal_memcpy((p_mask + len), p_local_mask + shift, copy_len);
  33639                 }
  33640 
  33641                 len+= copy_len;
  33642                 hw_idx++;
  33643             }
  33644         }
  33645         copy_mem = 0;
  33646 
  33647     } /* end of qual_index++ */
  33648 
  33649     sal_memcpy(data, p_data, offset_info->width);
  33650     sal_memcpy(mask, p_mask, offset_info->width);
  33651 
  33652     *actual_length = offset_info->width;
  33653 
  33654     FP_UNLOCK(unit);
  33655     UDF_UNLOCK(unit);
  33656 
  33657     return BCM_E_NONE;
  33658 }
  33659 
  33660 /*
  33661  * Function:
  33662  *      _bcm_field_th_qualify_LoopbackType
  33663  * Purpose:
  33664  *      Encode the loopback type qualified for Stage Egress
  33665  * Parameters:
  33666  *      unit  - (IN) BCM device number
  33667  *      loopback_type - (IN) Loopback Type
  33668  *      tcam_data     - (OUT) Qualifier data
  33669  *      tcam_mask     - (OUT) Qualifier mask
  33670  * Returns:
  33671  *      BCM_E_XXX
  33672  */
  33673 int _bcm_field_th_qualify_LoopbackType(
  33674         int                      unit,
  33675         bcm_field_LoopbackType_t loopback_type,
  33676         uint32                   *tcam_data,
  33677         uint32                   *tcam_mask)
  33678 {
  33679     switch (loopback_type) {
  33680         case bcmFieldLoopbackTypeAny:
  33681             *tcam_data = 0x10;
  33682             *tcam_mask = 0x10;
  33683             break;
  33684         case bcmFieldLoopbackTypeTunnelAny:
  33685             *tcam_data = 0x10;
  33686             *tcam_mask = 0x1f;
  33687             break;
  33688         case bcmFieldLoopbackTypeTrillNetwork:
  33689             *tcam_data = 0x11;
  33690             *tcam_mask = 0x1f;
  33691             break;
  33692         case bcmFieldLoopbackTypeTrillAccess:
  33693             *tcam_data = 0x12;
  33694             *tcam_mask = 0x1f;
  33695             break;
  33696         case bcmFieldLoopbackTypeMasquerade:
  33697             *tcam_data = 0x13;
  33698             *tcam_mask = 0x1f;
  33699             break;
  33700         default:
  33701             return (BCM_E_PARAM);
  33702     }
  33703 
  33704     return (BCM_E_NONE);
  33705 
  33706 }
  33707 
  33708 /*
  33709  * Function:
  33710  *      _bcm_field_th_qualify_LoopbackType_get
  33711  * Purpose:
  33712  *      Decode the loopback type qualified in Stage Egress
  33713  * Parameters:
  33714  *      unit  - (IN) BCM device number
  33715  *      tcam_data     - (IN) Qualifier data
  33716  *      tcam_mask     - (IN) Qualifier mask
  33717  *      loopback_type - (OUT) Loopback Type
  33718  * Returns:
  33719  *      BCM_E_XXX
  33720  */
  33721 int
  33722 _bcm_field_th_qualify_LoopbackType_get(
  33723             uint8                    tcam_data,
  33724             uint8                    tcam_mask,
  33725             bcm_field_LoopbackType_t *loopback_type)
  33726 {
  33727     switch (tcam_data & tcam_mask) {
  33728         case 0x10:
  33729             if (tcam_mask == 0x10) {
  33730                 *loopback_type = bcmFieldLoopbackTypeAny;
  33731             } else {
  33732                 *loopback_type = bcmFieldLoopbackTypeTunnelAny;
  33733             }
  33734             break;
  33735         case 0x11:
  33736             *loopback_type = bcmFieldLoopbackTypeTrillNetwork;
  33737             break;
  33738         case 0x12:
  33739             *loopback_type = bcmFieldLoopbackTypeTrillAccess;
  33740             break;
  33741         case 0x13:
  33742             *loopback_type = bcmFieldLoopbackTypeMasquerade;
  33743             break;
  33744         default:
  33745             return (BCM_E_PARAM);
  33746     }
  33747 
  33748     return (BCM_E_NONE);
  33749 }
  33750 
  33751 /*
  33752  * Function:
  33753  *     _bcm_field_th_entry_tcam_index_get
  33754  *
  33755  * Purpose:
  33756  *     Retrieve Field group entry's assigned TCAM index.
  33757  *
  33758  * Parameters:
  33759  *     unit              - (IN)  BCM device number
  33760  *     eid               - (IN)  Field entry ID.
  33761  *     logical_tcam_idx  - (OUT) Reference to Entry's logical tcam index.
  33762  *     physical_tcam_idx - (OUT) Reference to Entry's Physical tcam index.
  33763  *
  33764  * Returns:
  33765  *     BCM_E_xx
  33766  *
  33767  * Note:
  33768  *     In-case of IFP_TCAM narrow mode, the logical index is the free TCAM index
  33769  *     assigned to the entry during creation and the physical index is the
  33770  *     mapped HW index where the entry is actually written on priority basis.
  33771  *     For wide mode TCAMs, the logical and physical indices are same.
  33772  */
  33773 
  33774 int _bcm_field_th_entry_tcam_index_get(int unit, bcm_field_entry_t eid,
  33775                                        int *logical_tcam_idx,
  33776                                        int *physical_tcam_idx)
  33777 {
  33778     int                 rv;
  33779     _field_entry_t      *f_ent;
  33780     soc_mem_t           mem = INVALIDm;
  33781 
  33782     if (logical_tcam_idx == NULL || physical_tcam_idx == NULL) {
  33783        return BCM_E_PARAM;
  33784     }
  33785 
  33786     BCM_IF_ERROR_RETURN(_bcm_field_entry_get_by_id(unit, eid, &f_ent));
  33787 
  33788     *logical_tcam_idx = *physical_tcam_idx = f_ent->slice_idx;
  33789 
  33790     if ((f_ent->group->stage_id == _BCM_FIELD_STAGE_INGRESS) &&
  33791         ((f_ent->group->flags & _FP_GROUP_SPAN_SINGLE_SLICE) &&
  33792          !(f_ent->group->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE))) {
  33793         mem = IFP_TCAMm;
  33794     } else {
  33795         return BCM_E_NONE;
  33796     }
  33797 
  33798     rv = soc_mem_field_nw_tcam_prio_order_index_get(unit, mem,
  33799                                                     physical_tcam_idx);
  33800     if (SOC_FAILURE(rv)) {
  33801        return BCM_E_INTERNAL;
  33802     }
  33803 
  33804     return BCM_E_NONE;
  33805 }
  33806 
  33807 /*
  33808  * Function:
  33809  *      _bcm_field_th_ifp_slice_mode_get
  33810  * Purpose:
  33811  *      Retrieve the slice TCAM mode and enable status.
  33812  * Parameters:
  33813  *      unit       - (IN) BCM Device number.
  33814  *      pipe       - (IN) Pipe Instance. (pipe < 0 indicates Global.)
  33815  *      slice_num  - (IN) IFP TCAM Slice number.
  33816  *      slice_mode - (OUT) IFP TCAM mode.
  33817  *      slice_enabled - (OUT) Whether the slice is enabled.
  33818  *
  33819  * Returns:
  33820  *      BCM_E_XXX
  33821  */
  33822 int
  33823 _bcm_field_th_ifp_slice_mode_get(int unit, int pipe, int slice_num,
  33824                                  int *slice_mode, int *slice_enabled)
  33825 {
  33826    _field_slice_t  *fs = NULL;
  33827    _field_stage_t  *stage_fc;
  33828    int              inst;
  33829    uint8            status;     /* Field Init status. */
  33830 
  33831    /* Validate input parameters */
  33832    if ((slice_mode == NULL) || (slice_enabled == NULL) ||
  33833        (pipe >= SOC_MAX_NUM_PIPES) ||
  33834        (slice_num < 0 && slice_num > 11)) {
  33835       return BCM_E_PARAM;
  33836    }
  33837 
  33838    BCM_IF_ERROR_RETURN(_bcm_field_initialized_status_get(unit, &status));
  33839    if (status == FALSE) {
  33840       return BCM_E_INIT;
  33841    }
  33842 
  33843    BCM_IF_ERROR_RETURN(_field_stage_control_get(unit,
  33844                        _BCM_FIELD_STAGE_INGRESS, &stage_fc));
  33845 
  33846    if ((stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) &&
  33847        (pipe >= 0)) {
  33848       return BCM_E_CONFIG;
  33849    }
  33850 
  33851    inst = (pipe < 0) ? 0 : pipe;
  33852    /* coverity[overrun-local : FALSE] */
  33853    fs = stage_fc->slices[inst] + slice_num;
  33854    if (_BCM_FIELD_SLICE_HW_ENABLE & fs->slice_flags) {
  33855       *slice_enabled = TRUE;
  33856       if (soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) {
  33857           *slice_mode = _IFP_SLICE_MODE_WIDE;
  33858       } else {
  33859           /* Determine the slice mode based on group flags. */
  33860           *slice_mode = _BCM_FIELD_IS_SLICE_MODE_PBMP_SUPPORTED(fs->group_flags) ?
  33861                     _IFP_SLICE_MODE_WIDE : _IFP_SLICE_MODE_NARROW;
  33862       }
  33863    } else {
  33864       *slice_enabled = FALSE;
  33865       *slice_mode = _IFP_SLICE_MODE_WIDE; /* default mode */
  33866    }
  33867 
  33868    return BCM_E_NONE;
  33869 }
  33870 
  33871 /*
  33872  * Function:
  33873  *      _bcm_field_th_resync
  33874  * Purpose:
  33875  *      Sync HW entries with SW entries.
  33876  * Parameters:
  33877  *      unit       - (IN) BCM Device number.
  33878  *      stage_fc   - (IN) Reference to Field stage structure.
  33879  *
  33880  * Returns:
  33881  *      BCM_E_XXX
  33882  */
  33883 int
  33884 _bcm_field_th_resync(int unit, _field_stage_t *stage_fc)
  33885 {
  33886 
  33887     int               rv, tcam_idx;
  33888     _field_slice_t    *fs;
  33889     soc_mem_t         mem = INVALIDm;
  33890     soc_reg_t         reg = INVALIDr;
  33891     soc_field_t       field = VALIDf;
  33892     uint32            valid, e[SOC_MAX_MEM_FIELD_WORDS];
  33893     uint32            regval = 0, enable = 0, mode = 0;
  33894     int               slice = 0, slice_idx = 0;
  33895     int               inst, mem_inst;
  33896     soc_mem_t         ifp_tcam_wide;
  33897     soc_mem_t         ifp_tcam_narrow;
  33898     _field_control_t  *fc;            /* Field control structure.       */
  33899 
  33900     if (stage_fc == NULL) {
  33901        return BCM_E_PARAM;
  33902     }
  33903 
  33904     if (stage_fc->stage_id != _BCM_FIELD_STAGE_INGRESS) {
  33905        return BCM_E_NONE;
  33906     }
  33907 
  33908     /* Get field control structure. */
  33909     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  33910 
  33911     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  33912        if (!(fc->pipe_map & (1 << inst))) {
  33913              continue;
  33914        }
  33915        if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  33916            mem_inst = _FP_GLOBAL_INST;
  33917        } else {
  33918            mem_inst = inst;
  33919        }
  33920 
  33921        BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, IFP_CONFIGr,
  33922                                                           mem_inst, &reg));
  33923        BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  33924                                    IFP_TCAM_WIDEm,
  33925                                    mem_inst,
  33926                                    &ifp_tcam_wide));
  33927        BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  33928                                    IFP_TCAMm,
  33929                                    mem_inst,
  33930                                    &ifp_tcam_narrow));
  33931 
  33932        for (slice = 0; slice < stage_fc->num_instances; slice++) {
  33933           if (!(fc->pipe_map & (1 << slice))) {
  33934                continue;
  33935           }
  33936           BCM_IF_ERROR_RETURN
  33937             (soc_reg32_get(unit, reg, REG_PORT_ANY, slice, &regval));
  33938           enable = soc_reg_field_get(unit, reg, regval, IFP_SLICE_ENABLEf);
  33939           if (enable == 0) {
  33940              continue;
  33941           }
  33942 
  33943           if (soc_feature(unit, soc_feature_ifp_no_narrow_mode_support)) {
  33944               mode = _IFP_SLICE_MODE_WIDE;
  33945               mem = ifp_tcam_narrow;
  33946           } else {
  33947               mode = soc_reg_field_get(unit, reg, regval, IFP_SLICE_MODEf);
  33948               mem = (mode == _IFP_SLICE_MODE_WIDE) ?
  33949                      ifp_tcam_wide : ifp_tcam_narrow;
  33950           }
  33951 
  33952           fs = &stage_fc->slices[inst][slice];
  33953 
  33954           for (slice_idx = 0; slice_idx < fs->entry_count; slice_idx++) {
  33955 
  33956              (void)_bcm_field_th_slice_offset_to_tcam_idx(unit, stage_fc, inst,
  33957                                                           slice, slice_idx,
  33958                                                           &tcam_idx);
  33959              /* Read tcam entry. */
  33960              sal_memset(e, 0, sizeof(uint32) * SOC_MAX_MEM_FIELD_WORDS);
  33961              rv = soc_mem_read(unit, mem, MEM_BLOCK_ANY, tcam_idx, e);
  33962              if (BCM_FAILURE(rv)) {
  33963                 return rv;
  33964              }
  33965              valid = soc_mem_field32_get(unit, mem, e, field);
  33966              if ((valid) && (fs->entries[slice_idx] == NULL)) {
  33967                 soc_mem_field32_set(unit, mem, e, field, 0);
  33968                 rv = soc_mem_write(unit, mem, MEM_BLOCK_ANY, tcam_idx, e);
  33969                 if (BCM_FAILURE(rv)) {
  33970                    return rv;
  33971                 }
  33972              }
  33973           }
  33974           if (fs->entry_count == fs->free_count) {
  33975              uint32 regval_old, regval_new;
  33976 
  33977              BCM_IF_ERROR_RETURN
  33978                (soc_reg32_get(unit, reg, REG_PORT_ANY, slice, &regval_old));
  33979              regval_new = regval_old;
  33980              soc_reg_field_set(unit, reg, &regval_new, IFP_SLICE_ENABLEf, enable);
  33981              soc_reg_field_set(unit, reg, &regval_new, IFP_SLICE_LOOKUP_ENABLEf, enable);
  33982 
  33983              if (!soc_feature(unit,
  33984                  soc_feature_ifp_no_narrow_mode_support)) {
  33985                  soc_reg_field_set(unit, reg, &regval_new,
  33986                                    IFP_SLICE_MODEf, mode);
  33987              }
  33988 
  33989              if (regval_new != regval_old) {
  33990                 BCM_IF_ERROR_RETURN
  33991                 (soc_reg32_set(unit, reg, REG_PORT_ANY, slice_idx, regval_new));
  33992              }
  33993           }
  33994        }
  33995     }
  33996 
  33997     return BCM_E_NONE;
  33998 }
  33999 
  34000 /*
  34001  * Function:
  34002  *     _bcm_field_th_entry_phys_dump
  34003  *
  34004  * Purpose:
  34005  *     Show contents of a physical entry structure
  34006  *
  34007  * Parameters:
  34008  *     unit       - BCM device number
  34009  *     f_ent      - Physical entry to dump
  34010  * Returns:
  34011  *     Nothing.
  34012  */
  34013 int
  34014 _bcm_field_th_entry_phys_dump(int unit, _field_entry_t *f_ent)
  34015 {
  34016     int                       idx;
  34017     int                       qual_idx;
  34018     _field_group_t            *fg;
  34019     _bcm_field_qual_data_t    q_data;
  34020     _bcm_field_qual_data_t    q_mask;
  34021     _bcm_field_qual_offset_t  q_offset;
  34022     int                       rv, i;
  34023     int                       entry_parts = 0;
  34024     int                       part_ct;
  34025     uint32                    data = 0;
  34026     uint32                    mask = 0;
  34027     _field_stage_t            *stage_fc;
  34028 #if defined(BCM_TOMAHAWK2_SUPPORT)
  34029     bcm_pbmp_t                mask_pbmp;
  34030     bcm_port_t                mask_port;
  34031 #endif
  34032     _field_control_t    *fc;            /* Field control structure.       */
  34033     uint32                    offset = 0;
  34034 
  34035     /* Input validation check */
  34036     if (f_ent == NULL) {
  34037        return BCM_E_PARAM;
  34038     }
  34039 
  34040     /* Get field control structure. */
  34041     BCM_IF_ERROR_RETURN(_field_control_get(unit, &fc));
  34042 
  34043     /* Get number of parts in field entry based on group flags. */
  34044     rv = _bcm_field_th_entry_tcam_parts_count (unit, f_ent->group->flags,
  34045                                                &entry_parts);
  34046     BCM_IF_ERROR_RETURN(rv);
  34047 
  34048     if ((f_ent->group->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) &&
  34049         (soc_feature(unit, soc_feature_bscan_fae_port_flow_exclude))) {
  34050         offset = 4;
  34051     }
  34052 
  34053     for (part_ct = 0; part_ct < entry_parts; part_ct++) {
  34054 
  34055          if (part_ct) {
  34056                LOG_CLI((BSL_META_U(unit,"\n")));
  34057          }
  34058 
  34059          LOG_CLI((BSL_META_U(unit,
  34060                        "         slice=%d, slice_idx=%#x,"
  34061                        " part =%d, prio=%#x, flags=%#x, "),
  34062                        (f_ent + part_ct)->fs->slice_number,
  34063                        (f_ent + part_ct)->slice_idx + offset,  part_ct,
  34064                        (f_ent + part_ct)->prio, (f_ent + part_ct)->flags));
  34065 
  34066         if (!((f_ent + part_ct)->flags & _FP_ENTRY_INSTALLED)) {
  34067             if ((f_ent + part_ct)->flags &
  34068                  _FP_ENTRY_EXACT_MATCH_GROUP_DEFAULT) {
  34069                 LOG_CLI((BSL_META_U(unit,
  34070                                     "Default, ")));
  34071             }
  34072             LOG_CLI((BSL_META_U(unit,
  34073                                 "Not installed")));
  34074         } else {
  34075             LOG_CLI((BSL_META_U(unit,
  34076                                 "Installed, ")));
  34077 
  34078             if (!((f_ent + part_ct)->flags & _FP_ENTRY_ENABLED)) {
  34079                 LOG_CLI((BSL_META_U(unit,
  34080                                     "Disabled")));
  34081             }
  34082 
  34083             else {
  34084                 LOG_CLI((BSL_META_U(unit,
  34085                                     "Enabled")));
  34086             }
  34087 
  34088             if ((f_ent + part_ct)->flags & _FP_ENTRY_EXACT_MATCH_GROUP_DEFAULT) {
  34089                 LOG_CLI((BSL_META_U(unit,
  34090                                     ", Default")));
  34091             }
  34092 
  34093             if ((f_ent + part_ct)->flags & _FP_ENTRY_DIRTY) {
  34094                 LOG_CLI((BSL_META_U(unit,
  34095                                    ", Dirty")));
  34096             }
  34097 
  34098         }
  34099 
  34100         LOG_CLI((BSL_META_U(unit,
  34101                         ", color_indep=%d"),
  34102             (((f_ent + part_ct)->flags & _FP_ENTRY_COLOR_INDEPENDENT) ? 1 : 0)));
  34103     }
  34104     LOG_CLI((BSL_META_U(unit,"\n")));
  34105 
  34106     rv = _bcm_field_qual_tcam_key_mask_get(unit, f_ent);
  34107     if (BCM_FAILURE(rv)) {
  34108         LOG_CLI((BSL_META_U(unit,
  34109                             "\nUnit (%d) Entry (%d) tcam key read failure.\n"),
  34110                  unit, f_ent->eid));
  34111         return BCM_E_INTERNAL;
  34112     }
  34113 
  34114     rv = _field_stage_control_get(unit, f_ent->group->stage_id, &stage_fc);
  34115     BCM_IF_ERROR_RETURN(rv);
  34116 
  34117     fg = f_ent->group;
  34118 
  34119     for (qual_idx = 0; qual_idx < _bcmFieldQualifyCount; qual_idx++) {
  34120 
  34121         if (0 == BCM_FIELD_QSET_TEST(fg->qset, qual_idx)
  34122             || IS_SUDO_QUALIFIER(qual_idx)) {
  34123            continue;
  34124         }
  34125 #if defined(BCM_TRIDENT3_SUPPORT)
  34126         if (soc_feature(unit, soc_feature_td3_style_fp)) {
  34127            int           port, temp_p, set_data, inst;
  34128            bcm_pbmp_t    ipbm[2], ipbm_mask[2];
  34129            char          buf_ipbm[100];    /* s/w buffer to contain pbmp. */
  34130            uint16        pbm_34_50[2] = {0};
  34131            uint16        pbm_51_65[2] = {0};
  34132            uint16        pbm_34_50_mask[2] = {0};
  34133            uint16        pbm_51_65_mask[2] = {0};
  34134 
  34135            if (qual_idx == bcmFieldQualifyInPorts) {
  34136                if (0 == _FP_TCAM_IPBMP_SIZE(unit)) {
  34137                    return BCM_E_INTERNAL;
  34138                }
  34139                BCM_PBMP_CLEAR(ipbm[0]);
  34140                BCM_PBMP_CLEAR(ipbm_mask[0]);
  34141                BCM_PBMP_CLEAR(ipbm[1]);
  34142                BCM_PBMP_CLEAR(ipbm_mask[1]);
  34143                BCM_PBMP_ITER(f_ent->pbmp.mask, port) {
  34144                    set_data = 0;
  34145                    SOC_IF_ERROR_RETURN(soc_port_pipe_get(unit, port, &inst));
  34146                    temp_p = (port >= _BCM_TD3_NUM_PIPE_PORTS) ?
  34147                             (port - _BCM_TD3_NUM_PIPE_PORTS) : port;
  34148                    if (BCM_PBMP_MEMBER(f_ent->pbmp.data, port)) {
  34149                       set_data = 1;
  34150                    }
  34151                    if (temp_p < _FP_TCAM_IPBMP_SIZE(unit)) {
  34152                       if (set_data == 1) {
  34153                          BCM_PBMP_PORT_ADD(ipbm[inst], temp_p);
  34154                       }
  34155                       if (!IS_LB_PORT(unit, port)) {
  34156                          BCM_PBMP_PORT_ADD(ipbm_mask[inst], temp_p);
  34157                       }
  34158                    } else if (temp_p < (_FP_TCAM_IPBMP_SIZE(unit) + 16)) {
  34159                        temp_p = temp_p - _FP_TCAM_IPBMP_SIZE(unit);
  34160                        /* coverity[BAD_SHIFT: FALSE] */
  34161                        pbm_34_50_mask[inst] |= 1 << temp_p;
  34162                        if (set_data == 1) {
  34163                            /* coverity[BAD_SHIFT: FALSE] */
  34164                            pbm_34_50[inst] |= 1 << temp_p;
  34165                        }
  34166                    } else if (temp_p < (_FP_TCAM_IPBMP_SIZE(unit) + 32)) {
  34167                        temp_p = temp_p - (_FP_TCAM_IPBMP_SIZE(unit) + 16);
  34168                        /* coverity[BAD_SHIFT: FALSE] */
  34169                        pbm_51_65_mask[inst] |= 1 << temp_p;
  34170                        if (set_data == 1) {
  34171                            /* coverity[BAD_SHIFT: FALSE] */
  34172                            pbm_51_65[inst] |= 1 << temp_p;
  34173                        }
  34174                    }
  34175                }
  34176 
  34177 
  34178 
  34179                LOG_CLI((BSL_META_U(unit,
  34180                     "\n %s "),  _field_qual_name(qual_idx)));
  34181                LOG_CLI((BSL_META_U(unit,
  34182                     "\n     DATA=%s"), SOC_PBMP_FMT(f_ent->pbmp.data, buf_ipbm)));
  34183                LOG_CLI((BSL_META_U(unit,
  34184                     "\n     MASK=%s"), SOC_PBMP_FMT(f_ent->pbmp.mask, buf_ipbm)));
  34185 
  34186 
  34187                for (i = 0; i < 3; i++) {
  34188                    LOG_CLI((BSL_META_U(unit, "\n %s "),
  34189                     ((i == 0) ? "_InPorts_0" : ((i == 1) ? "_InPorts_1" : "_InPorts_2"))));
  34190                   for (inst = 0; inst < stage_fc->num_pipes; inst++) {
  34191                      if (!(fc->pipe_map & (1 << inst))) {
  34192                           continue;
  34193                      }
  34194                      if (stage_fc->oper_mode == bcmFieldGroupOperModePipeLocal) {
  34195                         if (inst != fg->instance) {
  34196                            continue;
  34197                         }
  34198                      }
  34199                      LOG_CLI((BSL_META_U(unit, "\n   Instance=%d"), inst));
  34200 
  34201                      if (i == 0) {
  34202                         SOC_PBMP_FMT(ipbm[inst], buf_ipbm);
  34203                         LOG_CLI((BSL_META_U(unit,
  34204                               "\n     DATA=0x%s"), (char *)&buf_ipbm[56]));
  34205                         SOC_PBMP_FMT(ipbm_mask[inst], buf_ipbm);
  34206                         LOG_CLI((BSL_META_U(unit,
  34207                               "\n     MASK=0x%s"), (char *)&buf_ipbm[56]));
  34208                      } else if (i == 1) {
  34209                         LOG_CLI((BSL_META_U(unit,
  34210                               "\n     DATA=0x%x"), pbm_34_50[inst]));
  34211                         LOG_CLI((BSL_META_U(unit,
  34212                               "\n     MASK=0x%x"), pbm_34_50_mask[inst]));
  34213                      } else if (i == 2) {
  34214                         LOG_CLI((BSL_META_U(unit,
  34215                               "\n     DATA=0x%x"), pbm_51_65[inst]));
  34216                         LOG_CLI((BSL_META_U(unit,
  34217                               "\n     MASK=0x%x"), pbm_51_65_mask[inst]));
  34218                      }
  34219                   }
  34220                }
  34221                continue;
  34222            }
  34223 
  34224            if ((qual_idx == _bcmFieldQualifyInPorts_1) ||
  34225                (qual_idx == _bcmFieldQualifyInPorts_2)) {
  34226                continue;
  34227            }
  34228         }
  34229 #endif /* BCM_TRIDENT3_SUPPORT */
  34230 #if defined(BCM_TOMAHAWK2_SUPPORT)
  34231         if (_BCM_FIELD_IS_PBMP_QUALIFIER(qual_idx) &&
  34232             soc_feature(unit, soc_feature_xy_tcam_x0y)) {
  34233             char          buf_ipbm[100];    /* s/w buffer to contain pbmp. */
  34234             LOG_CLI((BSL_META_U(unit,
  34235                     "\n %s "),  _field_qual_name(qual_idx)));
  34236             LOG_CLI((BSL_META_U(unit,
  34237                      "\n    DATA=%s"), SOC_PBMP_FMT(f_ent->pbmp.data, buf_ipbm)));
  34238             BCM_PBMP_ASSIGN(mask_pbmp, f_ent->pbmp.mask);
  34239             BCM_PBMP_ITER(f_ent->pbmp.mask, mask_port) {
  34240                 if (IS_LB_PORT(unit, mask_port)) {
  34241                     BCM_PBMP_PORT_REMOVE(mask_pbmp, mask_port);
  34242                 }
  34243             }
  34244             LOG_CLI((BSL_META_U(unit,
  34245                      "\n    MASK=%s"), SOC_PBMP_FMT(mask_pbmp, buf_ipbm)));
  34246             continue;
  34247         }
  34248 #endif /* BCM_TOMAHAWK2_SUPPORT */
  34249         _FP_QUAL_DATA_CLEAR(q_data);
  34250         _FP_QUAL_DATA_CLEAR(q_mask);
  34251 
  34252         if ((_BCM_FIELD_IS_PBMP_QUALIFIER(qual_idx)) &&
  34253             (bcmFieldGroupOperModeGlobal == stage_fc->oper_mode) &&
  34254             (soc_property_get(unit, spn_FIELD_ATOMIC_UPDATE, FALSE) == FALSE)) {
  34255             int      pipe_ports_max;   /* Max ports per pipe. */
  34256             int        tcam_idx = 0;   /* Entry slice index. */
  34257             char          buf[100];    /* s/w buffer to contain pbmp. */
  34258             int           inst;        /* XGS pipe number */
  34259             _field_pbmp_t pipe_pbmp;   /* Per pipe 36 bit pbmp. */
  34260             _field_pbmp_t system_pbmp; /* System wide 144 bit pbmp.*/
  34261             uint32        tcam_entry[SOC_MAX_MEM_FIELD_WORDS] = {0};
  34262             bcm_port_t    port;        /* Holds physical port number. */
  34263             bcm_port_t    system_port;
  34264             soc_mem_t tcam_mem = INVALIDm;
  34265 
  34266             pipe_ports_max = SOC_MAX_NUM_PORTS/SOC_MAX_NUM_PIPES;
  34267 
  34268             (void)_bcm_field_th_slice_offset_to_tcam_idx(unit, stage_fc,
  34269                                                    f_ent->group->instance,
  34270                                                    f_ent->fs->slice_number,
  34271                                                    f_ent->slice_idx, &tcam_idx);
  34272 
  34273             LOG_CLI((BSL_META_U(unit,
  34274                     "\n %s "),  _field_qual_name(qual_idx)));
  34275 
  34276             sal_memset(&system_pbmp, 0x0, sizeof(_field_pbmp_t));
  34277             for (inst = 0; inst < stage_fc->num_pipes; inst++) {
  34278                 if (!(fc->pipe_map & (1 << inst))) {
  34279                      continue;
  34280                 }
  34281 
  34282                 if (soc_feature(unit, soc_feature_th3_style_fp)) {
  34283                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  34284                                                        IFP_TCAMm,
  34285                                                        inst, &tcam_mem));
  34286                 } else {
  34287                     BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  34288                                                        IFP_TCAM_WIDEm,
  34289                                                        inst, &tcam_mem));
  34290                 }
  34291 
  34292                 rv = soc_th_ifp_mem_read(unit, tcam_mem, MEM_BLOCK_ANY,
  34293                                          tcam_idx, tcam_entry);
  34294                 SOC_IF_ERROR_RETURN(rv);
  34295 
  34296                 sal_memset(&pipe_pbmp, 0x0, sizeof(_field_pbmp_t));
  34297                 soc_mem_pbmp_field_get(unit, tcam_mem, tcam_entry,
  34298                                             IPBMf, &pipe_pbmp.data);
  34299 
  34300                 BCM_PBMP_ITER(pipe_pbmp.data, port) {
  34301                     system_port = port + (inst * pipe_ports_max);
  34302                     if (system_port <= SOC_MAX_NUM_PORTS) {
  34303                         /* coverity[overrun-local] */
  34304                         BCM_PBMP_PORT_ADD(system_pbmp.data, system_port);
  34305                     }
  34306                 }
  34307 
  34308                 soc_mem_pbmp_field_get(unit, tcam_mem, tcam_entry,
  34309                                            IPBM_MASKf, &pipe_pbmp.mask);
  34310 
  34311 
  34312                 BCM_PBMP_ITER(pipe_pbmp.mask, port) {
  34313                     system_port = port + (inst * pipe_ports_max);
  34314                     if ((system_port <= SOC_MAX_NUM_PORTS) &&
  34315                         (0 == IS_LB_PORT(unit, port))){
  34316                         /* coverity[overrun-local] */
  34317                         BCM_PBMP_PORT_ADD(system_pbmp.mask, system_port);
  34318                     }
  34319                 }
  34320             }
  34321             LOG_CLI((BSL_META_U(unit,
  34322                     "\n    DATA=%s"), SOC_PBMP_FMT(system_pbmp.data, buf)));
  34323             LOG_CLI((BSL_META_U(unit,
  34324                     "\n    MASK=%s"), SOC_PBMP_FMT(system_pbmp.mask, buf)));
  34325 
  34326             continue;
  34327         }
  34328 
  34329         /* Get the data and mask for the current qualifier*/
  34330 	rv = _bcm_field_th_entry_qualifier_key_get(unit, f_ent->eid,
  34331                                       qual_idx, q_data, q_mask);
  34332 	BCM_IF_ERROR_RETURN(rv);
  34333 
  34334         /* if mask is 0x0, no need to print the qualifier in entry dump*/
  34335 	if(q_mask[0] == 0 && q_mask[1] == 0
  34336             && q_mask[2] == 0 && q_mask[3] == 0
  34337             && q_mask[4] == 0 && q_mask[5] == 0
  34338             && q_mask[6] == 0 && q_mask[7] == 0) {
  34339             continue;
  34340         }
  34341 
  34342 	LOG_CLI((BSL_META_U(unit, "\n %s "),
  34343                      _field_qual_name(qual_idx)));
  34344 
  34345         for (part_ct = 0; part_ct < entry_parts; part_ct++) {
  34346             /* Initialize q_offset to NULL */
  34347             sal_memset(&q_offset, 0x0, sizeof(q_offset));
  34348 
  34349             rv = _bcm_field_th_qual_part_offset_get(unit, f_ent, part_ct,
  34350                                                     qual_idx, &q_offset);
  34351             if (rv == BCM_E_NOT_FOUND) {
  34352                continue;
  34353             } else if (BCM_FAILURE(rv)) {
  34354                return rv;
  34355             }
  34356 
  34357             for (i = 0; i < q_offset.num_offsets; i++) {
  34358                if (0 != q_offset.width[i]) {
  34359                  int delta = 0;
  34360                  if ((fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) &&
  34361                      !(fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE)) {
  34362                     delta = 80;
  34363                  }
  34364 #if defined(BCM_FLOWTRACKER_SUPPORT)
  34365                  if (fg->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) {
  34366                     delta = 0;
  34367                  }
  34368 #endif
  34369                   LOG_CLI((BSL_META_U(unit,
  34370                                 "\n    Part:%d Offset%d: %2d Width%d: %3d "),
  34371                                 part_ct, i, q_offset.offset[i]+delta, i,
  34372                                 q_offset.width[i]));
  34373                }
  34374             }
  34375 	}
  34376         LOG_CLI((BSL_META_U(unit,
  34377                            "\n    DATA=0x")));
  34378         for (idx = 7; idx >= 0; idx--) {
  34379             data = q_data[idx];
  34380             mask = q_mask[idx];
  34381             if (data == 0 && mask == 0) {
  34382                 continue;
  34383             }
  34384             /* Check if HW packet_res must be remmaped for API use */
  34385             if (bcmFieldQualifyPacketRes == qual_idx) {
  34386                 _bcm_field_td2_qualify_PacketRes_get(unit,
  34387                                   f_ent->eid, &data, &mask);
  34388                 q_mask[idx] = mask;
  34389             }
  34390             LOG_CLI((BSL_META_U(unit,
  34391                                "%08x "), data));
  34392         }
  34393 
  34394         LOG_CLI((BSL_META_U(unit,
  34395                             "\n    MASK=0x")));
  34396         for (idx = 7; idx >= 0; idx--) {
  34397             data = q_data[idx];
  34398             mask = q_mask[idx];
  34399             if (data == 0 && mask == 0) {
  34400                 continue;
  34401             }
  34402             LOG_CLI((BSL_META_U(unit,
  34403                                 "%08x "), q_mask[idx]));
  34404         }
  34405     }
  34406 
  34407     LOG_CLI((BSL_META_U(unit,
  34408                         "\n")));
  34409     return BCM_E_NONE;
  34410 }
  34411 
  34412 /*
  34413  * Retrieve Action Format for a given index to the policy memory.
  34414  * Supported only for IFP PDD formats.
  34415  */
  34416 STATIC int
  34417 _field_action_ifp_policy_decoder_data_get(
  34418          int unit,
  34419          soc_mem_t policy_mem,
  34420          int index,
  34421          soc_field_t field,
  34422          uint32 *fmt_val)
  34423 {
  34424     int rv;
  34425     int bit = 0, idx;
  34426     uint32 ap_idx;
  34427     soc_mem_t profile_mem;
  34428     uint32 policy_entry[SOC_MAX_MEM_FIELD_WORDS] = {0};
  34429     _bcm_field_action_set_t *action_prof_ptr = NULL;
  34430     void *act_prof_entry;               /* Profile table buffer pointer */
  34431     uint32 hw_bitmap[2] = {0};
  34432     uint32 act_offset = 0;
  34433     uint32 bitmap_size = 0;
  34434     uint32 act_bitmap_sz = 0;
  34435     uint32 size = 0, value = 0, offset = 0;
  34436     uint32 data_buf[100] = {0};
  34437 
  34438     if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  34439        return BCM_E_NONE;
  34440     }
  34441 
  34442     if ((policy_mem != IFP_POLICY_TABLEm) &&
  34443         (policy_mem != IFP_POLICY_TABLE_PIPE0m) &&
  34444         (policy_mem != IFP_POLICY_TABLE_PIPE1m) &&
  34445         (policy_mem != IFP_POLICY_TABLE_WIDEm) &&
  34446         (policy_mem != IFP_POLICY_TABLE_WIDE_PIPE0m) &&
  34447         (policy_mem != IFP_POLICY_TABLE_WIDE_PIPE1m)) {
  34448         return BCM_E_PARAM;
  34449     }
  34450 
  34451     rv = soc_mem_read(unit, policy_mem, MEM_BLOCK_ANY, index, policy_entry);
  34452     BCM_IF_ERROR_RETURN(rv);
  34453 
  34454     /* Get Action data from entry buffere */
  34455     soc_mem_field_get(unit, policy_mem, policy_entry, DATAf, &data_buf[0]);
  34456 
  34457     /* Get Action Data type from entry Buffer. */
  34458     ap_idx = soc_mem_field32_get(unit, policy_mem, policy_entry, DATA_TYPEf);
  34459 
  34460     /* Initialise variables */
  34461     sal_memcpy(&act_prof_entry, soc_mem_entry_null(unit, policy_mem),
  34462                 soc_mem_entry_words(unit, policy_mem) * sizeof(uint32));
  34463 
  34464     if ((policy_mem == IFP_POLICY_TABLEm) || (policy_mem == IFP_POLICY_TABLE_WIDEm)) {
  34465        profile_mem = IFP_POLICY_ACTION_PROFILEm;
  34466        rv = soc_mem_read(unit, profile_mem, MEM_BLOCK_ANY, ap_idx, &hw_bitmap);
  34467     }
  34468 
  34469      act_offset = 0;
  34470     /* For TD3, policy data is filled from MSB to LSB */
  34471     if(soc_feature(unit, soc_feature_td3_style_fp)) {
  34472         if (policy_mem == IFP_POLICY_TABLEm
  34473             || policy_mem == IFP_POLICY_TABLE_PIPE0m
  34474             || policy_mem == IFP_POLICY_TABLE_PIPE1m) {
  34475             act_offset = _FP_ASET_DATA_SIZE_FOR_POLICY_NARROW;
  34476         } else if (policy_mem == IFP_POLICY_TABLE_WIDEm
  34477                     || policy_mem == IFP_POLICY_TABLE_WIDE_PIPE0m
  34478                     || policy_mem == IFP_POLICY_TABLE_WIDE_PIPE1m) {
  34479             act_offset = _FP_ASET_DATA_SIZE_FOR_POLICY_WIDE;
  34480         }
  34481 
  34482         if (SOC_IS_HELIX5(unit)) {
  34483             action_prof_ptr = bcm_field_hx5_ifp_action_set;
  34484             bitmap_size = sizeof(bcm_field_hx5_ifp_action_set)/sizeof(_bcm_field_action_set_t);
  34485         } else {
  34486             action_prof_ptr = bcm_field_td3_ifp_action_set;
  34487             bitmap_size = sizeof(bcm_field_td3_ifp_action_set)/sizeof(_bcm_field_action_set_t);
  34488         }
  34489 
  34490         for (idx = (bitmap_size - 1); idx >= 0; idx--) {
  34491             if (action_prof_ptr[idx].size == 0) {
  34492                continue;
  34493             }
  34494 
  34495             if (act_bitmap_sz == 0) {
  34496                act_bitmap_sz = idx;
  34497                bit = act_bitmap_sz;
  34498             }
  34499 
  34500             if ((((bit >= 32) && (hw_bitmap[1] & (1 << (bit - 32)))) ||
  34501                 ((bit < 32) && (hw_bitmap[0] & (1 << bit)))) &&
  34502                 (idx < (bitmap_size - 1))) {
  34503                value = 0;
  34504                size = action_prof_ptr[idx + 1].size;
  34505                offset = act_offset - size;
  34506 
  34507                if (field == action_prof_ptr[idx + 1].hw_field) {
  34508                   _bcm_field_th_val_get(data_buf, &value, offset, size);
  34509                   *fmt_val = value;
  34510                   break;
  34511                }
  34512                act_offset -= size;
  34513             }
  34514             if (bit > 0) {
  34515                bit--;
  34516             } else {
  34517                return BCM_E_INTERNAL;
  34518             }
  34519         }
  34520     }
  34521 
  34522     return BCM_E_NONE;
  34523 }
  34524 /*
  34525  * Function to retrieve Flex Counter fields for a given
  34526  * index to the IFP Policy memory.
  34527  */
  34528 int
  34529 _bcm_field_action_profile_hw_stat_fields_get(
  34530                 int unit,
  34531                 int index,
  34532                 soc_mem_t mem,
  34533                 uint32 *offset_mode,
  34534                 uint32 *pool_number,
  34535                 uint32 *base_idx)
  34536 {
  34537     uint32 value;
  34538     soc_format_t fmt = IFP_COUNTER_SETfmt;
  34539 
  34540     if (!soc_feature(unit, soc_feature_ifp_action_profiling)) {
  34541        return BCM_E_NONE;
  34542     }
  34543 
  34544     BCM_IF_ERROR_RETURN(_field_action_ifp_policy_decoder_data_get(
  34545                                unit, mem, index, COUNTER_SETf, &value));
  34546 
  34547     if (base_idx != NULL) {
  34548         *base_idx = soc_format_field32_get(unit, fmt, &value,
  34549                                            FLEX_CTR_BASE_COUNTER_IDXf);
  34550     }
  34551 
  34552     if (pool_number != NULL) {
  34553         *pool_number = soc_format_field32_get(unit, fmt, &value,
  34554                                               FLEX_CTR_POOL_NUMBERf);
  34555     }
  34556 
  34557     if (offset_mode != NULL) {
  34558         *offset_mode =  soc_format_field32_get(unit, fmt, &value,
  34559                                                FLEX_CTR_OFFSET_MODEf);
  34560     }
  34561 
  34562 
  34563     return BCM_E_NONE;
  34564 }
  34565 
  34566 int _fp_action_profile_dump(
  34567         int unit,
  34568         bcm_field_action_t action,
  34569         soc_mem_t mem,
  34570         int index)
  34571 {
  34572    int rv;
  34573    uint32 value = 0;
  34574    soc_field_t field;
  34575    soc_format_t fmt;
  34576    int action_set;
  34577    _field_stage_t *stage_fc; /* Field Stage Structure. */
  34578    _bcm_field_action_conf_t *aconf; /* Field Action config structure. */
  34579 
  34580    if (action == bcmFieldActionStatGroup) {
  34581       uint32 offset_mode, base_idx, pool;
  34582 
  34583       rv = _bcm_field_action_profile_hw_stat_fields_get(
  34584                    unit, index, mem, &offset_mode, &pool, &base_idx);
  34585       BCM_IF_ERROR_RETURN(rv);
  34586 
  34587       cli_out("%s :: base_idx: 0x%x pool_number: 0x%x offset_mode: 0x%x\n\r",
  34588               _field_action_name(action), base_idx, pool, offset_mode);
  34589 
  34590       return BCM_E_NONE;
  34591    }
  34592 
  34593    rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_INGRESS, &stage_fc);
  34594    BCM_IF_ERROR_RETURN(rv);
  34595 
  34596    BCM_IF_ERROR_RETURN(_bcm_field_action_config_get(
  34597                        unit, stage_fc, action, &aconf));
  34598 
  34599    action_set = aconf->offset->aset;
  34600    field = bcm_field_td3_ifp_action_set[action_set].hw_field;
  34601 
  34602    if ((action == bcmFieldActionCopyToCpu) ||
  34603        (action == bcmFieldActionGpCopyToCpu) ||
  34604        (action == bcmFieldActionYpCopyToCpu) ||
  34605        (action == bcmFieldActionRpCopyToCpu)) {
  34606       uint32 r_copy2cpu, y_copy2cpu, g_copy2cpu, matched_rule;
  34607       uint32 val = 0;
  34608 
  34609       uint8 copy_2_cpu_val[8][40] = {
  34610                                   "NOOP",
  34611                                   "COPY_TO_CPU",
  34612                                   "DO_NOT_COPY_TO_CPU",
  34613                                   "OVERRIDE_SWITCH_COPY_TO_CPU",
  34614                                   "DO_NOT_OVERRIDE_SWITCH_COPY_TO_CPU",
  34615                                   "COPY_WITH_TIMESTAMP",
  34616                                   "CANCEL_COPY_AND_SWITCH_TO_CPU",
  34617                                   "RESERVED_7"};
  34618 
  34619 
  34620       BCM_IF_ERROR_RETURN(_field_action_ifp_policy_decoder_data_get(
  34621                                    unit, mem, index, field, &value));
  34622       fmt = IFP_COPY_TO_CPU_SETfmt;
  34623       r_copy2cpu = soc_format_field32_get(unit, fmt, &value, R_COPY_TO_CPUf);
  34624       y_copy2cpu = soc_format_field32_get(unit, fmt, &value, Y_COPY_TO_CPUf);
  34625       g_copy2cpu = soc_format_field32_get(unit, fmt, &value, G_COPY_TO_CPUf);
  34626       matched_rule = soc_format_field32_get(unit, fmt, &value, MATCHED_RULEf);
  34627 
  34628       if (action == bcmFieldActionGpCopyToCpu ||
  34629           action == bcmFieldActionCopyToCpu) {
  34630          val = g_copy2cpu;
  34631       } else if (action == bcmFieldActionYpCopyToCpu) {
  34632          val = y_copy2cpu;
  34633       } else if (action == bcmFieldActionRpCopyToCpu) {
  34634          val = r_copy2cpu;
  34635       }
  34636 
  34637       cli_out("%s :: [%s] Matched_rule:[%d]\n\r",
  34638                   _field_action_name(action), copy_2_cpu_val[val], matched_rule);
  34639    } else {
  34640       BCM_IF_ERROR_RETURN(_field_action_ifp_policy_decoder_data_get(
  34641                                    unit, mem, index, field, &value));
  34642 
  34643       cli_out("%s :: value:%d \n\r", _field_action_name(action), value);
  34644    }
  34645 
  34646    return BCM_E_NONE;
  34647 }
  34648 
  34649 int
  34650 _bcm_field_th_qualify_PacketRes(int               unit,
  34651                                  bcm_field_entry_t entry,
  34652                                  uint32            *data,
  34653                                  uint32            *mask
  34654                                  )
  34655 {
  34656     int rv = BCM_E_NONE;
  34657 
  34658     if (soc_feature(unit, soc_feature_field_multi_pipe_support)) {
  34659         rv = _bcm_field_is_entry_stage_valid(unit, entry,
  34660                                              _BCM_FIELD_STAGE_INGRESS);
  34661         if ((rv != BCM_E_NONE) && (rv != BCM_E_CONFIG)) {
  34662             /*Error fetching entry*/
  34663             return (rv);
  34664         }
  34665 
  34666         if (rv == BCM_E_NONE) { /*Stage is Ingress*/
  34667 
  34668             if ((soc_feature(unit, soc_feature_field_preselector_support)) &&
  34669                 (soc_feature(unit, soc_feature_th3_style_fp)) &&
  34670                 (_BCM_FIELD_IS_PRESEL_ENTRY(entry) == TRUE)) {
  34671                 switch (*data) {
  34672                     case BCM_FIELD_PKT_RES_IEEE1588:
  34673                     case BCM_FIELD_PKT_RES_BFD:
  34674                     case BCM_FIELD_PKT_RES_UNKNOWN:
  34675                         break;
  34676                     default:
  34677                         return BCM_E_UNAVAIL;
  34678                 }
  34679             } else {
  34680 
  34681                 switch (*data) {
  34682                     case BCM_FIELD_PKT_RES_ICNM:
  34683                     case BCM_FIELD_PKT_RES_FCOEKNOWN:
  34684                     case BCM_FIELD_PKT_RES_FCOEUNKNOWN:
  34685                     case BCM_FIELD_PKT_RES_MPLSMCKNOWN:
  34686                     case BCM_FIELD_PKT_RES_FCOE_ANY:
  34687                     case BCM_FIELD_PKT_RES_MPLS_ANY:
  34688                         return BCM_E_UNAVAIL;
  34689                     case BCM_FIELD_PKT_RES_PIMBIDIRUNKNOWN:
  34690 #if defined(    BCM_TOMAHAWK2_SUPPORT)
  34691                         if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) {
  34692                             break;
  34693                         } else
  34694 #endif /*BCM    _TOMAHAWK2_SUPPORT*/
  34695                         {
  34696                             return BCM_E_UNAVAIL;
  34697                         }
  34698                     case BCM_FIELD_PKT_RES_OAM:
  34699                     case BCM_FIELD_PKT_RES_MPLSL2KNOWN:
  34700                     case BCM_FIELD_PKT_RES_MIMKNOWN:
  34701                     case BCM_FIELD_PKT_RES_MIMUNKNOWN:
  34702                     case BCM_FIELD_PKT_RES_TRILLKNOWN:
  34703                     case BCM_FIELD_PKT_RES_TRILLUNKNOWN:
  34704                     case BCM_FIELD_PKT_RES_NIVKNOWN:
  34705                     case BCM_FIELD_PKT_RES_NIVUNKNOWN:
  34706                     case BCM_FIELD_PKT_RES_L2GREKNOWN:
  34707                     case BCM_FIELD_PKT_RES_VXLANKNOWN:
  34708                     case BCM_FIELD_PKT_RES_TRILL_ANY:
  34709                     case BCM_FIELD_PKT_RES_NIV_ANY:
  34710                     case BCM_FIELD_PKT_RES_MIM_ANY:
  34711                          if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  34712                             return BCM_E_UNAVAIL;
  34713                          }
  34714                         break;
  34715                     default:
  34716                         break;
  34717                 }
  34718             }
  34719         }
  34720     }
  34721 
  34722     BCM_IF_ERROR_RETURN(_bcm_field_td2_qualify_PacketRes(unit, entry, data, mask));
  34723     return rv;
  34724 }
  34725 
  34726 
  34727 int
  34728 _bcm_field_th_qualify_PacketRes_get(
  34729     int unit,
  34730     bcm_field_entry_t entry,
  34731     uint32 *data,
  34732     uint32 *mask)
  34733 {
  34734     int  rv;            /* Operation return status. */
  34735 
  34736     /* Read qualifier match value and mask. */
  34737     rv = _bcm_field_entry_qualifier_uint32_get(unit, entry,
  34738                                            bcmFieldQualifyPacketRes,
  34739                                            data, mask);
  34740     BCM_IF_ERROR_RETURN(rv);
  34741 
  34742     rv = _bcm_field_td2_qualify_PacketRes_get(unit, entry, data, mask);
  34743     if (BCM_FAILURE(rv)) {
  34744        return rv;
  34745     }
  34746 
  34747     if (soc_feature(unit, soc_feature_field_multi_pipe_support)) {
  34748 
  34749        if ((soc_feature(unit, soc_feature_field_preselector_support)) &&
  34750            (soc_feature(unit, soc_feature_th3_style_fp)) &&
  34751            (_BCM_FIELD_IS_PRESEL_ENTRY(entry) == TRUE)) {
  34752            switch (*data) {
  34753                case BCM_FIELD_PKT_RES_IEEE1588:
  34754                case BCM_FIELD_PKT_RES_BFD:
  34755                case BCM_FIELD_PKT_RES_UNKNOWN:
  34756                    break;
  34757                default:
  34758                    return BCM_E_INTERNAL;
  34759            }
  34760        } else {
  34761 
  34762            switch (*data) {
  34763              case BCM_FIELD_PKT_RES_ICNM:
  34764              case BCM_FIELD_PKT_RES_FCOEKNOWN:
  34765              case BCM_FIELD_PKT_RES_FCOEUNKNOWN:
  34766              case BCM_FIELD_PKT_RES_MPLSMCKNOWN:
  34767                   return BCM_E_INTERNAL;
  34768              case BCM_FIELD_PKT_RES_PIMBIDIRUNKNOWN:
  34769 #if defined(BCM_TOMAHAWK2_SUPPORT)
  34770                  if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced)) {
  34771                      break;
  34772                  } else
  34773 #endif     /*BCM_TOMAHAWK2_SUPPORT*/
  34774                  {
  34775                      return BCM_E_UNAVAIL;
  34776                  }
  34777              case BCM_FIELD_PKT_RES_OAM:
  34778              case BCM_FIELD_PKT_RES_MPLSL2KNOWN:
  34779              case BCM_FIELD_PKT_RES_MIMKNOWN:
  34780              case BCM_FIELD_PKT_RES_MIMUNKNOWN:
  34781              case BCM_FIELD_PKT_RES_TRILLKNOWN:
  34782              case BCM_FIELD_PKT_RES_TRILLUNKNOWN:
  34783              case BCM_FIELD_PKT_RES_NIVKNOWN:
  34784              case BCM_FIELD_PKT_RES_NIVUNKNOWN:
  34785              case BCM_FIELD_PKT_RES_L2GREKNOWN:
  34786              case BCM_FIELD_PKT_RES_VXLANKNOWN:
  34787              case BCM_FIELD_PKT_RES_TRILL_ANY:
  34788              case BCM_FIELD_PKT_RES_NIV_ANY:
  34789              case BCM_FIELD_PKT_RES_MIM_ANY:
  34790                   if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  34791                      return BCM_E_INTERNAL;
  34792                   }
  34793                   break;
  34794              default:
  34795                   break;
  34796            }
  34797        }
  34798     }
  34799 
  34800     return rv;
  34801 }
  34802 
  34803 
  34804 int
  34805 _bcm_field_th_ddrop_profile_alloc(int unit, _field_entry_t *f_ent,
  34806                                    _field_action_t *fa)
  34807 {
  34808 #if defined (BCM_TOMAHAWK3_SUPPORT)
  34809     if (soc_feature(unit, soc_feature_th3_style_fp)) {
  34810         return _bcm_field_th3_ddrop_profile_alloc(unit, f_ent, fa);
  34811     }
  34812 #endif
  34813     return BCM_E_UNAVAIL;
  34814 }
  34815 
  34816 int
  34817 _bcm_field_th_dredirect_profile_alloc(int unit, _field_entry_t *f_ent,
  34818                                    _field_action_t *fa)
  34819 {
  34820 #if defined (BCM_TOMAHAWK3_SUPPORT)
  34821     if (soc_feature(unit, soc_feature_th3_style_fp)) {
  34822         return _bcm_field_th3_dredirect_profile_alloc(unit, f_ent, fa);
  34823     }
  34824 #endif
  34825     return BCM_E_UNAVAIL;
  34826 
  34827 }
  34828 
  34829 #ifdef BCM_WARM_BOOT_SUPPORT
  34830 
  34831               /*  START OF WARMBOOT ROUTINES */
  34832 /*
  34833  * Function:
  34834  *  _field_th_slice_map_write
  34835  *
  34836  * Purpose:
  34837  *  Sync's slice status to scache for a stage
  34838  *  (Expanded, master slice idx, Pipe instance)
  34839  *
  34840  * Parameters:
  34841  *     unit      - (IN) BCM device number
  34842  *       fc      - (IN) FP control info.
  34843  * instance      - (IN) Pipe Instance.
  34844  * stage_fc      - (IN) FP stage control info.
  34845  *
  34846  * Returns:
  34847  *   BCM_E_XXX
  34848  */
  34849 
  34850 int
  34851 _field_th_slice_map_write(int unit, _field_control_t *fc,
  34852                           int instance, _field_stage_t *stage_fc)
  34853 {
  34854     uint8               slice_id;        /* Slices iterator.    */
  34855     _field_slice_t      *fs;             /* Slice pointer.      */
  34856     uint8               *buf;            /* Scache pointer.     */
  34857 
  34858     if ((stage_fc == NULL) || (fc == NULL)) {
  34859         return BCM_E_PARAM;
  34860     }
  34861 
  34862     /* No need to sync external stage */
  34863     if (stage_fc->stage_id != _BCM_FIELD_STAGE_LOOKUP &&
  34864         stage_fc->stage_id != _BCM_FIELD_STAGE_EGRESS) {
  34865         return BCM_E_PARAM;
  34866     }
  34867 
  34868     if (instance < 0 || instance >= _FP_MAX_NUM_PIPES) {
  34869        return BCM_E_PARAM;
  34870     }
  34871 
  34872     buf = fc->scache_ptr[_FIELD_SCACHE_PART_0];
  34873 
  34874     for (slice_id = 0; slice_id < stage_fc->tcam_slices; slice_id++) {
  34875         fs = stage_fc->slices[instance] + slice_id;
  34876 
  34877         if ((fc->wb_current_version) < BCM_FIELD_WB_VERSION_1_26) {
  34878             buf[fc->scache_pos] = (fs->prev != NULL) ? 1 : 0;
  34879             /* Go to master slice */
  34880             while (fs->prev != NULL) {
  34881                 fs = fs->prev;
  34882             }
  34883             buf[fc->scache_pos] |= (fs->slice_number << 1);
  34884 
  34885             /* Write the Pipe instance in the MSB 2-bits of the same byte */
  34886             buf[fc->scache_pos] |= (instance << 6);
  34887 
  34888             LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  34889                     "%s(): Writing inst[%d] expanded[%d] master_slice[%d]"
  34890                     " for slice[%d] val:%d @ byte %d...\n\r"),
  34891                     __func__, ((buf[fc->scache_pos] >> 6) & 0x3),
  34892                     (buf[fc->scache_pos] & 0x1), ((buf[fc->scache_pos] >> 1) & 0x3),
  34893                     slice_id, buf[fc->scache_pos], fc->scache_pos));
  34894 
  34895             fc->scache_pos++;
  34896             fs = NULL;
  34897         } else {
  34898 
  34899             /* 1 bit to save prev info */
  34900             buf[fc->scache_pos] = (fs->prev != NULL) ? 1 : 0;
  34901             /* Go to master slice */
  34902             while (fs->prev != NULL) {
  34903                 fs = fs->prev;
  34904             }
  34905             /* 7 bits for slice number */
  34906             buf[fc->scache_pos] |= (fs->slice_number << 1);
  34907 
  34908             LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  34909                     "%s(): Writing expanded[%d] master_slice[%d]"
  34910                     " for slice[%d] val:%d @ byte %d...\n\r"),
  34911                     __func__, (buf[fc->scache_pos] & 0x1),
  34912                     ((buf[fc->scache_pos] >> 1) & 0x3),
  34913                     slice_id, buf[fc->scache_pos], fc->scache_pos));
  34914 
  34915             fc->scache_pos++;
  34916 
  34917             /* Write the Pipe instance in the LSB 4-bits of the next byte */
  34918             buf[fc->scache_pos] = ((instance) & 0xf);
  34919 
  34920             LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  34921                     "%s(): Writing inst[%d] at @ byte %d...\n\r"),
  34922                     __func__,(buf[fc->scache_pos] & 0xf), fc->scache_pos));
  34923 
  34924             fc->scache_pos++;
  34925             fs = NULL;
  34926 
  34927         }
  34928     }
  34929     return BCM_E_NONE;
  34930 }
  34931 
  34932 
  34933 /*
  34934  * Function:
  34935  *  _bcm_field_slice_index_bmp_write
  34936  *
  34937  * Purpose:
  34938  *  Sync's slice index bmp to scache for a stage
  34939  *
  34940  * Parameters:
  34941  *     unit      - (IN) BCM device number
  34942  *       fc      - (IN) FP control info.
  34943  * stage_fc      - (IN) FP stage control info.
  34944  *
  34945  * Returns:
  34946  *   BCM_E_XXX
  34947  */
  34948 
  34949 int
  34950 _bcm_field_wb_slice_index_bmp_write(int unit, _field_control_t *fc,
  34951                           _field_stage_t *stage_fc)
  34952 {
  34953     uint8 *buf;            /* Scache pointer.     */
  34954     int size;
  34955     int slice_size;
  34956     int entry_index;
  34957     _field_sliceidx_bmp_t sliceidx_bmp;
  34958     _field_group_t        *fgtemp;
  34959     int slice_offset;
  34960     int rv = BCM_E_NONE;
  34961     int tcam_index = 0;
  34962     sliceidx_bmp.w = NULL;
  34963 
  34964     if ((stage_fc == NULL) || (fc == NULL)) {
  34965         return BCM_E_PARAM;
  34966     }
  34967 
  34968     buf = fc->scache_ptr[_FIELD_SCACHE_PART_0];
  34969     /* get the total slice size*/
  34970     slice_size = stage_fc->tcam_sz;
  34971     size = SHR_BITALLOCSIZE(slice_size * _FP_MAX_NUM_PIPES);
  34972     sliceidx_bmp.w = NULL;
  34973     _FP_XGS3_ALLOC(sliceidx_bmp.w, size, "Sliceidx Bitmap");
  34974     if (NULL == sliceidx_bmp.w) {
  34975         return (BCM_E_MEMORY);
  34976     }
  34977     fgtemp = fc->groups;
  34978     while (fgtemp != NULL) {
  34979         if ((fgtemp->stage_id == stage_fc->stage_id)) {
  34980             for (entry_index = 0;
  34981                  entry_index < fgtemp->group_status.entry_count;
  34982                  ++entry_index) {
  34983                 if ( ((fgtemp->entry_arr[entry_index]->flags) &
  34984                     _FP_ENTRY_INSTALLED) &&
  34985                     ((!(fgtemp->flags & _FP_GROUP_LOOKUP_ENABLED)) ||
  34986                     (!(((fgtemp->entry_arr[entry_index]->flags) &
  34987                     _FP_ENTRY_ENABLED) ==  _FP_ENTRY_ENABLED)))) {
  34988                     slice_offset = (slice_size * fgtemp->instance);
  34989                     rv = _bcm_field_entry_tcam_idx_get(unit,
  34990                              fgtemp->entry_arr[entry_index],
  34991                              &tcam_index);
  34992                     if (BCM_FAILURE(rv)) {
  34993                         sal_free(sliceidx_bmp.w);
  34994                         sliceidx_bmp.w = NULL;
  34995                         LOG_DEBUG(BSL_LS_BCM_FP,
  34996                                    (BSL_META_U(unit,
  34997                                    "Error: Failed to sync"
  34998                                    " slice index of disabled entry [%d]\n"),
  34999                                    entry_index));
  35000                         return rv;
  35001                     }
  35002                     _FP_SLICEIDX_BMP_ADD(sliceidx_bmp,
  35003                                           slice_offset + tcam_index);
  35004                 }
  35005             }
  35006         }
  35007         fgtemp = fgtemp->next;
  35008     }
  35009     /* sync the data */
  35010     sal_memcpy (&buf[fc->scache_pos], ((sliceidx_bmp).w), size);
  35011     fc->scache_pos += size;
  35012 
  35013     sal_free(sliceidx_bmp.w);
  35014     sliceidx_bmp.w = NULL;
  35015     return BCM_E_NONE;
  35016 }
  35017 
  35018 /*
  35019  * Function:
  35020  *     _bcm_field_th_scache_sync
  35021  *
  35022  * Purpose:
  35023  *     Save field module software state to external cache.
  35024  *
  35025  * Parameters:
  35026  *     unit             - (IN) BCM device number
  35027  *     fc               - (IN) Pointer to device field control structure
  35028  *     stage_fc         - (IN) FP stage control info.
  35029  *
  35030  * Returns:
  35031  *     BCM_E_XXX
  35032  */
  35033 int
  35034 _bcm_field_th_scache_sync(int              unit,
  35035                           _field_control_t *fc,
  35036                           _field_stage_t   *stage_fc
  35037                           )
  35038 {
  35039     int                   idx;             /* Index to field entry.          */
  35040     int                   mem_inst, inst;  /* Pipe Instance.                 */
  35041     int                   rv = BCM_E_NONE; /* Operation return value.        */
  35042     int                   efp_slice_mode;  /* Slice mode of EFP.             */
  35043     int                   paired = 0;      /* TCAM paired status of a slice. */
  35044     int                   ratio = 0;       /* TCAM entry ratio.              */
  35045     int                   slice_idx;       /* Index of a slice in (V/I/E)FP  */
  35046     uint8                 *buf;            /* Pointer to 1st scache part.    */
  35047     uint8                 *buf1;           /* Pointer to 2nd scache part.    */
  35048     uint32                start_char;      /* Start character for (V/I/E)FP  */
  35049     uint32                end_char;        /* End caharacter for (V/I/E)FP.  */
  35050     uint32                val;             /* Carry Register contents.       */
  35051     uint64                rval;            /* Carry register contents.       */
  35052     _field_slice_t        *fs;             /* Slice pointer.                 */
  35053     _field_group_t        *fg;             /* Filed group pointer.           */
  35054     _field_data_control_t *data_ctrl;      /* UDF control data pointer.      */
  35055     _field_entry_t        *f_ent;          /* Pointer to field entry.        */
  35056     soc_field_t           fld;             /* field in any memory/register.  */
  35057     soc_reg_t             vfp_control_1_reg;
  35058     soc_reg_t             efp_slice_control_reg;
  35059 
  35060 
  35061     soc_field_t _efp_slice_mode[] = {SLICE_0_MODEf, SLICE_1_MODEf,
  35062                                      SLICE_2_MODEf, SLICE_3_MODEf};
  35063 
  35064     buf = fc->scache_ptr[_FIELD_SCACHE_PART_0];
  35065     buf1 = fc->scache_ptr[_FIELD_SCACHE_PART_1];
  35066 
  35067 
  35068     switch (stage_fc->stage_id) {
  35069         case _BCM_FIELD_STAGE_INGRESS:
  35070             start_char = _FIELD_IFP_DATA_START;
  35071             end_char = _FIELD_IFP_DATA_END;
  35072             break;
  35073         case _BCM_FIELD_STAGE_EGRESS:
  35074             start_char = _FIELD_EFP_DATA_START;
  35075             end_char = _FIELD_EFP_DATA_END;
  35076             break;
  35077         case _BCM_FIELD_STAGE_LOOKUP:
  35078             start_char = _FIELD_VFP_DATA_START;
  35079             end_char = _FIELD_VFP_DATA_END;
  35080             break;
  35081         case _BCM_FIELD_STAGE_EXTERNAL:
  35082             /*
  35083             if (_field_tr2_ext_scache_sync_chk(unit, fc, stage_fc)) {
  35084                 return (_field_tr2_ext_scache_sync(unit, fc, stage_fc));
  35085             } */
  35086             start_char = _FIELD_EXTFP_DATA_START;
  35087             end_char   = _FIELD_EXTFP_DATA_END;
  35088             break;
  35089         case _BCM_FIELD_STAGE_CLASS:
  35090             start_char = _FIELD_CLASS_DATA_START;
  35091             end_char = _FIELD_CLASS_DATA_END;
  35092             break;
  35093         case _BCM_FIELD_STAGE_EXACTMATCH:
  35094             start_char = _FIELD_EM_DATA_START;
  35095             end_char = _FIELD_EM_DATA_END;
  35096             break;
  35097 #if defined(BCM_HELIX5_SUPPORT)
  35098         case _BCM_FIELD_STAGE_FLOWTRACKER:
  35099             start_char = _FIELD_FT_DATA_START;
  35100             end_char = _FIELD_FT_DATA_END;
  35101             break;
  35102 #endif
  35103         default:
  35104             return BCM_E_PARAM;
  35105     }
  35106 
  35107     LOG_DEBUG(BSL_LS_BCM_FP,
  35108               (BSL_META_U(unit,
  35109                           "FP(unit %d): _bcm_field_th_scache_sync() - "
  35110                           "Synching scache for FP stage %d...\n"),
  35111                unit, stage_fc->stage_id));
  35112 
  35113 
  35114     if (stage_fc->stage_id == _BCM_FIELD_STAGE_INGRESS) {
  35115         BCM_IF_ERROR_RETURN(_bcm_field_th_stage_ingress_sync(unit,
  35116                                                              stage_fc));
  35117         LOG_DEBUG(BSL_LS_BCM_FP,
  35118                   (BSL_META_U(unit,
  35119                               "FP(unit %d): _bcm_field_th_scache_sync() -"
  35120                               " Writing end of section @ byte %d.\n"),
  35121                    unit, fc->scache_pos));
  35122 
  35123         /* Mark the end of the IFP section */
  35124         buf[fc->scache_pos] = end_char & 0xFF;
  35125         fc->scache_pos++;
  35126         buf[fc->scache_pos] = (end_char >> 8) & 0xFF;
  35127         fc->scache_pos++;
  35128         buf[fc->scache_pos] = (end_char >> 16) & 0xFF;
  35129         fc->scache_pos++;
  35130         buf[fc->scache_pos] = (end_char >> 24) & 0xFF;
  35131         fc->scache_pos++;
  35132         fc->scache_usage = fc->scache_pos; /* Usage in bytes */
  35133 
  35134         return BCM_E_NONE;
  35135     }
  35136 
  35137     _field_scache_stage_hdr_save(fc, start_char);
  35138 
  35139     if (stage_fc->stage_id == _BCM_FIELD_STAGE_CLASS) {
  35140         BCM_IF_ERROR_RETURN(_bcm_field_th_stage_class_sync(unit, fc, stage_fc));
  35141         _field_scache_stage_hdr_save(fc, end_char);
  35142         return BCM_E_NONE;
  35143     }
  35144 
  35145     if (stage_fc->stage_id == _BCM_FIELD_STAGE_EXACTMATCH) {
  35146         BCM_IF_ERROR_RETURN(_bcm_field_th_stage_em_sync(unit, fc, stage_fc));
  35147         _field_scache_stage_hdr_save(fc, end_char);
  35148         return BCM_E_NONE;
  35149     }
  35150 
  35151 #if defined(BCM_HELIX5_SUPPORT)
  35152     if (stage_fc->stage_id == _BCM_FIELD_STAGE_FLOWTRACKER) {
  35153         BCM_IF_ERROR_RETURN(_bcm_field_stage_ft_sync(unit, fc, stage_fc));
  35154         _field_scache_stage_hdr_save(fc, end_char);
  35155         return BCM_E_NONE;
  35156     }
  35157 #endif
  35158 
  35159     if ((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_10) {
  35160        /* Save Stage operational mode in the first byte after Data Start */
  35161        buf[fc->scache_pos] = stage_fc->oper_mode;
  35162 
  35163        LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35164                 "%s(): Writing oper_mode[%d] for Stage:%d @ byte s_pos=%d s_pos=%d...\n\r"),
  35165                 __func__, buf[fc->scache_pos], stage_fc->stage_id,
  35166                 fc->scache_pos, fc->scache_pos1));
  35167        fc->scache_pos++;
  35168     }
  35169 
  35170     /* Save data qualifiers */
  35171     if ((data_ctrl = stage_fc->data_ctrl) != 0) {
  35172         if (soc_mem_is_valid(unit, FP_UDF_TCAMm)) {
  35173             /* Device has UDF TCAM =>
  35174                Save internal information regarding TCAM entry usage
  35175             */
  35176 
  35177             _field_data_tcam_entry_t *p;
  35178             unsigned                 n;
  35179 
  35180             for (p = data_ctrl->tcam_entry_arr,
  35181                      n = soc_mem_index_count(unit, FP_UDF_TCAMm);
  35182                  n;
  35183                  --n, ++p
  35184                  ) {
  35185                 buf[fc->scache_pos] = p->ref_count;
  35186                 fc->scache_pos++;
  35187             }
  35188         }
  35189 
  35190         _field_scache_sync_data_quals_write(fc, data_ctrl);
  35191     }
  35192 
  35193     /* Iterate for stage's instances. */
  35194     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  35195         if (!(fc->pipe_map & (1 << inst))) {
  35196               continue;
  35197          }
  35198        _field_th_slice_map_write(unit, fc, inst, stage_fc);
  35199     }
  35200     if (((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_27) &&
  35201         ((stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP) ||
  35202         (stage_fc->stage_id == _BCM_FIELD_STAGE_EGRESS) )) {
  35203         /* create and sync the slice index bmp*/
  35204         BCM_IF_ERROR_RETURN(_bcm_field_wb_slice_index_bmp_write(unit,
  35205             fc, stage_fc));
  35206     }
  35207 
  35208     /* Iterate for stage's instances. */
  35209     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  35210         if (!(fc->pipe_map & (1 << inst))) {
  35211               continue;
  35212          }
  35213        if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  35214            mem_inst = _FP_GLOBAL_INST;
  35215        } else {
  35216            mem_inst = inst;
  35217        }
  35218 
  35219        BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r,
  35220                                                    mem_inst, &vfp_control_1_reg));
  35221 
  35222        BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr,
  35223                                                 mem_inst, &efp_slice_control_reg));
  35224 
  35225        for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) {
  35226           LOG_DEBUG(BSL_LS_BCM_FP,
  35227                   (BSL_META_U(unit,
  35228                               "FP(unit %d): _bcm_field_th_scache_sync() - "
  35229                               "Checking slice %d...\n"),
  35230                    unit, slice_idx));
  35231           /* Skip slices without groups */
  35232           fs = stage_fc->slices[inst] + slice_idx;
  35233           fg = fc->groups;
  35234           while (fg != NULL) {
  35235              if ((fg->instance == inst) &&
  35236                  (fg->stage_id == stage_fc->stage_id) &&
  35237                  (fg->slices[0].slice_number == slice_idx)) {
  35238                  break;
  35239              }
  35240              fg = fg->next;
  35241           }
  35242 
  35243           if (fg == NULL) {
  35244              continue; /* No group found */
  35245           }
  35246 
  35247           /* Also skip expanded slices */
  35248           if (stage_fc->slices[inst][slice_idx].prev != NULL) {
  35249               continue;
  35250           }
  35251 
  35252           paired = 0;
  35253 
  35254           /* Ignore secondary slice in paired mode */
  35255           switch (stage_fc->stage_id) {
  35256               case _BCM_FIELD_STAGE_EGRESS:
  35257                 BCM_IF_ERROR_RETURN(soc_reg32_get(unit,
  35258                                                   efp_slice_control_reg,
  35259                                                   REG_PORT_ANY, 0, &val));
  35260                 efp_slice_mode = soc_reg_field_get(unit,
  35261                                                efp_slice_control_reg,
  35262                                                val, _efp_slice_mode[slice_idx]);
  35263 
  35264                 if ((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE)
  35265                     || (efp_slice_mode
  35266                     == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY)
  35267                     || (efp_slice_mode
  35268                     == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) {
  35269                     paired = 1;
  35270                 }
  35271                 break;
  35272 
  35273               case _BCM_FIELD_STAGE_LOOKUP:
  35274                 BCM_IF_ERROR_RETURN(soc_reg_get(unit,
  35275                                                 vfp_control_1_reg,
  35276                                                 REG_PORT_ANY, 0, &rval));
  35277                 fld = _bcm_field_trx_slice_pairing_field[slice_idx / 2];
  35278                 paired = soc_reg64_field32_get(unit,
  35279                                                vfp_control_1_reg,
  35280                                                rval, fld);
  35281                 break;
  35282               default:
  35283                 return BCM_E_PARAM;
  35284                 break;
  35285           }
  35286 
  35287           if (paired && (slice_idx % 2)) {
  35288              continue;
  35289           }
  35290 
  35291           BCM_IF_ERROR_RETURN
  35292               (_field_tr2_group_entry_write(unit, inst, slice_idx, fs,
  35293                                             fc, stage_fc));
  35294        }
  35295     }
  35296 
  35297     /* Now sync the expanded slices */
  35298     /* Iterate for stage's instances. */
  35299     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  35300         if (!(fc->pipe_map & (1 << inst))) {
  35301               continue;
  35302          }
  35303        if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  35304            mem_inst = _FP_GLOBAL_INST;
  35305        } else {
  35306            mem_inst = inst;
  35307        }
  35308 
  35309        BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, VFP_KEY_CONTROL_1r,
  35310                                                    mem_inst, &vfp_control_1_reg));
  35311 
  35312        BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit, EFP_SLICE_CONTROLr,
  35313                                                 mem_inst, &efp_slice_control_reg));
  35314 
  35315        for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) {
  35316           fs = stage_fc->slices[inst] + slice_idx;
  35317           /* Skip empty slices */
  35318           if (fs->entry_count == fs->free_count) {
  35319               LOG_DEBUG(BSL_LS_BCM_FP,
  35320                       (BSL_META_U(unit,
  35321                                   "FP(unit %d): _bcm_field_th_scache_sync() - "
  35322                                   "Slice is empty.\n"),
  35323                        unit));
  35324                continue;
  35325           }
  35326 
  35327           /* Skip master slices */
  35328           if (stage_fc->slices[inst][slice_idx].prev == NULL) {
  35329               continue;
  35330           }
  35331 
  35332          /*
  35333           * Skip expanded slices with no entries installed in Hw
  35334           * to match recovery logic.
  35335           */
  35336           if (fs->group_flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) {
  35337               ratio = 2;
  35338           } else {
  35339               ratio = 1;
  35340           }
  35341 
  35342           for (idx = 0; idx < fs->entry_count / ratio; idx++) {
  35343              /* Find EID that matches this HW index */
  35344              f_ent = fs->entries[idx];
  35345              if (f_ent == NULL) {
  35346                 continue;
  35347              }
  35348              if (!(f_ent->flags & _FP_ENTRY_INSTALLED)) {
  35349                 continue;
  35350              }
  35351              break;
  35352           }
  35353 
  35354           if (idx == (fs->entry_count / ratio)) {
  35355              continue;
  35356           }
  35357 
  35358           paired = 0;
  35359 
  35360           /* Ignore secondary slice in paired mode */
  35361           switch (stage_fc->stage_id) {
  35362               case _BCM_FIELD_STAGE_EGRESS:
  35363                   BCM_IF_ERROR_RETURN(soc_reg32_get(unit,
  35364                                                   efp_slice_control_reg,
  35365                                                   REG_PORT_ANY, 0, &val));
  35366                   efp_slice_mode = soc_reg_field_get(unit,
  35367                                                efp_slice_control_reg,
  35368                                                val, _efp_slice_mode[slice_idx]);
  35369                   if ((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE)
  35370                       || (efp_slice_mode
  35371                       == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY)
  35372                       || (efp_slice_mode
  35373                       == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) {
  35374                       paired = 1;
  35375                   }
  35376                   break;
  35377 
  35378               case _BCM_FIELD_STAGE_LOOKUP:
  35379                   BCM_IF_ERROR_RETURN(soc_reg_get(unit,
  35380                                                   vfp_control_1_reg,
  35381                                                   REG_PORT_ANY, 0, &rval));
  35382                   fld = _bcm_field_trx_slice_pairing_field[slice_idx / 2];
  35383                   paired = soc_reg64_field32_get(unit,
  35384                                                  vfp_control_1_reg,
  35385                                                  rval, fld);
  35386                   break;
  35387               default:
  35388                  return BCM_E_PARAM;
  35389                  break;
  35390           }
  35391           if (paired && (slice_idx % 2)) {
  35392              continue;
  35393           }
  35394           BCM_IF_ERROR_RETURN
  35395               (_field_tr2_group_entry_write(unit, inst, slice_idx,
  35396                                             fs, fc, stage_fc));
  35397        } /* Slices */
  35398     } /* instance */
  35399 
  35400     if ((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_15) {
  35401        /* Mark end of Slice Info */
  35402        buf[fc->scache_pos] = _FP_WB_END_OF_SLICES;
  35403        fc->scache_pos++;
  35404     }
  35405 
  35406     if ((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_15) {
  35407        if ( stage_fc->stage_id == _BCM_FIELD_STAGE_EGRESS ||
  35408             stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP) {
  35409            LOG_DEBUG(BSL_LS_BCM_FP,
  35410                    (BSL_META_U(unit,"FP(unit %d) vverb:"
  35411                                "_bcm_field_td2_scache_sync() -section "
  35412                                "Writing  HintIds information @ byte %d.\n"),
  35413                                                        unit, fc->scache_pos));
  35414            BCM_IF_ERROR_RETURN (_bcm_hints_scache_hintid_sync (unit, stage_fc,
  35415                        &buf[fc->scache_pos]));
  35416        }
  35417     }
  35418 
  35419     if ((fc->wb_current_version) >= BCM_FIELD_WB_VERSION_1_15) {
  35420         /* Group Slice Selectors */
  35421         if ((stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP)
  35422              || (stage_fc->stage_id == _BCM_FIELD_STAGE_EGRESS)) {
  35423             BCM_IF_ERROR_RETURN(_field_group_slice_selectors_sync(unit,
  35424                             &buf[fc->scache_pos], stage_fc->stage_id));
  35425         }
  35426     }
  35427 
  35428     LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35429                "%s(): Writing end of section scache1 for stage:%s @ byte %d.\n"),
  35430                __func__,
  35431               (stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP)?"Lookup":"Egress",
  35432                fc->scache_pos));
  35433 
  35434     /* Mark the end of the section */
  35435     buf[fc->scache_pos] = end_char & 0xFF;
  35436     fc->scache_pos++;
  35437     buf[fc->scache_pos] = (end_char >> 8) & 0xFF;
  35438     fc->scache_pos++;
  35439     buf[fc->scache_pos] = (end_char >> 16) & 0xFF;
  35440     fc->scache_pos++;
  35441     buf[fc->scache_pos] = (end_char >> 24) & 0xFF;
  35442     fc->scache_pos++;
  35443     fc->scache_usage = fc->scache_pos; /* Usage in bytes */
  35444 
  35445     if(NULL != buf1) {
  35446         LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35447                "%s(): Writing end of section scache2 for stage:%s @ byte %d.\n"),
  35448                __func__,
  35449               (stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP)?"Lookup":"Egress",
  35450                fc->scache_pos1));
  35451         /* Mark the end of the section */
  35452         buf1[fc->scache_pos1] = end_char & 0xFF;
  35453         fc->scache_pos1++;
  35454         buf1[fc->scache_pos1] = (end_char >> 8) & 0xFF;
  35455         fc->scache_pos1++;
  35456         buf1[fc->scache_pos1] = (end_char >> 16) & 0xFF;
  35457         fc->scache_pos1++;
  35458         buf1[fc->scache_pos1] = (end_char >> 24) & 0xFF;
  35459         fc->scache_pos1++;
  35460     }
  35461 
  35462     /* Check for overflow */
  35463     if (fc->scache_pos > fc->scache_size[_FIELD_SCACHE_PART_0]) {
  35464         LOG_DEBUG(BSL_LS_BCM_FP,
  35465                 (BSL_META_U(unit,
  35466                             "FP(unit %d) Error: Current Scache Position[%u] exceeds Scache size[%u]\n"),
  35467                  unit, fc->scache_pos, fc->scache_size[_FIELD_SCACHE_PART_0]));
  35468         return BCM_E_INTERNAL;
  35469     }
  35470 
  35471     if (buf1 != NULL) {
  35472         if (fc->scache_pos1 > fc->scache_size[_FIELD_SCACHE_PART_1]) {
  35473             LOG_DEBUG(BSL_LS_BCM_FP,
  35474                     (BSL_META_U(unit,
  35475                                 "FP(unit %d) Error: Current Scache Position1[%u] exceeds Scache size[%u]\n"),
  35476                      unit, fc->scache_pos1, fc->scache_size[_FIELD_SCACHE_PART_1]));
  35477             return BCM_E_INTERNAL;
  35478         }
  35479     }
  35480 
  35481     return rv;
  35482 }
  35483 
  35484 STATIC int
  35485 _field_th_slice_expanded_status_get(int unit, int inst,
  35486                                     _field_control_t *fc,
  35487                                     _field_stage_t *stage_fc,
  35488                                     int *expanded, int *slice_master_idx)
  35489 {
  35490     int i, vslice, slice_idx = 0, vgroup = -1, max = -1, slice_num_max = 0;
  35491     uint32 map_entry;
  35492     soc_reg_t  slice_map_reg = INVALIDr;
  35493     soc_field_t fld;
  35494     uint8 *buf = fc->scache_ptr[_FIELD_SCACHE_PART_0];
  35495     int   mem_inst;
  35496     int   instance;
  35497 
  35498     mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  35499                 _FP_GLOBAL_INST : inst;
  35500 
  35501     switch (stage_fc->stage_id) {
  35502         case _BCM_FIELD_STAGE_EGRESS:
  35503              BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  35504                                                                 EFP_SLICE_MAPr,
  35505                                                                 mem_inst,
  35506                                                                &slice_map_reg));
  35507              slice_num_max = 4;
  35508              break;
  35509         case _BCM_FIELD_STAGE_LOOKUP:
  35510              BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  35511                                                                 VFP_SLICE_MAPr,
  35512                                                                 mem_inst,
  35513                                                                &slice_map_reg));
  35514              slice_num_max = 4;
  35515              break;
  35516         default:
  35517              return BCM_E_PARAM;
  35518              break; /* Should never happen */
  35519     }
  35520 
  35521     if ((fc->l2warm)
  35522         && ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_8)) {
  35523         for (i = 0; i < slice_num_max; i++) {
  35524             if ((fc->wb_recovered_version) < BCM_FIELD_WB_VERSION_1_26) {
  35525                 expanded[i] = buf[fc->scache_pos] & 0x1;
  35526                 slice_master_idx[i] = (buf[fc->scache_pos] >> 1) & 0x3;
  35527                 instance = ((buf[fc->scache_pos] >> 6) & 0x3);
  35528 
  35529                 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35530                     "%s(): Recovering inst[%d] expanded[%d] master_slice[%d]"
  35531                     " for slice[%d] val:%d @ byte %d...\n\r"), __func__,
  35532                     instance, expanded[i], slice_master_idx[i], i,
  35533                     buf[fc->scache_pos], fc->scache_pos));
  35534 
  35535                 if (instance != inst) {
  35536                    LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35537                      "%s(): Wrong Instance:%d Recovered instead of inst:%d"
  35538                      " @ byte %d...\n\r"),
  35539                      __func__, instance, inst, fc->scache_pos));
  35540                    return BCM_E_INTERNAL;
  35541                 }
  35542             } else {
  35543                 expanded[i] = buf[fc->scache_pos] & 0x1;
  35544                 slice_master_idx[i] = (buf[fc->scache_pos] >> 1);
  35545 
  35546                 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35547                     "%s(): Recovering expanded[%d] master_slice[%d]"
  35548                     " for slice[%d] val:%d @ byte %d...\n\r"), __func__,
  35549                     expanded[i], slice_master_idx[i], i,
  35550                     buf[fc->scache_pos], fc->scache_pos));
  35551 
  35552                 fc->scache_pos++;
  35553                 instance = ((buf[fc->scache_pos]) & 0xf);
  35554 
  35555                 LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35556                     "%s(): Recovering instance[%d] @ byte %d...\n\r"), __func__,
  35557                     instance,  fc->scache_pos));
  35558 
  35559                 if (instance != inst) {
  35560                    LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35561                      "%s(): Wrong Instance:%d Recovered instead of inst:%d"
  35562                      " @ byte %d...\n\r"),
  35563                      __func__, instance, inst, fc->scache_pos));
  35564                    return BCM_E_INTERNAL;
  35565                 }
  35566             }
  35567             fc->scache_pos++;
  35568         }
  35569     }
  35570 
  35571     /* Iterate over virtual slices to get physical slices and virtual groups */
  35572     for (vslice = 0; vslice < slice_num_max; vslice++) {
  35573         BCM_IF_ERROR_RETURN(soc_reg32_get(unit, slice_map_reg,
  35574                             REG_PORT_ANY, 0, &map_entry));
  35575         fld = vfp_efp_virtual_to_physical_map[vslice];
  35576         slice_idx = soc_reg_field_get(unit, slice_map_reg,
  35577                                       map_entry, fld);
  35578         /* Now get virtual group for this virtual slice */
  35579         fld = vfp_efp_virtual_to_group_map[vslice];
  35580         vgroup = soc_reg_field_get(unit, slice_map_reg,
  35581                                    map_entry, fld);
  35582 
  35583         /* Phys slice_idx <=> virtual vslice <=> vgroup */
  35584         stage_fc->vmap[inst][0][vslice].vmap_key = slice_idx;
  35585         stage_fc->vmap[inst][0][vslice].virtual_group = vgroup;
  35586         stage_fc->vmap[inst][0][vslice].priority = vgroup;
  35587         
  35588     }
  35589 
  35590     /* See if virtual slice is the highest number in the virtual group */
  35591     for (vslice = 0; vslice < slice_num_max; vslice++) {
  35592         max = -1;
  35593         for (i = 0; i < slice_num_max; i++) {
  35594            if ((stage_fc->vmap[inst][0][vslice].virtual_group ==
  35595                 stage_fc->vmap[inst][0][i].virtual_group)) {
  35596                 if (i > max) {
  35597                     max = i;
  35598                 }
  35599             }
  35600         }
  35601         if (!((fc->l2warm) && ((fc->wb_recovered_version)
  35602             >= BCM_FIELD_WB_VERSION_1_8))) {
  35603             if ((max != vslice) && (max != -1)) {
  35604                 expanded[stage_fc->vmap[inst][0][vslice].vmap_key] = 1;
  35605             }
  35606         }
  35607     }
  35608 
  35609     return BCM_E_NONE;
  35610 }
  35611 
  35612 /*
  35613  * Function:
  35614  *     _bcm_field_th_egress_secondary_selcode_set
  35615  *
  35616  * Purpose:
  35617  *     Sets the secondary select codes based on field values in different
  35618  *     registers EFP_CLASSID_SELECTORr, EFP_KEY4_DVP_SELECTORr and
  35619  *     EFP_KEY4_MDL_SELECTORr.
  35620  *
  35621  * Parameters:
  35622  *     unit             - (IN) BCM unit number.
  35623  *     fg               - (IN/OUT) Select code information filled into the group
  35624  *     slice_idx        - (IN) Slice id
  35625  *     part_idx         - (IN) Part id of the given slice in the given group
  35626  *
  35627  * Returns:
  35628  *     BCM_E_XXX
  35629  */
  35630 STATIC int
  35631 _bcm_field_th_egress_secondary_selcodes_set(int unit, _field_group_t *fg,
  35632                                              int slice_idx, uint8 part_idx)
  35633 {
  35634     soc_field_t field;   /* H/W Register field.            */
  35635     uint64 reg_val64;    /* 64 bit H/W Register value.     */
  35636     uint32 fldval;       /* Field in a H/W register value. */
  35637     uint8  num_fields;   /* Number of fields.              */
  35638     soc_reg_t reg;       /* H/W register.                  */
  35639     int rv = BCM_E_NONE; /* Operation status.              */
  35640     int idx;             /* Index.                         */
  35641     int inst;            /* Instance.                      */
  35642     _field_stage_t     *stage_fc = NULL;
  35643     soc_reg_t       efp_classid_sel_reg;
  35644     soc_reg_t       efp_key4_dvp_reg;
  35645     soc_reg_t       efp_key4_mdl_reg;
  35646     soc_reg_t       efp_key8_dvp_reg;
  35647     soc_reg_t       efp_key4_class_reg;
  35648     soc_reg_t       efp_key8_class_reg;
  35649 
  35650     if (NULL == fg) {
  35651         return BCM_E_PARAM;
  35652     }
  35653 
  35654     BCM_IF_ERROR_RETURN(_field_stage_control_get(unit, _BCM_FIELD_STAGE_EGRESS, &stage_fc));
  35655     if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  35656        inst = _FP_GLOBAL_INST;
  35657     } else {
  35658        inst = fg->instance;
  35659     }
  35660 
  35661     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  35662                                                        EFP_CLASSID_SELECTORr,
  35663                                                        inst,
  35664                                                        &efp_classid_sel_reg));
  35665     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  35666                                                    EFP_KEY4_DVP_SELECTORr,
  35667                                                    inst, &efp_key4_dvp_reg));
  35668     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  35669                                                    EFP_KEY8_DVP_SELECTORr,
  35670                                                    inst, &efp_key8_dvp_reg));
  35671     BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  35672                                                    EFP_KEY4_MDL_SELECTORr,
  35673                                                    inst, &efp_key4_mdl_reg));
  35674     if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  35675         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  35676                                                         EFP_KEY4_L3_CLASSID_SELECTORr,
  35677                                                         inst,
  35678                                                         &efp_key4_class_reg));
  35679         BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  35680                                                         EFP_KEY8_L3_CLASSID_SELECTORr,
  35681                                                         inst,
  35682                                                         &efp_key8_class_reg));
  35683     }
  35684 
  35685     fg->sel_codes[part_idx].egr_class_f1_sel = _FP_SELCODE_DONT_CARE;
  35686     fg->sel_codes[part_idx].egr_class_f2_sel = _FP_SELCODE_DONT_CARE;
  35687     fg->sel_codes[part_idx].egr_class_f3_sel = _FP_SELCODE_DONT_CARE;
  35688     fg->sel_codes[part_idx].egr_class_f4_sel = _FP_SELCODE_DONT_CARE;
  35689     fg->sel_codes[part_idx].egr_class_f6_sel = _FP_SELCODE_DONT_CARE;
  35690     fg->sel_codes[part_idx].egr_class_f7_sel = _FP_SELCODE_DONT_CARE;
  35691     fg->sel_codes[part_idx].egr_class_f8_sel = _FP_SELCODE_DONT_CARE;
  35692     fg->sel_codes[part_idx].egr_key4_dvp_sel = _FP_SELCODE_DONT_CARE;
  35693     fg->sel_codes[part_idx].egr_key8_dvp_sel = _FP_SELCODE_DONT_CARE;
  35694     fg->sel_codes[part_idx].egr_key4_mdl_sel = _FP_SELCODE_DONT_CARE;
  35695     fg->sel_codes[part_idx].egr_key4_l3_classId_sel = _FP_SELCODE_DONT_CARE;
  35696     fg->sel_codes[part_idx].egr_key8_l3_classId_sel = _FP_SELCODE_DONT_CARE;
  35697 
  35698     reg = efp_classid_sel_reg;
  35699     rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, &reg_val64);
  35700     num_fields = sizeof(classfldtbl[0]) /
  35701                    sizeof(classfldtbl[0][0]);
  35702 
  35703     if (BCM_SUCCESS(rv)) {
  35704         for (idx = 0 ; idx < num_fields; idx++) {
  35705             field = classfldtbl[slice_idx][idx];
  35706             if (!soc_reg_field_valid(unit, reg, field)) {
  35707                 continue;
  35708             }
  35709 
  35710             fldval = soc_reg64_field_get(unit, reg, reg_val64, field);
  35711 
  35712             switch(idx) {
  35713                 case 0:
  35714                      fg->sel_codes[part_idx].egr_class_f1_sel = fldval;
  35715                      break;
  35716                 case 1:
  35717                      fg->sel_codes[part_idx].egr_class_f2_sel = fldval;
  35718                      break;
  35719                 case 2:
  35720                      fg->sel_codes[part_idx].egr_class_f3_sel = fldval;
  35721                      break;
  35722                 case 3:
  35723                      fg->sel_codes[part_idx].egr_class_f4_sel = fldval;
  35724                      break;
  35725                 case 4:
  35726                      fg->sel_codes[part_idx].egr_class_f6_sel = fldval;
  35727                      break;
  35728                 case 5:
  35729                      fg->sel_codes[part_idx].egr_class_f7_sel = fldval;
  35730                      break;
  35731                 case 6:
  35732                      fg->sel_codes[part_idx].egr_class_f8_sel = fldval;
  35733                      break;
  35734                 default:
  35735                      LOG_ERROR(BSL_LS_BCM_FP,
  35736                                (BSL_META_U(unit,
  35737                                            "FP(unit %d) Error:Invalid field in efp classid selector \n"),
  35738                                 unit));
  35739                      return BCM_E_INTERNAL;
  35740             }
  35741         }
  35742     }
  35743 
  35744     if (!soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  35745         reg = efp_key4_dvp_reg;
  35746         rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, &reg_val64);
  35747 
  35748         if (BCM_SUCCESS(rv)) {
  35749             field = dvpfldtbl[slice_idx];
  35750             if (soc_reg_field_valid(unit, reg, field)) {
  35751                 fldval = soc_reg_field_get(unit, reg, reg_val64, field);
  35752                 fg->sel_codes[part_idx].egr_key4_dvp_sel = fldval;
  35753             }
  35754         }
  35755 
  35756         reg = efp_key8_dvp_reg;
  35757         rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, &reg_val64);
  35758 
  35759         if (BCM_SUCCESS(rv)) {
  35760 
  35761             field = dvpfldtbl[slice_idx];
  35762             if (soc_reg_field_valid(unit, reg, field)) {
  35763 
  35764                 fldval = soc_reg_field_get(unit, reg, reg_val64, field);
  35765                 fg->sel_codes[part_idx].egr_key8_dvp_sel = fldval;
  35766             }
  35767         }
  35768     }
  35769 
  35770     reg = efp_key4_mdl_reg;
  35771     rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, &reg_val64);
  35772 
  35773     if (BCM_SUCCESS(rv)) {
  35774         field = mdlfldtbl[slice_idx];
  35775         if (soc_reg_field_valid(unit, reg, field)) {
  35776 
  35777             fldval = soc_reg_field_get(unit, reg, reg_val64, field);
  35778             fg->sel_codes[part_idx].egr_key4_mdl_sel = fldval;
  35779         }
  35780     }
  35781 
  35782 #if defined (BCM_TOMAHAWK3_SUPPORT)
  35783     if (soc_feature(unit, soc_feature_fp_no_dvp_support)) {
  35784         reg = efp_key4_class_reg;
  35785         rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, &reg_val64);
  35786 
  35787         if (BCM_SUCCESS(rv)) {
  35788             field = classIdBfldtbl[slice_idx];
  35789             if (soc_reg_field_valid(unit, reg, field)) {
  35790 
  35791                 fldval = soc_reg_field_get(unit, reg, reg_val64, field);
  35792                 fg->sel_codes[part_idx].egr_key4_l3_classId_sel = fldval;
  35793             }
  35794         }
  35795         reg = efp_key8_class_reg;
  35796         rv = soc_reg_get(unit, reg, REG_PORT_ANY, 0, &reg_val64);
  35797 
  35798         if (BCM_SUCCESS(rv)) {
  35799             field = classIdBfldtbl[slice_idx];
  35800             if (soc_reg_field_valid(unit, reg, field)) {
  35801 
  35802                 fldval = soc_reg_field_get(unit, reg, reg_val64, field);
  35803                 fg->sel_codes[part_idx].egr_key8_l3_classId_sel = fldval;
  35804             }
  35805         }
  35806 
  35807     }
  35808 #endif
  35809 
  35810     return BCM_E_NONE;
  35811 }
  35812 
  35813 /*
  35814  * Function:
  35815  *  _bcm_field_th_stage_egress_reinit
  35816  * Description:
  35817  *  Service routine used to retain the software sate of
  35818  *  EFP(Egress Field Processor) configuration .
  35819  * Parameters:
  35820  *   unit     - (IN) BCM device number.
  35821  *   fc       - (IN) Field control structure.
  35822  *   stage_fc - (IN/OUT) Stage field control structure.
  35823  * Returns:
  35824  *  BCM_E_XXX
  35825  * Notes:
  35826  *  None.
  35827  */
  35828 int
  35829 _bcm_field_th_stage_egress_reinit(int unit, _field_control_t *fc,
  35830                                _field_stage_t *stage_fc)
  35831 {
  35832     char *efp_policy_buf = NULL;  /* Buffer to read the EFP_POLICY table      */
  35833     char *efp_policy_pipe_buf[_FP_MAX_NUM_PIPES+1] = {NULL};
  35834                                   /* Buffer for EFP_POLICY_TABLE pipes.       */
  35835     int  idx;                     /* Index to field entry.                    */
  35836     int  idx1;
  35837     int slice_idx;                /* Slice index in (V/I/E)FP.                */
  35838     int vslice_idx;               /* Slice index in a virtual group.          */
  35839     int index_min;                /* Min index of a memory.                   */
  35840     int index_max;                /* Max index of a field memory.             */
  35841     int rv = BCM_E_NONE;          /* Operation status.                        */
  35842     int mem_sz;                   /* Size of the memory.                      */
  35843     int slice_ent_cnt = 0;        /* Entry count in a slice.                  */
  35844     int parts_count = 1;          /* Parts count in a field group.            */
  35845     int i;                        /* Used to loop through parts i
  35846                                      in a field group.                        */
  35847     int pri_tcam_idx;             /* Priority of an entry in TCAM.            */
  35848     int part_index;               /* Index to part(s) in a field group.       */
  35849     int slice_number;             /* (V/I/E) slice number.                    */
  35850     int phys_tcam_idx;            /* Index to physical TCAM in (V/I/E)FP.     */
  35851     int prev_prio;                /* Priority of previous field entry.        */
  35852     int expanded[_FP_MAX_NUM_PIPES][4];
  35853                                   /* Expansion status of slices in (V/I/E)FP. */
  35854     int slice_master_idx[_FP_MAX_NUM_PIPES][4];
  35855                                   /* Expansion status of slices in (V/I/E)FP. */
  35856     int priority;                 /* Priority of a field entry.               */
  35857     int multigroup;               /* Field group's multigroup status.         */
  35858     int max;                      /*Temporary variable.                       */
  35859     int master_slice;             /* Master slice number for expanded group.  */
  35860     uint8 *buf = NULL;            /* Pointer to 1st scache part.              */
  35861     uint8 *buf1 = NULL;           /* Pointer to 2nd scache part.              */
  35862     uint8 old_physical_slice;     /* Physical slice number.                   */
  35863     uint8 slice_num;              /* Physical slice number.                   */
  35864     uint16 default_key_1;         /* Default selcode of a field group in EFP. */
  35865     uint16 default_key_2;         /* Default selcode of a field group in EFP. */
  35866     uint32 *efp_tcam_buf = NULL;  /* Buffer to read the EFP_TCAM table.       */
  35867     uint32 *efp_tcam_pipe_buf[_FP_MAX_NUM_PIPES+1] = {NULL};
  35868                                   /* Buffer to read EFP_TCAM table.      */
  35869     uint32 rval;                  /* Holds conetets of register.              */
  35870     uint32 efp_slice_mode;        /* Mode of a slice in EFP.                  */
  35871     uint32 efp_slice_ipv6_mode;   /* IPv6 mode of a slice in EFP.             */
  35872     uint32 temp;                  /* Temporary varibale.                      */
  35873     uint32 key_match_type[2];     /* Key match types of field group in EFP.   */
  35874     uint32 entry_type = 0;        /* Type of entry of filed group in EFP.     */
  35875     uint32 efp_key_type_offset = 0;/* Type of entry of filed group in EFP.     */
  35876     uint32 entry_flags;           /* Flags set for a entry in field group.    */
  35877     _field_slice_t *fs = NULL;    /* Slice pointer.                           */
  35878     _field_group_t *fg = NULL;    /* Filed group pointer.                     */
  35879     _field_entry_t *f_ent = NULL; /* Field entry pointer.                     */
  35880     bcm_field_group_t gid;        /* Field group ID.                          */
  35881     bcm_field_qset_t qset;        /* QSET of field group.                     */
  35882     bcm_pbmp_t all_pbmp;          /* Port Bit Map.                            */
  35883     bcm_pbmp_t group_pbmp;        /* Port Bit Map.                            */
  35884     _field_action_t *fa = NULL;   /* Field Action Structure */
  35885     int group_flags = 0;
  35886     int action_res_id;
  35887     int   inst, mem_inst, instance;   /* Pipe Instances */
  35888     _field_entry_oam_wb_t *f_ent_oam_wb = NULL;
  35889     _field_entry_policer_wb_t *f_ent_policer_wb = NULL;
  35890     _field_slice_t *fs_temp = NULL;                    /* Slice pointer. */
  35891     int8               efp_key_info[2];
  35892     efp_tcam_entry_t *efp_tcam_entry = NULL;           /* Buffer to hold
  35893                                                           contents of entry in
  35894                                                           EFP_TCAM entry. */
  35895     efp_policy_table_entry_t *efp_policy_entry = NULL; /* Buffer to hold
  35896                                                           contetnts of entry in
  35897                                                           EFP_POLICY_TABLE. */
  35898 
  35899 
  35900     soc_field_t efp_en_flds[4] = {SLICE_ENABLE_SLICE_0f, SLICE_ENABLE_SLICE_1f,
  35901                                   SLICE_ENABLE_SLICE_2f, SLICE_ENABLE_SLICE_3f};
  35902 
  35903     _field_action_bmp_t action_bmp;
  35904     _field_entry_wb_info_t f_ent_wb_info;
  35905     soc_reg_t efp_slice_control_reg;
  35906     soc_mem_t efp_tcam;
  35907     soc_mem_t efp_policy_table;
  35908 
  35909     int size;
  35910     int slice_size;
  35911     _field_sliceidx_bmp_t sliceidx_bmp;
  35912     int slice_offset;
  35913     int tcam_valid_val = 0;
  35914     sliceidx_bmp.w = NULL;
  35915     slice_size = 0;
  35916     slice_offset = 0;
  35917 #if defined (BCM_TOMAHAWK3_SUPPORT)
  35918     if (SOC_IS_TOMAHAWK3(unit)) {
  35919         tcam_valid_val = 1;
  35920     } else
  35921 #endif /* BCM_TOMAHAWK3_SUPPORT */
  35922     {
  35923         tcam_valid_val = 3;
  35924     }
  35925 
  35926     /* Reset Action bitmap to NULL. */
  35927     action_bmp.w = NULL;
  35928     buf = fc->scache_ptr[_FIELD_SCACHE_PART_0];
  35929     buf1 = fc->scache_ptr[_FIELD_SCACHE_PART_1];
  35930 
  35931     fc->scache_pos1 = 0;
  35932     fc->scache_pos1 += SOC_WB_SCACHE_CONTROL_SIZE;
  35933 
  35934     sal_memset(expanded, 0, 4 * _FP_MAX_NUM_PIPES * sizeof(int));
  35935     sal_memset(slice_master_idx, 0, 4 * _FP_MAX_NUM_PIPES * sizeof(int));
  35936 
  35937     /*
  35938      * In Trident3, EFP_TCAM entry KEY field width is (272 + 2b VALID)
  35939      * In Tomahawk, EFP_TCAM entry KEY field width is (240 + 2b VALID)
  35940      */
  35941 #if defined (BCM_TOMAHAWK3_SUPPORT)
  35942     if (SOC_IS_TOMAHAWK3(unit)) {
  35943         /*for TH3, the KEY fields MINBIT is 1 as VALID is only 1 bit*/
  35944         efp_key_type_offset = 236 + 1;
  35945     } else
  35946 #endif /* BCM_TOMAHAWK3_SUPPORT */
  35947     {
  35948         efp_key_type_offset = soc_feature(unit, soc_feature_td3_style_fp) ? \
  35949                               (268 + 2) : (236 + 2);
  35950     }
  35951 
  35952     if (fc->l2warm) {
  35953         rv = _field_scache_stage_hdr_chk(fc, _FIELD_EFP_DATA_START);
  35954         if (BCM_FAILURE(rv)) {
  35955            return (rv);
  35956         }
  35957 
  35958         if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_10) {
  35959            bcm_field_group_oper_mode_t oper_mode;
  35960 
  35961            /* Retrieve Stage Operational Mode. */
  35962            oper_mode = buf[fc->scache_pos];
  35963 
  35964            LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  35965                  "%s(): Recovering oper_mode:%d @ byte s_pos=%d s_po1=%d\n\r"),
  35966                   __func__, oper_mode, fc->scache_pos, fc->scache_pos1));
  35967 
  35968            fc->scache_pos++;
  35969 
  35970            if (stage_fc->oper_mode != oper_mode) {
  35971               /* Initialize the stage with the given operational mode. */
  35972               rv = _bcm_field_th_group_oper_mode_set(unit,
  35973                                                   bcmFieldQualifyStageEgress,
  35974                                                   oper_mode);
  35975               if (BCM_FAILURE(rv)) {
  35976                  return rv;
  35977               }
  35978 
  35979               rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_EGRESS,
  35980                                          &stage_fc);
  35981               BCM_IF_ERROR_RETURN(rv);
  35982            }
  35983         }
  35984     }
  35985 
  35986     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  35987        if (!(fc->pipe_map & (1 << inst))) {
  35988             continue;
  35989        }
  35990        mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  35991                    _FP_GLOBAL_INST : inst;
  35992        instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  35993                    _FP_MAX_NUM_PIPES : inst;
  35994 
  35995        BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, EFP_TCAMm,
  35996                                                           mem_inst, &efp_tcam));
  35997        BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  35998                                                           EFP_POLICY_TABLEm,
  35999                                                           mem_inst,
  36000                                                           &efp_policy_table));
  36001        BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  36002                                              EFP_SLICE_CONTROLr,
  36003                                              mem_inst, &efp_slice_control_reg));
  36004        /* DMA various tables */
  36005        efp_tcam_buf = soc_cm_salloc(unit, sizeof(efp_tcam_entry_t) *
  36006                                 soc_mem_index_count(unit, efp_tcam),
  36007                                 "EFP TCAM buffer");
  36008        if (NULL == efp_tcam_buf) {
  36009            rv = BCM_E_MEMORY;
  36010            goto cleanup;
  36011        }
  36012 
  36013        sal_memset(efp_tcam_buf, 0, sizeof(efp_tcam_entry_t) *
  36014                        soc_mem_index_count(unit, EFP_TCAMm));
  36015 
  36016        index_min = soc_mem_index_min(unit, efp_tcam);
  36017        index_max = soc_mem_index_max(unit, efp_tcam);
  36018        fs = stage_fc->slices[inst];
  36019        if (stage_fc->flags & _FP_STAGE_HALF_SLICE) {
  36020            slice_ent_cnt = fs->entry_count * 2;
  36021            /* DMA in chunks */
  36022            for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) {
  36023                fs = stage_fc->slices[inst] + slice_idx;
  36024                if ((rv = soc_mem_read_range(unit,
  36025                                 efp_tcam, MEM_BLOCK_ALL,
  36026                                 slice_idx * slice_ent_cnt,
  36027                                 slice_idx * slice_ent_cnt + fs->entry_count - 1,
  36028                                 efp_tcam_buf + slice_idx * slice_ent_cnt *
  36029                                 soc_mem_entry_words(unit, efp_tcam)))
  36030                    < 0 ) {
  36031                    goto cleanup;
  36032                }
  36033            }
  36034        } else {
  36035            slice_ent_cnt = fs->entry_count;
  36036            if ((rv = soc_mem_read_range(unit, efp_tcam, MEM_BLOCK_ALL,
  36037                                         index_min, index_max,
  36038                                         efp_tcam_buf)) < 0 ) {
  36039                goto cleanup;
  36040            }
  36041        }
  36042 
  36043        efp_policy_buf = soc_cm_salloc(unit, SOC_MEM_TABLE_BYTES
  36044                                      (unit, efp_policy_table),
  36045                                      "EFP POLICY TABLE buffer");
  36046        if (NULL == efp_policy_buf) {
  36047            rv = BCM_E_MEMORY;
  36048            goto cleanup;
  36049        }
  36050        sal_memset(efp_policy_buf, 0, SOC_MEM_TABLE_BYTES
  36051                                     (unit, efp_policy_table));
  36052        index_min = soc_mem_index_min(unit, efp_policy_table);
  36053        index_max = soc_mem_index_max(unit, efp_policy_table);
  36054        if ((rv = soc_mem_read_range(unit, efp_policy_table,
  36055                                     MEM_BLOCK_ALL, index_min, index_max,
  36056                                     efp_policy_buf)) < 0 ) {
  36057             goto cleanup;
  36058        }
  36059 
  36060        efp_tcam_pipe_buf[instance] = efp_tcam_buf;
  36061        efp_policy_pipe_buf[instance] = efp_policy_buf;
  36062        efp_tcam_buf = NULL;
  36063        efp_policy_buf = NULL;
  36064     }
  36065 
  36066     /* Get slice expansion status and virtual map for all the instances */
  36067     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  36068         if (!(fc->pipe_map & (1 << inst))) {
  36069 
  36070              continue;
  36071         }
  36072         if ((rv = _field_th_slice_expanded_status_get(unit, inst, fc, stage_fc,
  36073                                  expanded[inst], slice_master_idx[inst])) < 0) {
  36074              goto cleanup;
  36075         }
  36076     }
  36077 
  36078     slice_size = 0;
  36079     if ((fc->l2warm) &&
  36080         ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_27)) {
  36081         /* get the total slice size*/
  36082         slice_size = stage_fc->tcam_sz;
  36083         size = SHR_BITALLOCSIZE(slice_size * _FP_MAX_NUM_PIPES);
  36084         _FP_XGS3_ALLOC(sliceidx_bmp.w, size, "Sliceidx Bitmap");
  36085         if (NULL == sliceidx_bmp.w) {
  36086             rv = BCM_E_MEMORY;
  36087             goto cleanup;
  36088         }
  36089         sal_memcpy (sliceidx_bmp.w, &buf[fc->scache_pos],
  36090                     size);
  36091         fc->scache_pos += size;
  36092     }
  36093 
  36094     /* Iterate over the instances */
  36095     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  36096        if (!(fc->pipe_map & (1 << inst))) {
  36097             continue;
  36098        }
  36099        mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  36100                    _FP_GLOBAL_INST : inst;
  36101        instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  36102                    _FP_MAX_NUM_PIPES : inst;
  36103        slice_offset = inst * slice_size;
  36104 
  36105        rv = _bcm_field_reg_instance_get(unit,
  36106                                         EFP_SLICE_CONTROLr,
  36107                                         mem_inst, &efp_slice_control_reg);
  36108        if (BCM_FAILURE(rv)) {
  36109            goto cleanup;
  36110        }
  36111        rv = _bcm_field_mem_instance_get(unit, EFP_TCAMm,
  36112                                         mem_inst, &efp_tcam);
  36113        if (BCM_FAILURE(rv)) {
  36114            goto cleanup;
  36115        }
  36116        rv = _bcm_field_mem_instance_get(unit,
  36117                                         EFP_POLICY_TABLEm,
  36118                                         mem_inst,
  36119                                         &efp_policy_table);
  36120        if (BCM_FAILURE(rv)) {
  36121            goto cleanup;
  36122        }
  36123 
  36124        if ((rv = soc_reg32_get(unit, efp_slice_control_reg,
  36125                                REG_PORT_ANY, 0, &rval)) < 0) {
  36126            goto cleanup;
  36127        }
  36128 
  36129        /* Iterate over the slices */
  36130        for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) {
  36131            /* Ignore disabled slice */
  36132            if (soc_reg_field_get(unit, efp_slice_control_reg, rval,
  36133                                   efp_en_flds[slice_idx]) == 0) {
  36134                continue;
  36135            }
  36136 
  36137            /* Don't need to read selectors for expanded slice */
  36138            if (expanded[inst][slice_idx]) {
  36139               continue;
  36140            }
  36141 
  36142            efp_slice_mode = soc_reg_field_get(unit,
  36143                                           efp_slice_control_reg, rval,
  36144                                           _th_efp_slice_mode[slice_idx][0]);
  36145            efp_slice_ipv6_mode = soc_reg_field_get(unit,
  36146                                           efp_slice_control_reg, rval,
  36147                                           _th_efp_slice_mode[slice_idx][1]);
  36148 
  36149            /* Skip second part of slice pair */
  36150            if (((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE) ||
  36151                (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY) ||
  36152                (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) &&
  36153                (slice_idx % 2)) {
  36154                continue;
  36155            }
  36156 
  36157            /* Skip if slice has no valid groups and entries */
  36158            fs = stage_fc->slices[inst] + slice_idx;
  36159            key_match_type[0] = ~0;
  36160            key_match_type[1] = ~0;
  36161 
  36162            /* Get KEY_MATCH_TYPE from the valid entries of EFP_TCAM */
  36163            for (idx = 0; idx < slice_ent_cnt; idx++) {
  36164                efp_tcam_entry = soc_mem_table_idx_to_pointer(unit,
  36165                                                efp_tcam,
  36166                                                efp_tcam_entry_t *,
  36167                                       efp_tcam_pipe_buf[instance],
  36168                                  idx + slice_ent_cnt * slice_idx);
  36169 
  36170                if ((soc_mem_field32_get(unit, efp_tcam,
  36171                    efp_tcam_entry, VALIDf) != 0) ||
  36172                    ((fc->l2warm) &&
  36173                    ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_27) &&
  36174                    (_FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  36175                    (idx + slice_ent_cnt * slice_idx) + slice_offset) ))) {
  36176 
  36177                    if (key_match_type[0] == ~0) {
  36178                       _field_extract((uint32 *)efp_tcam_entry, efp_key_type_offset, 4,
  36179                                      &key_match_type[0]);
  36180                       continue;
  36181                    }
  36182 
  36183                    if (key_match_type[1] == ~0) {
  36184                       _field_extract((uint32 *)efp_tcam_entry, efp_key_type_offset, 4,
  36185                                      &key_match_type[1]);
  36186                       if (key_match_type[0] == key_match_type[1]) {
  36187                           key_match_type[1] = ~0;
  36188                       } else {
  36189                          /* break once possible two key match types are
  36190                           * extracted from the valid entries
  36191                           */
  36192                          break;
  36193                       }
  36194                    }
  36195                }
  36196            }
  36197 
  36198            if (key_match_type[0] == ~0 && !fc->l2warm) {
  36199               continue;
  36200            }
  36201 
  36202            fg = NULL;
  36203            if (efp_slice_mode <= 5) { /* Valid values */
  36204                /* If Level 2, retrieve the GIDs in this slice */
  36205                if (fc->l2warm) {
  36206                    rv = _field_trx_scache_slice_group_recover(unit,
  36207                                                               fc,
  36208                                                               inst,
  36209                                                               slice_idx,
  36210                                                               NULL,
  36211                                                               stage_fc,
  36212                                                               0);
  36213                    if (BCM_FAILURE(rv) && (rv != BCM_E_NOT_FOUND)) {
  36214                       fc->l2warm = 0;
  36215                       goto cleanup;
  36216                    }
  36217                    if (rv == BCM_E_NOT_FOUND) {
  36218                       rv = BCM_E_NONE;
  36219                       continue;
  36220                    }
  36221                }
  36222 
  36223                LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  36224                  "# line[%d] inst[%d] slice[%d] byte @ s_pos=%d s_pos1=%d\n\r"),
  36225                   __LINE__,inst,slice_idx, fc->scache_pos,fc->scache_pos1));
  36226                LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  36227                  "@ efp_slice_mode:[%d] inst[%d] slice[%d] key_match_type[0]=%d"
  36228                  " key_match_type[1]=%d\n\r"), efp_slice_mode, inst, slice_idx,
  36229                  key_match_type[0], key_match_type[1]));
  36230 
  36231                rv = _field_tr2_group_construct_alloc(unit, &fg);
  36232                if (BCM_FAILURE(rv)) {
  36233                   goto cleanup;
  36234                }
  36235 
  36236                action_res_id = BCM_FIELD_GROUP_ACTION_RES_ID_DEFAULT;
  36237 
  36238                group_flags = 0;
  36239                if (fc->l2warm) {
  36240                   /* Get stored group ID and QSET for Level 2 */
  36241                   rv = _field_group_info_retrieve(unit, -1, inst,
  36242                                                   &gid, &priority,
  36243                                                   &action_res_id,
  36244                                                   &group_pbmp,
  36245                                                   efp_key_info,
  36246                                                   &group_flags,
  36247                                                   &qset, fc);
  36248                   sal_memcpy(&fg->qset, &qset, sizeof(bcm_field_qset_t));
  36249                } else {
  36250                   if ((rv = _bcm_field_group_id_generate(unit, &gid))
  36251                                                       == BCM_E_NONE) {
  36252                       unsigned vmap, vslice;
  36253 
  36254                       for (priority = -1, vmap = 0;
  36255                            priority == -1 && vmap < _FP_VMAP_CNT; ++vmap) {
  36256                           for (vslice = 0;
  36257                                vslice < COUNTOF(stage_fc->vmap[inst][0]);
  36258                                ++vslice) {
  36259                              if (stage_fc->vmap[inst][vmap][vslice].vmap_key ==
  36260                                                                    slice_idx) {
  36261                                  priority =
  36262                                     stage_fc->vmap[inst][vmap][vslice].priority;
  36263                                  break;
  36264                              }
  36265                           }
  36266                       }
  36267 
  36268                       if (priority == -1) {
  36269                           rv = BCM_E_INTERNAL;
  36270                       }
  36271                   }
  36272                }
  36273                if (BCM_FAILURE(rv)) {
  36274                   sal_free(fg);
  36275                   goto cleanup;
  36276                }
  36277 
  36278                fg->gid      = gid;
  36279                fg->priority = priority;
  36280                fg->action_res_id = action_res_id;
  36281                fg->stage_id = stage_fc->stage_id;
  36282                fg->instance = inst;
  36283 
  36284                if (fc->l2warm && ((fc->wb_recovered_version)
  36285                    >= BCM_FIELD_WB_VERSION_1_16)) {
  36286                    /* Update efp primary key value */
  36287                    fg->sel_codes[0].fpf3 = efp_key_info[0];
  36288 
  36289                    /* Update efp secondary key value based on mode */
  36290                    if ((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE) ||
  36291                            (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY) ||
  36292                            (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) {
  36293                        fg->sel_codes[1].fpf3 = efp_key_info[1];
  36294                        parts_count = 2;
  36295                        fg->flags |= _FP_GROUP_SPAN_DOUBLE_SLICE;
  36296                    } else {
  36297                        parts_count = 1;
  36298                        fg->flags |= _FP_GROUP_SPAN_SINGLE_SLICE;
  36299                    }
  36300 
  36301                    /* Update IPv6 mode */
  36302                    if (efp_key_info[0] == _BCM_FIELD_EFP_KEY2) {
  36303                        fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode;
  36304                    } else if (efp_key_info[1] == _BCM_FIELD_EFP_KEY2) {
  36305                        fg->sel_codes[1].ip6_addr_sel = efp_slice_ipv6_mode;
  36306                    }
  36307 
  36308                    for (part_index = 0; part_index < parts_count; part_index++) {
  36309                        /* Populate all secondary selectors for the given group */
  36310 #if defined(BCM_TRIDENT3_SUPPORT)
  36311                        if (soc_feature(unit, soc_feature_td3_style_fp)) {
  36312                            rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg,
  36313                                    slice_idx + part_index,
  36314                                    part_index);
  36315                        } else
  36316 #endif
  36317                        {
  36318                            rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg,
  36319                                    slice_idx + part_index,
  36320                                    part_index);
  36321                        }
  36322                        if (BCM_FAILURE(rv)) {
  36323                            sal_free(fg);
  36324                            goto cleanup;
  36325                        }
  36326                    }
  36327 
  36328                    /* Store primary key's */
  36329                    default_key_1 = fg->sel_codes[0].fpf3;
  36330                    default_key_2 = fg->sel_codes[1].fpf3;
  36331 
  36332                    if (fg->flags & _FP_GROUP_SPAN_SINGLE_SLICE) {
  36333                        rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36334                                stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36335                        if (BCM_FAILURE(rv)) {
  36336                            sal_free(fg);
  36337                            goto cleanup;
  36338                        }
  36339 
  36340                        /* Update secondary or default key for quals update */
  36341                        fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY4;
  36342                    } else {
  36343                        switch(efp_slice_mode) {
  36344                            case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6:
  36345                            case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE:
  36346                                rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36347                                        stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36348                                if (BCM_FAILURE(rv)) {
  36349                                    sal_free(fg);
  36350                                    goto cleanup;
  36351                                }
  36352                                /* Update secondary or default key for quals update */
  36353                                fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY8;
  36354                                fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36355                                break;
  36356                            case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY:
  36357                                rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36358                                        stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36359                                if (BCM_FAILURE(rv)) {
  36360                                    sal_free(fg);
  36361                                    goto cleanup;
  36362                                }
  36363                                /* Update secondary or default key for quals update */
  36364                                fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1;
  36365                                fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36366                                break;
  36367                            default:
  36368                                rv = BCM_E_INTERNAL;
  36369                                sal_free(fg);
  36370                                goto cleanup;
  36371                        }
  36372                    }
  36373 
  36374                    rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36375                            stage_fc, _FP_ENTRY_TYPE_1, fg,
  36376                            default_key_1, default_key_2);
  36377                    if (BCM_FAILURE(rv)) {
  36378                        sal_free(fg);
  36379                        goto cleanup;
  36380                    }
  36381 
  36382                    /* Restore Primary Key */
  36383                    fg->sel_codes[0].fpf3 = default_key_1;
  36384                    fg->sel_codes[1].fpf3 = default_key_2;
  36385                } else {
  36386                    switch (efp_slice_mode) {
  36387 
  36388                        case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2:
  36389                            fg->flags |= _FP_GROUP_SPAN_SINGLE_SLICE;
  36390                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY4;
  36391                            parts_count = 1;
  36392 
  36393                            for (part_index = 0; part_index < parts_count; part_index++) {
  36394                                /* Populate all secondary selectors for the given group */
  36395 #if defined(BCM_TRIDENT3_SUPPORT)
  36396                                if (soc_feature(unit, soc_feature_td3_style_fp)) {
  36397                                    rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg,
  36398                                            slice_idx + part_index,
  36399                                            part_index);
  36400                                } else
  36401 #endif
  36402                                {
  36403                                    rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg,
  36404                                            slice_idx + part_index,
  36405                                            part_index);
  36406                                }
  36407                                if (BCM_FAILURE(rv)) {
  36408                                    sal_free(fg);
  36409                                    goto cleanup;
  36410                                }
  36411                            }
  36412                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36413                                    stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36414                            if (BCM_FAILURE(rv)) {
  36415                                sal_free(fg);
  36416                                goto cleanup;
  36417                            }
  36418 
  36419                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36420                                    stage_fc, _FP_ENTRY_TYPE_1, fg,
  36421                                    fg->sel_codes[0].fpf3, -1);
  36422                            if (BCM_FAILURE(rv)) {
  36423                                sal_free(fg);
  36424                                goto cleanup;
  36425                            }
  36426                            break;
  36427                        case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3:
  36428                            fg->flags |= _FP_GROUP_SPAN_SINGLE_SLICE;
  36429                            parts_count = 1;
  36430 
  36431 
  36432                            for (part_index = 0; part_index < parts_count; part_index++) {
  36433                                /* Populate all secondary selectors for the given group */
  36434 #if defined(BCM_TRIDENT3_SUPPORT)
  36435                                if (soc_feature(unit, soc_feature_td3_style_fp)) {
  36436                                    rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg,
  36437                                            slice_idx + part_index,
  36438                                            part_index);
  36439                                } else
  36440 #endif
  36441                                {
  36442                                    rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg,
  36443                                            slice_idx + part_index,
  36444                                            part_index);
  36445                                }
  36446                                if (BCM_FAILURE(rv)) {
  36447                                    sal_free(fg);
  36448                                    goto cleanup;
  36449                                }
  36450                            }
  36451 
  36452                            if (efp_slice_ipv6_mode) {
  36453                                fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY2;
  36454                                default_key_1 = _BCM_FIELD_EFP_KEY2;
  36455                                fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode;
  36456                            } else {
  36457                                if ((key_match_type[0] == KEY_TYPE_IPv6_SINGLE) ||
  36458                                        (key_match_type[1] == KEY_TYPE_IPv6_SINGLE) ||
  36459                                    BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifySrcIp6) ||
  36460                                    BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyDstIp6) ||
  36461                                    BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyIp6) ||
  36462                                    BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifySrcIp6High) ||
  36463                                    BCM_FIELD_QSET_TEST(fg->qset, bcmFieldQualifyDstIp6High)) {
  36464                                    fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY2;
  36465                                    default_key_1 = _BCM_FIELD_EFP_KEY2;
  36466                                    fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode;
  36467                                } else {
  36468                                    fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1;
  36469                                    default_key_1 = _BCM_FIELD_EFP_KEY1;
  36470                                    fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36471                                }
  36472                            }
  36473 
  36474                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36475                                    stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36476                            if (BCM_FAILURE(rv)) {
  36477                                sal_free(fg);
  36478                                goto cleanup;
  36479                            }
  36480 
  36481                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY4;
  36482                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36483                                    stage_fc, _FP_ENTRY_TYPE_1, fg,
  36484                                    default_key_1, -1);
  36485                            if (BCM_FAILURE(rv)) {
  36486                                sal_free(fg);
  36487                                goto cleanup;
  36488                            }
  36489 
  36490                            fg->sel_codes[0].fpf3 = default_key_1;
  36491                            if (efp_slice_ipv6_mode) {
  36492                                fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode;
  36493                            }
  36494                            else {
  36495                                if (default_key_1 == _BCM_FIELD_EFP_KEY1) {
  36496                                    fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36497                                }
  36498                            }
  36499                            break;
  36500                        case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY:
  36501                            fg->flags |= _FP_GROUP_SPAN_SINGLE_SLICE;
  36502                            parts_count = 1;
  36503 
  36504 
  36505                            for (part_index = 0; part_index < parts_count; part_index++) {
  36506                                /* Populate all secondary selectors for the given group */
  36507 #if defined(BCM_TRIDENT3_SUPPORT)
  36508                                if (soc_feature(unit, soc_feature_td3_style_fp)) {
  36509                                    rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg,
  36510                                            slice_idx + part_index,
  36511                                            part_index);
  36512                                } else
  36513 #endif
  36514                                {
  36515                                    rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg,
  36516                                            slice_idx + part_index,
  36517                                            part_index);
  36518                                }
  36519                                if (BCM_FAILURE(rv)) {
  36520                                    sal_free(fg);
  36521                                    goto cleanup;
  36522                                }
  36523                            }
  36524 
  36525                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1;
  36526                            fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36527                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36528                                    stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36529                            if (BCM_FAILURE(rv)) {
  36530                                sal_free(fg);
  36531                                goto cleanup;
  36532                            }
  36533 
  36534                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY4;
  36535                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36536                                    stage_fc, _FP_ENTRY_TYPE_1, fg,
  36537                                    _BCM_FIELD_EFP_KEY1, -1);
  36538                            if (BCM_FAILURE(rv)) {
  36539                                sal_free(fg);
  36540                                goto cleanup;
  36541                            }
  36542 
  36543                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1;
  36544                            fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36545                            break;
  36546                        case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE:
  36547                            fg->flags |= _FP_GROUP_SPAN_DOUBLE_SLICE;
  36548                            parts_count = 2;
  36549 
  36550 
  36551                            for (part_index = 0; part_index < parts_count; part_index++) {
  36552                                /* Populate all secondary selectors for the given group */
  36553 #if defined(BCM_TRIDENT3_SUPPORT)
  36554                                if (soc_feature(unit, soc_feature_td3_style_fp)) {
  36555                                    rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg,
  36556                                            slice_idx + part_index,
  36557                                            part_index);
  36558                                } else
  36559 #endif
  36560                                {
  36561                                    rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg,
  36562                                            slice_idx + part_index,
  36563                                            part_index);
  36564                                }
  36565                                if (BCM_FAILURE(rv)) {
  36566                                    sal_free(fg);
  36567                                    goto cleanup;
  36568                                }
  36569                            }
  36570 
  36571                            if (efp_slice_ipv6_mode) {
  36572                                fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY3;
  36573                                fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY2;
  36574                                default_key_1 = _BCM_FIELD_EFP_KEY3;
  36575                                default_key_2 = _BCM_FIELD_EFP_KEY2;
  36576                                fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36577                                fg->sel_codes[1].ip6_addr_sel = efp_slice_ipv6_mode;
  36578                            } else {
  36579                                if ((key_match_type[0] == KEY_TYPE_IPv6_DOUBLE) ||
  36580                                        (key_match_type[1] == KEY_TYPE_IPv6_DOUBLE)) {
  36581                                    fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY3;
  36582                                    fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY2;
  36583                                    default_key_1 = _BCM_FIELD_EFP_KEY3;
  36584                                    default_key_2 = _BCM_FIELD_EFP_KEY2;
  36585                                    fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36586                                    fg->sel_codes[1].ip6_addr_sel = efp_slice_ipv6_mode;
  36587                                } else if ((key_match_type[0] ==
  36588                                            KEY_TYPE_IPv4_L2_L3_DOUBLE) ||
  36589                                        (key_match_type[1] ==
  36590                                         KEY_TYPE_IPv4_L2_L3_DOUBLE) ) {
  36591                                    fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1;
  36592                                    fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36593                                    default_key_1 = _BCM_FIELD_EFP_KEY1;
  36594                                    default_key_2 = _BCM_FIELD_EFP_KEY4;
  36595                                    fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36596                                    fg->sel_codes[1].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36597                                } else {
  36598                                    fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY8;
  36599                                    fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36600                                    default_key_1 = _BCM_FIELD_EFP_KEY8;
  36601                                    default_key_2 = _BCM_FIELD_EFP_KEY4;
  36602                                    fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36603                                    fg->sel_codes[1].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36604                                }
  36605                            }
  36606 
  36607                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36608                                    stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36609                            if (BCM_FAILURE(rv)) {
  36610                                sal_free(fg);
  36611                                goto cleanup;
  36612                            }
  36613 
  36614                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY8;
  36615                            fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36616 
  36617                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36618                                    stage_fc, _FP_ENTRY_TYPE_1, fg,
  36619                                    default_key_1, default_key_2);
  36620                            if (BCM_FAILURE(rv)) {
  36621                                sal_free(fg);
  36622                                goto cleanup;
  36623                            }
  36624 
  36625                            fg->sel_codes[0].fpf3 = default_key_1;
  36626                            fg->sel_codes[1].fpf3 = default_key_2;
  36627                            break;
  36628 
  36629                        case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY:
  36630                            fg->flags |= _FP_GROUP_SPAN_DOUBLE_SLICE;
  36631                            parts_count = 2;
  36632 
  36633                            for (part_index = 0; part_index < parts_count; part_index++) {
  36634                                /* Populate all secondary selectors for the given group */
  36635 #if defined(BCM_TRIDENT3_SUPPORT)
  36636                                if (soc_feature(unit, soc_feature_td3_style_fp)) {
  36637                                    rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg,
  36638                                            slice_idx + part_index,
  36639                                            part_index);
  36640                                } else
  36641 #endif
  36642                                {
  36643                                    rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg,
  36644                                            slice_idx + part_index,
  36645                                            part_index);
  36646                                }
  36647                                if (BCM_FAILURE(rv)) {
  36648                                    sal_free(fg);
  36649                                    goto cleanup;
  36650                                }
  36651                            }
  36652 
  36653                            fg->sel_codes[0].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36654                            fg->sel_codes[1].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36655 
  36656                            if ((key_match_type[0] == KEY_TYPE_HIGIG_DOUBLE) ||
  36657                                    (key_match_type[1] == KEY_TYPE_HIGIG_DOUBLE)) {
  36658                                fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY6;
  36659                                fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36660                                default_key_1 = _BCM_FIELD_EFP_KEY6;
  36661                                default_key_2 = _BCM_FIELD_EFP_KEY4;
  36662                            } else if ((key_match_type[0] ==
  36663                                        KEY_TYPE_LOOPBACK_DOUBLE) ||
  36664                                    (key_match_type[0] ==
  36665                                     KEY_TYPE_LOOPBACK_DOUBLE) ) {
  36666                                fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY7;
  36667                                fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36668                                default_key_1 = _BCM_FIELD_EFP_KEY7;
  36669                                default_key_2 = _BCM_FIELD_EFP_KEY4;
  36670                            } else {
  36671                                fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1;
  36672                                fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36673                                default_key_1 = _BCM_FIELD_EFP_KEY1;
  36674                                default_key_2 = _BCM_FIELD_EFP_KEY4;
  36675                            }
  36676 
  36677                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36678                                    stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36679                            if (BCM_FAILURE(rv)) {
  36680                                sal_free(fg);
  36681                                goto cleanup;
  36682                            }
  36683 
  36684                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY1;
  36685                            fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36686 
  36687                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36688                                    stage_fc, _FP_ENTRY_TYPE_1, fg,
  36689                                    default_key_1, default_key_2);
  36690                            if (BCM_FAILURE(rv)) {
  36691                                sal_free(fg);
  36692                                goto cleanup;
  36693                            }
  36694 
  36695                            fg->sel_codes[0].fpf3 = default_key_1;
  36696                            fg->sel_codes[1].fpf3 = default_key_2;
  36697                            break;
  36698 
  36699                        case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6:
  36700 
  36701                            fg->flags |= _FP_GROUP_SPAN_DOUBLE_SLICE;
  36702                            parts_count = 2;
  36703 
  36704                            for (part_index = 0; part_index < parts_count; part_index++) {
  36705                                /* Populate all secondary selectors for the given group */
  36706 #if defined(BCM_TRIDENT3_SUPPORT)
  36707                                if (soc_feature(unit, soc_feature_td3_style_fp)) {
  36708                                    rv = _bcm_field_td3_egress_secondary_selcodes_set(unit, fg,
  36709                                            slice_idx + part_index,
  36710                                            part_index);
  36711                                } else
  36712 #endif
  36713                                {
  36714                                    rv = _bcm_field_th_egress_secondary_selcodes_set(unit, fg,
  36715                                            slice_idx + part_index,
  36716                                            part_index);
  36717                                }
  36718                                if (BCM_FAILURE(rv)) {
  36719                                    sal_free(fg);
  36720                                    goto cleanup;
  36721                                }
  36722                            }
  36723 
  36724                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY2;
  36725                            fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36726                            fg->sel_codes[0].ip6_addr_sel = efp_slice_ipv6_mode;
  36727                            fg->sel_codes[1].ip6_addr_sel = _FP_SELCODE_DONT_CARE;
  36728 
  36729                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36730                                    stage_fc, _FP_ENTRY_TYPE_0, fg, -1, -1);
  36731                            if (BCM_FAILURE(rv)) {
  36732                                sal_free(fg);
  36733                                goto cleanup;
  36734                            }
  36735 
  36736                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY8;
  36737                            fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36738 
  36739                            rv = _bcm_field_td2_group_construct_quals_add(unit, fc,
  36740                                    stage_fc, _FP_ENTRY_TYPE_1, fg,
  36741                                    _BCM_FIELD_EFP_KEY2, _BCM_FIELD_EFP_KEY4);
  36742                            if (BCM_FAILURE(rv)) {
  36743                                sal_free(fg);
  36744                                goto cleanup;
  36745                            }
  36746 
  36747                            fg->sel_codes[0].fpf3 = _BCM_FIELD_EFP_KEY2;
  36748                            fg->sel_codes[1].fpf3 = _BCM_FIELD_EFP_KEY4;
  36749                            break;
  36750 
  36751                        default:
  36752                            rv = BCM_E_INTERNAL;
  36753                            sal_free(fg);
  36754                            goto cleanup;
  36755                    }
  36756                }
  36757 
  36758                /* Associate slice(s) to group */
  36759                fg->slices = stage_fc->slices[inst] + slice_idx;
  36760                SOC_PBMP_CLEAR(all_pbmp);
  36761                if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  36762                   SOC_PBMP_ASSIGN(all_pbmp, PBMP_PORT_ALL(unit));
  36763                   SOC_PBMP_OR(all_pbmp, PBMP_CMIC(unit));
  36764                } else {
  36765                   SOC_PBMP_ASSIGN(all_pbmp, PBMP_PIPE(unit, fg->instance));
  36766                   SOC_PBMP_REMOVE(all_pbmp, PBMP_LB(unit));
  36767                }
  36768                SOC_PBMP_ASSIGN(fg->pbmp, all_pbmp);
  36769                BCM_PBMP_OR(fs->pbmp, fg->pbmp);
  36770 
  36771                fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK;
  36772                if (fg->flags & _FP_GROUP_SPAN_DOUBLE_SLICE) {
  36773                    BCM_PBMP_OR((fs + 1)->pbmp, fg->pbmp);
  36774                    (fs + 1)->group_flags = fs->group_flags;
  36775                }
  36776 
  36777                /* Initialize group default ASET list. */
  36778                rv = _field_group_default_aset_set(unit, fg);
  36779                if (BCM_FAILURE(rv)) {
  36780                   sal_free(fg);
  36781                   goto cleanup;
  36782                }
  36783 
  36784                if (fc->l2warm
  36785                        && ((fc->wb_recovered_version)
  36786                        >= BCM_FIELD_WB_VERSION_1_15)) {
  36787                    if (group_flags & _FP_GROUP_LOOKUP_ENABLED) {
  36788                        fg->flags = fg->flags | _FP_GROUP_LOOKUP_ENABLED;
  36789                    }
  36790                    if (group_flags & _FP_GROUP_WLAN) {
  36791                        fg->flags = fg->flags | _FP_GROUP_WLAN;
  36792                    }
  36793                } else {
  36794                    fg->flags |= _FP_GROUP_LOOKUP_ENABLED;
  36795                }
  36796 
  36797                if (group_flags & _FP_GROUP_SELECT_AUTO_EXPANSION) {
  36798                    fg->flags |= _FP_GROUP_SELECT_AUTO_EXPANSION;
  36799                }
  36800 
  36801                fg->next = fc->groups;
  36802                fc->groups = fg;
  36803 
  36804                /* Now go over the entries in this slice */
  36805                prev_prio = -1;
  36806                for (idx = 0; idx < slice_ent_cnt; idx++) {
  36807                    efp_tcam_entry = soc_mem_table_idx_to_pointer(unit,
  36808                                                    efp_tcam,
  36809                                                    efp_tcam_entry_t *,
  36810                                           efp_tcam_pipe_buf[instance],
  36811                                       idx + slice_ent_cnt * slice_idx);
  36812                    if (soc_mem_field32_get(unit, efp_tcam,
  36813                                            efp_tcam_entry, VALIDf) == 0) {
  36814                        if (!(fc->l2warm)) {
  36815                            continue;
  36816                        } else {
  36817                            if ((fc->wb_recovered_version) <
  36818                                BCM_FIELD_WB_VERSION_1_27) {
  36819                                continue;
  36820                            } else if (!(_FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  36821                                (idx + slice_ent_cnt * slice_idx) +slice_offset))) {
  36822                                continue;
  36823                            }
  36824                        }
  36825                    }
  36826 
  36827                    _field_extract((uint32 *)efp_tcam_entry, efp_key_type_offset, 4,
  36828                                   &entry_type);
  36829 
  36830                    /* Allocate memory for this entry */
  36831                    mem_sz = parts_count * sizeof (_field_entry_t);
  36832                    _FP_XGS3_ALLOC(f_ent, mem_sz, "field entry");
  36833                    if (f_ent == NULL) {
  36834                       rv = BCM_E_MEMORY;
  36835                       goto cleanup;
  36836                    }
  36837                    for (idx1 = 0; idx1 < _FP_POLICER_LEVEL_COUNT; idx1++) {
  36838                        f_ent->policer[idx1].pid = _FP_INVALID_INDEX;
  36839                    }
  36840                    sal_memset(&f_ent_wb_info, 0, sizeof(_field_entry_wb_info_t));
  36841                    f_ent_wb_info.sid = f_ent_wb_info.pid = -1;
  36842                    if (fc->l2warm) {
  36843                     /* Recover f_ent_oam_wb structure from here */
  36844                     /* Allocate f_ent_oam_wb structure and pass it to
  36845                      * corresponding function */
  36846                     if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_11) {
  36847                         _FP_XGS3_ALLOC(f_ent_oam_wb, sizeof (_field_entry_oam_wb_t),
  36848                                 "Field Entry Warmboot");
  36849                         if (f_ent_oam_wb == NULL) {
  36850                             sal_free (f_ent);
  36851                             rv = BCM_E_MEMORY;
  36852                             goto cleanup;
  36853                         }
  36854                     }
  36855                     f_ent_wb_info.f_ent_oam_wb = f_ent_oam_wb;
  36856 
  36857                     if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  36858                        action_bmp.w = NULL;
  36859                        _FP_XGS3_ALLOC(action_bmp.w,
  36860                             SHR_BITALLOCSIZE(_bcmFieldActionNoParamCount),
  36861                             "Action No Param Bitmap");
  36862                        if (action_bmp.w == NULL) {
  36863                           rv = BCM_E_MEMORY;
  36864                           sal_free(f_ent);
  36865                           goto cleanup;
  36866                        }
  36867                     }
  36868                     f_ent_wb_info.action_bmp = &action_bmp;
  36869 
  36870                     /* Recover f_ent_policer_wb structure from here */
  36871                     /* Allocate f_ent_policer_wb structure and pass it to
  36872                      * corresponding function */
  36873                     if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_17) {
  36874                         _FP_XGS3_ALLOC(f_ent_policer_wb, sizeof (_field_entry_policer_wb_t),
  36875                                 "Field Entry Warmboot");
  36876                         if (f_ent_policer_wb == NULL) {
  36877                             rv = BCM_E_MEMORY;
  36878                             sal_free (f_ent);
  36879                             goto cleanup;
  36880                         }
  36881                     }
  36882                     f_ent_wb_info.f_ent_policer_wb = f_ent_policer_wb;
  36883                     rv = _field_trx_entry_info_retrieve(unit,
  36884                                                         fc,
  36885                                                         stage_fc,
  36886                                                         0,
  36887                                                         &prev_prio,
  36888                                                         &f_ent_wb_info);
  36889                     
  36890                       if (BCM_FAILURE(rv)) {
  36891                           _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  36892                           sal_free(f_ent);
  36893                           goto cleanup;
  36894                       }
  36895                    } else {
  36896                       _bcm_field_last_alloc_eid_incr(unit);
  36897                    }
  36898 
  36899                    switch(efp_slice_mode) {
  36900                       case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2:
  36901                           f_ent->efp_key_match_type = 1;
  36902                           break;
  36903                       case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3:
  36904                           if (fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY1) {
  36905                               if (KEY_TYPE_IPv4_SINGLE == entry_type) {
  36906                                   f_ent->efp_key_match_type = 0;
  36907                               } else {
  36908                                   f_ent->efp_key_match_type = 1;
  36909                               }
  36910                           } else if (fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY5) {
  36911                               if (KEY_TYPE_FCOE_SINGLE == entry_type) {
  36912                                   f_ent->efp_key_match_type = 0;
  36913                               } else {
  36914                                   f_ent->efp_key_match_type = 1;
  36915                               }
  36916                           } else {
  36917                               if (KEY_TYPE_IPv6_SINGLE == entry_type) {
  36918                                   f_ent->efp_key_match_type = 0;
  36919                               } else {
  36920                                   f_ent->efp_key_match_type = 1;
  36921                               }
  36922                           }
  36923                           break;
  36924                       case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY:
  36925                           if (KEY_TYPE_IPv4_SINGLE == entry_type) {
  36926                               f_ent->efp_key_match_type = 0;
  36927                           } else {
  36928                               f_ent->efp_key_match_type = 1;
  36929                           }
  36930                           break;
  36931                       case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE:
  36932                           if ((fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY1) &&
  36933                               (fg->sel_codes[1].fpf3 == _BCM_FIELD_EFP_KEY4)) {
  36934                               if (KEY_TYPE_IPv4_L2_L3_DOUBLE == entry_type) {
  36935                                   f_ent->efp_key_match_type = 0;
  36936                                   (f_ent+1)->efp_key_match_type = 0;
  36937                               } else {
  36938                                   f_ent->efp_key_match_type = 1;
  36939                                   (f_ent+1)->efp_key_match_type = 1;
  36940                               }
  36941                           } else if ((fg->sel_codes[0].fpf3 ==
  36942                                      _BCM_FIELD_EFP_KEY3) &&
  36943                                      (fg->sel_codes[1].fpf3 ==
  36944                                       _BCM_FIELD_EFP_KEY2)) {
  36945                               if (KEY_TYPE_IPv6_DOUBLE == entry_type) {
  36946                                   f_ent->efp_key_match_type = 0;
  36947                                   (f_ent+1)->efp_key_match_type = 0;
  36948                               } else {
  36949                                   f_ent->efp_key_match_type = 1;
  36950                                   (f_ent+1)->efp_key_match_type = 1;
  36951                               }
  36952                           } else {
  36953                               f_ent->efp_key_match_type = 1;
  36954                               (f_ent+1)->efp_key_match_type = 1;
  36955                           }
  36956                           break;
  36957                       case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY:
  36958                           if ((fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY6) &&
  36959                               (fg->sel_codes[1].fpf3 == _BCM_FIELD_EFP_KEY4)) {
  36960                               if (KEY_TYPE_HIGIG_DOUBLE == entry_type) {
  36961                                   f_ent->efp_key_match_type = 0;
  36962                                   (f_ent+1)->efp_key_match_type = 0;
  36963                               } else {
  36964                                   f_ent->efp_key_match_type = 1;
  36965                                   (f_ent+1)->efp_key_match_type = 1;
  36966                               }
  36967                           } else if ((fg->sel_codes[0].fpf3 ==
  36968                                       _BCM_FIELD_EFP_KEY7) &&
  36969                                      (fg->sel_codes[1].fpf3 ==
  36970                                       _BCM_FIELD_EFP_KEY4)) {
  36971                               if (KEY_TYPE_LOOPBACK_DOUBLE == entry_type) {
  36972                                   f_ent->efp_key_match_type = 0;
  36973                                   (f_ent+1)->efp_key_match_type = 0;
  36974                               } else {
  36975                                   f_ent->efp_key_match_type = 1;
  36976                                   (f_ent+1)->efp_key_match_type = 1;
  36977                               }
  36978                           } else {
  36979                               f_ent->efp_key_match_type = 1;
  36980                               (f_ent+1)->efp_key_match_type = 1;
  36981                           }
  36982                           break;
  36983                       case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6:
  36984                           if (KEY_TYPE_IPv4_IPv6_DOUBLE == entry_type) {
  36985                               f_ent->efp_key_match_type = 0;
  36986                               (f_ent+1)->efp_key_match_type = 0;
  36987                           } else {
  36988                               f_ent->efp_key_match_type = 1;
  36989                               (f_ent+1)->efp_key_match_type = 1;
  36990                           }
  36991                           break;
  36992                       default:
  36993                           rv = BCM_E_INTERNAL;
  36994                           _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  36995                           sal_free(f_ent);
  36996                           goto cleanup;
  36997                    }
  36998 
  36999                    pri_tcam_idx = idx + slice_ent_cnt * slice_idx;
  37000                    for (i = 0; i < parts_count; i++) {
  37001                       if (fc->l2warm) {
  37002                           f_ent[i].eid = f_ent_wb_info.eid;
  37003                           /* Set retrieved dvp_type and svp_type */
  37004                           f_ent[i].dvp_type = f_ent_wb_info.dvp_type[i];
  37005                           f_ent[i].svp_type = f_ent_wb_info.svp_type[i];
  37006                           f_ent[i].prio = f_ent_wb_info.prio;
  37007                       } else {
  37008                           f_ent[i].eid = _bcm_field_last_alloc_eid_get(unit);
  37009                       }
  37010                       f_ent[i].group = fg;
  37011 
  37012                       rv = _bcm_field_tcam_part_to_entry_flags(unit, i, fg,
  37013                                                              &f_ent[i].flags);
  37014                       if (BCM_FAILURE(rv)) {
  37015                           _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37016                           sal_free(f_ent);
  37017                           goto cleanup;
  37018                       }
  37019                       if (f_ent_wb_info.color_independent) {
  37020                           f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT;
  37021                       }
  37022                       rv = _bcm_field_entry_part_tcam_idx_get(unit, f_ent,
  37023                                                              pri_tcam_idx,
  37024                                                           i, &part_index);
  37025                       if (BCM_FAILURE(rv)) {
  37026                           _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37027                           sal_free(f_ent);
  37028                           goto cleanup;
  37029                       }
  37030                       if (f_ent_wb_info.color_independent) {
  37031                           f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT;
  37032                       }
  37033                       rv = _bcm_field_tcam_idx_to_slice_offset(unit, stage_fc,
  37034                                                                inst,
  37035                                                                part_index,
  37036                                                                &slice_number,
  37037                                                   (int *)&f_ent[i].slice_idx);
  37038                       if (BCM_FAILURE(rv)) {
  37039                           _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37040                           sal_free(f_ent);
  37041                           goto cleanup;
  37042                       }
  37043                       f_ent[i].fs = stage_fc->slices[inst] + slice_number;
  37044                       if (0 == (f_ent[i].flags & _FP_ENTRY_SECOND_HALF)) {
  37045                           /* Decrement slice free entry count for primary
  37046                              entries. */
  37047                           f_ent[i].fs->free_count--;
  37048                       }
  37049 
  37050                       f_ent[i].fs->hw_ent_count++;
  37051 
  37052                       /* Assign entry to a slice */
  37053                       f_ent[i].fs->entries[f_ent[i].slice_idx] = f_ent + i;
  37054                       f_ent[i].flags |= _FP_ENTRY_INSTALLED;
  37055 
  37056                       if (soc_mem_field32_get(unit, efp_tcam,
  37057                           efp_tcam_entry, VALIDf) == tcam_valid_val) {
  37058                           f_ent[i].flags |= _FP_ENTRY_ENABLED;
  37059                       } else {
  37060                           if ((fc->l2warm) && (i != 0) &&
  37061                               ((fc->wb_recovered_version) >=
  37062                               BCM_FIELD_WB_VERSION_1_27) &&
  37063                               ( _FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  37064                               pri_tcam_idx + slice_offset) )) {
  37065 
  37066                               f_ent[i].flags |= _FP_ENTRY_ENABLED;
  37067                           }
  37068                       }
  37069 
  37070                       /* Get the actions associated with this entry part */
  37071                       efp_policy_entry = soc_mem_table_idx_to_pointer
  37072                                               (unit, efp_policy_table,
  37073                                                efp_policy_table_entry_t *,
  37074                                                efp_policy_pipe_buf[instance],
  37075                                                part_index);
  37076                       rv = _field_tr2_actions_recover(unit,
  37077                                                     efp_policy_table,
  37078                                                     (uint32 *) efp_policy_entry,
  37079                                                     f_ent,
  37080                                                     i,
  37081                                                     &f_ent_wb_info);
  37082                       if (BCM_FAILURE(rv)) {
  37083                           _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37084                           sal_free(f_ent);
  37085                           goto cleanup;
  37086                       }
  37087                       if (action_bmp.w != NULL) {
  37088                         _FP_ACTION_BMP_FREE(action_bmp);
  37089                         action_bmp.w = NULL;
  37090                       }
  37091                   }
  37092                   /* Set action stat flags */
  37093                   fa = f_ent->actions;
  37094                   while (fa != NULL) {
  37095                         rv = _bcm_field_action_stat_flag_update(unit, f_ent,
  37096                                                                 fa, TRUE);
  37097                         if (rv < 0) {
  37098                             _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37099                             sal_free(f_ent);
  37100                             goto cleanup;
  37101                         }
  37102                         fa = fa->next;
  37103                   }
  37104                   /* Add to the group */
  37105                   rv = _field_group_entry_add(unit, fg, f_ent);
  37106                   if (BCM_FAILURE(rv)) {
  37107                       _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37108                       sal_free(f_ent);
  37109                       goto cleanup;
  37110                   }
  37111                   f_ent = NULL;
  37112 
  37113                   /* Entry has been added to group,
  37114                    * so free f_ent_oam_wb structure */
  37115                   _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37116                   if (f_ent_policer_wb != NULL) {
  37117                       sal_free(f_ent_policer_wb);
  37118                       f_ent_policer_wb = NULL;
  37119                   }
  37120 
  37121                }
  37122            }
  37123 
  37124            /* Free up the temporary slice group info */
  37125            if (fc->l2warm) {
  37126               _field_scache_slice_group_free(unit, fc, slice_idx);
  37127            }
  37128            LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  37129                "# Done reading for inst[%d] slice[%d] byte @ %d\n\r"),
  37130                inst, slice_idx, fc->scache_pos));
  37131        }
  37132        LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  37133                "## Done reading for inst[%d] byte @ s_pos=%d s_pos1=%d\n\r"),
  37134                inst, fc->scache_pos, fc->scache_pos1));
  37135     }
  37136 
  37137     /* Iterate over the instances */
  37138     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  37139        if (!(fc->pipe_map & (1 << inst))) {
  37140             continue;
  37141        }
  37142        mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  37143                    _FP_GLOBAL_INST : inst;
  37144        instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  37145                    _FP_MAX_NUM_PIPES : inst;
  37146        slice_offset = inst * slice_size;
  37147 
  37148        rv = _bcm_field_reg_instance_get(unit,
  37149                                         EFP_SLICE_CONTROLr,
  37150                                         mem_inst, &efp_slice_control_reg);
  37151        if (BCM_FAILURE(rv)) {
  37152            goto cleanup;
  37153        }
  37154        rv = _bcm_field_mem_instance_get(unit, EFP_TCAMm,
  37155                                         mem_inst, &efp_tcam);
  37156        if (BCM_FAILURE(rv)) {
  37157            goto cleanup;
  37158        }
  37159        rv = _bcm_field_mem_instance_get(unit,
  37160                                         EFP_POLICY_TABLEm,
  37161                                         mem_inst,
  37162                                         &efp_policy_table);
  37163        if (BCM_FAILURE(rv)) {
  37164            goto cleanup;
  37165        }
  37166 
  37167        if ((rv = soc_reg32_get(unit, efp_slice_control_reg,
  37168                                REG_PORT_ANY, 0, &rval)) < 0) {
  37169            goto cleanup;
  37170        }
  37171        /* Now go over the expanded slices */
  37172        for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) {
  37173           if (!expanded[inst][slice_idx]) {
  37174               continue;
  37175           }
  37176           LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  37177             "# inst[%d] slice[%d] expanded[%d][%d]=[%d] byte @ %d\n\r"), inst,
  37178             slice_idx, inst, slice_idx, expanded[inst][slice_idx],
  37179             fc->scache_pos));
  37180 
  37181           /* Ignore secondary slice in paired mode */
  37182           efp_slice_mode = soc_reg_field_get(unit,
  37183                                              efp_slice_control_reg,
  37184                                              rval,
  37185                                              _th_efp_slice_mode[slice_idx][0]);
  37186           if (((efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE) ||
  37187               (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY) ||
  37188               (efp_slice_mode == _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6)) &&
  37189               (slice_idx % 2)) {
  37190               continue;
  37191           }
  37192           /* Skip if slice has no valid entries */
  37193           fs = stage_fc->slices[inst] + slice_idx;
  37194           slice_ent_cnt = fs->entry_count;
  37195           for (idx = 0; idx < slice_ent_cnt; idx++) {
  37196               if (_bcm_field_slice_offset_to_tcam_idx(unit, stage_fc, inst,
  37197                              slice_idx, idx, &phys_tcam_idx) != BCM_E_NONE) {
  37198                   rv = BCM_E_INTERNAL;
  37199                   goto cleanup;
  37200               }
  37201               efp_tcam_entry = soc_mem_table_idx_to_pointer(unit,
  37202                                efp_tcam, efp_tcam_entry_t *,
  37203                            efp_tcam_pipe_buf[instance], phys_tcam_idx);
  37204               if (soc_mem_field32_get(unit, efp_tcam,
  37205                                       efp_tcam_entry, VALIDf) != 0) {
  37206                   break;
  37207               } else {
  37208                   if ((fc->l2warm) &&
  37209                      ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_27)
  37210                      && (_FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  37211                      phys_tcam_idx + slice_offset))) {
  37212                       break;
  37213                   }
  37214               }
  37215           }
  37216           if (idx == slice_ent_cnt) {
  37217               continue;
  37218           }
  37219           /* If Level 2, retrieve the GIDs in this slice */
  37220           if (fc->l2warm) {
  37221               rv = _field_trx_scache_slice_group_recover(unit,
  37222                                                          fc,
  37223                                                          inst,
  37224                                                          slice_idx,
  37225                                                          &multigroup,
  37226                                                          stage_fc,
  37227                                                          0);;
  37228               if (BCM_FAILURE(rv) && (rv != BCM_E_NOT_FOUND)) {
  37229                   fc->l2warm = 0;
  37230                   goto cleanup;
  37231               }
  37232               if (rv == BCM_E_NOT_FOUND) {
  37233                   rv = BCM_E_NONE;
  37234                   continue;
  37235               }
  37236           }
  37237           /* Now find the master slice for this virtual group */
  37238           vslice_idx = _field_physical_to_virtual(unit, inst, slice_idx,
  37239                                                   stage_fc);
  37240           if (vslice_idx < 0) {
  37241               rv = BCM_E_INTERNAL;
  37242               goto cleanup;
  37243           }
  37244 
  37245           if (fc->l2warm && ((fc->wb_recovered_version)
  37246               >=BCM_FIELD_WB_VERSION_1_8)) {
  37247               master_slice = slice_master_idx[inst][slice_idx];
  37248           } else {
  37249               max = -1;
  37250               for (i = 0; i < stage_fc->tcam_slices; i++) {
  37251                  if ((stage_fc->vmap[inst][0][vslice_idx].virtual_group ==
  37252                       stage_fc->vmap[inst][0][i].virtual_group)
  37253                       && (i != vslice_idx)) {
  37254                      if (i > max) {
  37255                         max = i;
  37256                      }
  37257                  }
  37258               }
  37259               if (max < 0) {
  37260                  rv = BCM_E_INTERNAL;
  37261                  goto cleanup;
  37262               }
  37263 
  37264               master_slice = stage_fc->vmap[inst][0][max].vmap_key;
  37265           }
  37266           /* See which group is in this slice - can be only one */
  37267           fg = fc->groups;
  37268           while (fg != NULL) {
  37269               /* Check if group is in this slice */
  37270               fs = &fg->slices[0];
  37271               if ((fg->instance == inst) &&
  37272                   (fg->stage_id == stage_fc->stage_id) &&
  37273                   (fs->slice_number == master_slice)) {
  37274                   break;
  37275               }
  37276               fg = fg->next;
  37277           }
  37278           if (fg == NULL) {
  37279               rv = BCM_E_INTERNAL;
  37280               goto cleanup;
  37281           }
  37282 
  37283           old_physical_slice = fs->slice_number;
  37284 
  37285           /* Set up the new physical slice parameters in Software */
  37286           for(part_index = parts_count - 1; part_index >= 0; part_index--) {
  37287               /* Get entry flags. */
  37288               rv = _bcm_field_tcam_part_to_entry_flags(unit, part_index, fg,
  37289                                                        &entry_flags);
  37290 
  37291               if (BCM_FAILURE(rv)) {
  37292                   goto cleanup;
  37293               }
  37294               /* Get slice id for entry part */
  37295               rv = _bcm_field_tcam_part_to_slice_number(unit, part_index,
  37296                                                         fg, &slice_num);
  37297               if (BCM_FAILURE(rv)) {
  37298                   goto cleanup;
  37299               }
  37300 
  37301               /* Get slice pointer. */
  37302               fs = stage_fc->slices[inst] + slice_idx + slice_num;
  37303 
  37304               if (0 == (entry_flags & _FP_ENTRY_SECOND_HALF)) {
  37305                  /*
  37306                   * Set per slice configuration &  number of free entries in the
  37307                   * slice.
  37308                   */
  37309                   fs->free_count = fs->entry_count;
  37310                   if (fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) {
  37311                       fs->free_count >>= 1;
  37312                   }
  37313                   /* Set group flags in in slice.*/
  37314                   fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK;
  37315 
  37316                   /* Add slice to slices linked list . */
  37317                   fs_temp = stage_fc->slices[inst] +
  37318                             old_physical_slice + slice_num;
  37319                   /* To handle more than one auto expanded slice in a group */
  37320                   while (fs_temp->next != NULL) {
  37321                       fs_temp = fs_temp->next;
  37322                   }
  37323                   fs_temp->next = fs;
  37324                   fs->prev = fs_temp;
  37325               }
  37326           }
  37327 
  37328           fs = stage_fc->slices[inst] + slice_idx;
  37329           fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK;
  37330 
  37331           prev_prio = -1;
  37332           SOC_PBMP_CLEAR(all_pbmp);
  37333           if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  37334               SOC_PBMP_ASSIGN(all_pbmp, PBMP_PORT_ALL(unit));
  37335               SOC_PBMP_OR(all_pbmp, PBMP_CMIC(unit));
  37336           } else {
  37337               SOC_PBMP_ASSIGN(all_pbmp, PBMP_PIPE(unit, fg->instance));
  37338               SOC_PBMP_REMOVE(all_pbmp, PBMP_LB(unit));
  37339           }
  37340           SOC_PBMP_ASSIGN(fg->pbmp, all_pbmp);
  37341           BCM_PBMP_OR(fs->pbmp, fg->pbmp);
  37342           if (fg->flags & _FP_GROUP_SPAN_DOUBLE_SLICE) {
  37343               BCM_PBMP_OR((fs + 1)->pbmp, fg->pbmp);
  37344               (fs + 1)->group_flags = fs->group_flags;
  37345           }
  37346 
  37347           for (idx = 0; idx < slice_ent_cnt; idx++) {
  37348               if (_bcm_field_slice_offset_to_tcam_idx(unit, stage_fc,
  37349                   inst, slice_idx, idx, &phys_tcam_idx) != BCM_E_NONE) {
  37350                   rv = BCM_E_INTERNAL;
  37351                   goto cleanup;
  37352               }
  37353               efp_tcam_entry = soc_mem_table_idx_to_pointer(unit,
  37354                                   efp_tcam, efp_tcam_entry_t *,
  37355                              efp_tcam_pipe_buf[instance], phys_tcam_idx);
  37356               if (soc_mem_field32_get(unit, efp_tcam,
  37357                                       efp_tcam_entry, VALIDf) == 0) {
  37358                   if (!(fc->l2warm)) {
  37359                       continue;
  37360                   } else {
  37361                       if ((fc->wb_recovered_version) <
  37362                           BCM_FIELD_WB_VERSION_1_27) {
  37363                           continue;
  37364                       } else if (!(_FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  37365                                    phys_tcam_idx + slice_offset))) {
  37366                           continue;
  37367                       }
  37368                   }
  37369               }
  37370 
  37371               _field_extract((uint32 *)efp_tcam_entry, efp_key_type_offset, 4,
  37372                       &entry_type);
  37373 
  37374               /* Allocate memory for the entry */
  37375               rv = _bcm_field_entry_tcam_parts_count(unit, fg->stage_id,
  37376                                                      fg->flags, &parts_count);
  37377               if (BCM_FAILURE(rv)) {
  37378                   goto cleanup;
  37379               }
  37380               mem_sz = parts_count * sizeof (_field_entry_t);
  37381               _FP_XGS3_ALLOC(f_ent, mem_sz, "field entry");
  37382               if (f_ent == NULL) {
  37383                   rv = BCM_E_MEMORY;
  37384                   goto cleanup;
  37385               }
  37386 
  37387               for (idx1 = 0; idx1 < _FP_POLICER_LEVEL_COUNT; idx1++) {
  37388                    f_ent->policer[idx1].pid = _FP_INVALID_INDEX;
  37389               }
  37390 
  37391               sal_memset(&f_ent_wb_info, 0, sizeof(_field_entry_wb_info_t));
  37392               f_ent_wb_info.sid = f_ent_wb_info.pid = -1;
  37393               if (fc->l2warm) {
  37394                   /* Recover f_ent_oam_wb structure from here */
  37395                   /* Allocate f_ent_oam_wb structure and pass it to
  37396                     * corresponding function */
  37397                   if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_11) {
  37398                      _FP_XGS3_ALLOC(f_ent_oam_wb, sizeof (_field_entry_oam_wb_t),
  37399                             "Field Entry Warmboot");
  37400                      if (f_ent_oam_wb == NULL) {
  37401                         sal_free (f_ent);
  37402                         rv = BCM_E_MEMORY;
  37403                         goto cleanup;
  37404                      }
  37405                   }
  37406                   f_ent_wb_info.f_ent_oam_wb = f_ent_oam_wb;
  37407 
  37408                   if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  37409                       action_bmp.w = NULL;
  37410                       _FP_XGS3_ALLOC(action_bmp.w,
  37411                            SHR_BITALLOCSIZE(_bcmFieldActionNoParamCount),
  37412                            "Action No Param Bitmap");
  37413                       if (action_bmp.w == NULL) {
  37414                          rv = BCM_E_MEMORY;
  37415                          sal_free(f_ent);
  37416                          goto cleanup;
  37417                       }
  37418                   }
  37419                   f_ent_wb_info.action_bmp = &action_bmp;
  37420 
  37421                   /* Recover f_ent_policer_wb structure from here */
  37422                   /* Allocate f_ent_policer_wb structure and pass it to
  37423                    * corresponding function */
  37424                   if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_17) {
  37425                       _FP_XGS3_ALLOC(f_ent_policer_wb, sizeof (_field_entry_policer_wb_t),
  37426                               "Field Entry Warmboot");
  37427                       if (f_ent_policer_wb == NULL) {
  37428                           rv = BCM_E_MEMORY;
  37429                           sal_free (f_ent);
  37430                           goto cleanup;
  37431                       }
  37432                   }
  37433                   f_ent_wb_info.f_ent_policer_wb = f_ent_policer_wb;
  37434 
  37435                   rv = _field_trx_entry_info_retrieve(unit,
  37436                          fc, stage_fc, multigroup, &prev_prio, &f_ent_wb_info);
  37437                   
  37438                   if (BCM_FAILURE(rv)) {
  37439                       _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37440                       sal_free(f_ent);
  37441                       goto cleanup;
  37442                   }
  37443               } else {
  37444                   _bcm_field_last_alloc_eid_incr(unit);
  37445               }
  37446 
  37447               switch(efp_slice_mode) {
  37448                   case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L2:
  37449                       f_ent->efp_key_match_type = 1;
  37450                       break;
  37451                   case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3:
  37452                       if (fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY1) {
  37453                           if (KEY_TYPE_IPv4_SINGLE == entry_type) {
  37454                               f_ent->efp_key_match_type = 0;
  37455                           } else {
  37456                               f_ent->efp_key_match_type = 1;
  37457                           }
  37458                       } else if (fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY5) {
  37459                           if (KEY_TYPE_FCOE_SINGLE == entry_type) {
  37460                               f_ent->efp_key_match_type = 0;
  37461                           } else {
  37462                               f_ent->efp_key_match_type = 1;
  37463                           }
  37464                       } else {
  37465                           if (KEY_TYPE_IPv6_SINGLE == entry_type) {
  37466                               f_ent->efp_key_match_type = 0;
  37467                           } else {
  37468                               f_ent->efp_key_match_type = 1;
  37469                           }
  37470                       }
  37471                       break;
  37472                   case _BCM_FIELD_EGRESS_SLICE_MODE_SINGLE_L3_ANY:
  37473                       if (KEY_TYPE_IPv4_SINGLE == entry_type) {
  37474                           f_ent->efp_key_match_type = 0;
  37475                       } else {
  37476                           f_ent->efp_key_match_type = 1;
  37477                       }
  37478                       break;
  37479                   case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE:
  37480                       if ((fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY1) &&
  37481                               (fg->sel_codes[1].fpf3 == _BCM_FIELD_EFP_KEY4)) {
  37482                           if (KEY_TYPE_IPv4_L2_L3_DOUBLE == entry_type) {
  37483                               f_ent->efp_key_match_type = 0;
  37484                               (f_ent+1)->efp_key_match_type = 0;
  37485                           } else {
  37486                               f_ent->efp_key_match_type = 1;
  37487                               (f_ent+1)->efp_key_match_type = 1;
  37488                           }
  37489                       } else if ((fg->sel_codes[0].fpf3 ==
  37490                                   _BCM_FIELD_EFP_KEY3) &&
  37491                               (fg->sel_codes[1].fpf3 ==
  37492                                _BCM_FIELD_EFP_KEY2)) {
  37493                           if (KEY_TYPE_IPv6_DOUBLE == entry_type) {
  37494                               f_ent->efp_key_match_type = 0;
  37495                               (f_ent+1)->efp_key_match_type = 0;
  37496                           } else {
  37497                               f_ent->efp_key_match_type = 1;
  37498                               (f_ent+1)->efp_key_match_type = 1;
  37499                           }
  37500                       } else {
  37501                           f_ent->efp_key_match_type = 1;
  37502                           (f_ent+1)->efp_key_match_type = 1;
  37503                       }
  37504                       break;
  37505                   case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_ANY:
  37506                       if ((fg->sel_codes[0].fpf3 == _BCM_FIELD_EFP_KEY6) &&
  37507                               (fg->sel_codes[1].fpf3 == _BCM_FIELD_EFP_KEY4)) {
  37508                           if (KEY_TYPE_HIGIG_DOUBLE == entry_type) {
  37509                               f_ent->efp_key_match_type = 0;
  37510                               (f_ent+1)->efp_key_match_type = 0;
  37511                           } else {
  37512                               f_ent->efp_key_match_type = 1;
  37513                               (f_ent+1)->efp_key_match_type = 1;
  37514                           }
  37515                       } else if ((fg->sel_codes[0].fpf3 ==
  37516                                   _BCM_FIELD_EFP_KEY7) &&
  37517                               (fg->sel_codes[1].fpf3 ==
  37518                                _BCM_FIELD_EFP_KEY4)) {
  37519                           if (KEY_TYPE_LOOPBACK_DOUBLE == entry_type) {
  37520                               f_ent->efp_key_match_type = 0;
  37521                               (f_ent+1)->efp_key_match_type = 0;
  37522                           } else {
  37523                               f_ent->efp_key_match_type = 1;
  37524                               (f_ent+1)->efp_key_match_type = 1;
  37525                           }
  37526                       } else {
  37527                           f_ent->efp_key_match_type = 1;
  37528                           (f_ent+1)->efp_key_match_type = 1;
  37529                       }
  37530                       break;
  37531                   case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_L3_V6:
  37532                       if (KEY_TYPE_IPv4_IPv6_DOUBLE == entry_type) {
  37533                           f_ent->efp_key_match_type = 0;
  37534                           (f_ent+1)->efp_key_match_type = 0;
  37535                       } else {
  37536                           f_ent->efp_key_match_type = 1;
  37537                           (f_ent+1)->efp_key_match_type = 1;
  37538                       }
  37539                       break;
  37540                  case _BCM_FIELD_EGRESS_SLICE_MODE_DOUBLE_FCOE:
  37541                      if ((_BCM_FIELD_EFP_KEY5 == fg->sel_codes[0].fpf3)
  37542                              && (_BCM_FIELD_EFP_KEY4 == fg->sel_codes[1].fpf3)
  37543                              && (KEY_TYPE_FCOE_DOUBLE == entry_type)) {
  37544                          f_ent->efp_key_match_type = 0;
  37545                          (f_ent+1)->efp_key_match_type = 0;
  37546                      } else {
  37547                          f_ent->efp_key_match_type = 1;
  37548                          (f_ent+1)->efp_key_match_type = 1;
  37549                      }
  37550                      break;
  37551                   default:
  37552                       rv = BCM_E_INTERNAL;
  37553                       _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37554                       sal_free(f_ent);
  37555                       goto cleanup;
  37556               }
  37557 
  37558               pri_tcam_idx = phys_tcam_idx;
  37559               for (i = 0; i < parts_count; i++) {
  37560                   if (fc->l2warm) {
  37561                       /* Use retrieved EID */
  37562                       f_ent[i].eid = f_ent_wb_info.eid;
  37563                       /* Set retrieved dvp_type and svp_type */
  37564                       f_ent[i].dvp_type = f_ent_wb_info.dvp_type[i];
  37565                       f_ent[i].svp_type = f_ent_wb_info.svp_type[i];
  37566                       f_ent[i].prio = f_ent_wb_info.prio;
  37567                   } else {
  37568                       f_ent[i].eid = _bcm_field_last_alloc_eid_get(unit);
  37569                   }
  37570                   f_ent[i].group = fg;
  37571 
  37572                   rv = _bcm_field_tcam_part_to_entry_flags(unit, i, fg,
  37573                                                            &f_ent[i].flags);
  37574                   if (BCM_FAILURE(rv)) {
  37575                       _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37576                       sal_free(f_ent);
  37577                       goto cleanup;
  37578                   }
  37579 
  37580                   rv = _bcm_field_entry_part_tcam_idx_get(unit,
  37581                            f_ent, pri_tcam_idx, i, &part_index);
  37582                   if (BCM_FAILURE(rv)) {
  37583                       _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37584                       sal_free(f_ent);
  37585                       goto cleanup;
  37586                   }
  37587                   if (f_ent_wb_info.color_independent) {
  37588                       f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT;
  37589                   }
  37590                   rv = _bcm_field_tcam_idx_to_slice_offset(unit,
  37591                            stage_fc, inst, part_index, &slice_number,
  37592                            (int *)&f_ent[i].slice_idx);
  37593                   if (BCM_FAILURE(rv)) {
  37594                       _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37595                       sal_free(f_ent);
  37596                       goto cleanup;
  37597                   }
  37598                   f_ent[i].fs = stage_fc->slices[inst] + slice_number;
  37599                   if (0 == (f_ent[i].flags & _FP_ENTRY_SECOND_HALF)) {
  37600                       /* Decrement slice free entry count for primary
  37601                          entries. */
  37602                       f_ent[i].fs->free_count--;
  37603                   }
  37604 
  37605                   f_ent[i].fs->hw_ent_count++;
  37606 
  37607                   /* Assign entry to a slice */
  37608                   f_ent[i].fs->entries[f_ent[i].slice_idx] = f_ent + i;
  37609                   f_ent[i].flags |= _FP_ENTRY_INSTALLED;
  37610 
  37611                   if (soc_mem_field32_get(unit, efp_tcam,
  37612                                       efp_tcam_entry, VALIDf) == tcam_valid_val) {
  37613                       f_ent[i].flags |= _FP_ENTRY_ENABLED;
  37614                   } else {
  37615                       if ((fc->l2warm) && (i != 0) &&
  37616                           ((fc->wb_recovered_version) >=
  37617                           BCM_FIELD_WB_VERSION_1_27) &&
  37618                           ( _FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  37619                           pri_tcam_idx + slice_offset) )) {
  37620 
  37621                           f_ent[i].flags |= _FP_ENTRY_ENABLED;
  37622                       }
  37623                   }
  37624 
  37625 
  37626                   /* Get the actions associated with this part of the entry */
  37627                   efp_policy_entry = soc_mem_table_idx_to_pointer(
  37628                                             unit, efp_policy_table,
  37629                                             efp_policy_table_entry_t *,
  37630                                             efp_policy_pipe_buf[instance],
  37631                                             part_index);
  37632                   rv = _field_tr2_actions_recover(unit,
  37633                                             efp_policy_table,
  37634                                             (uint32 *) efp_policy_entry,
  37635                                             f_ent, i, &f_ent_wb_info);
  37636                   if (BCM_FAILURE(rv)) {
  37637                       _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37638                       sal_free(f_ent);
  37639                       goto cleanup;
  37640                   }
  37641                   if (action_bmp.w != NULL) {
  37642                       _FP_ACTION_BMP_FREE(action_bmp);
  37643                       action_bmp.w = NULL;
  37644                   }
  37645               }
  37646               /* Set action stat flags */
  37647               fa = f_ent->actions;
  37648               while (fa != NULL) {
  37649                     rv = _bcm_field_action_stat_flag_update(unit, f_ent,
  37650                                                             fa, TRUE);
  37651                     if (rv < 0) {
  37652                         _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37653                         sal_free(f_ent);
  37654                         goto cleanup;
  37655                     }
  37656                     fa = fa->next;
  37657               }
  37658 
  37659               rv = _field_group_entry_add(unit, fg, f_ent);
  37660               if (BCM_FAILURE(rv)) {
  37661                   _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37662                   sal_free(f_ent);
  37663                   goto cleanup;
  37664               }
  37665               f_ent = NULL;
  37666 
  37667               /* Entry has been added to group,
  37668                * so free f_ent_oam_wb structure */
  37669               _field_entry_oam_wb_free (unit, &f_ent_oam_wb);
  37670               if (f_ent_policer_wb != NULL) {
  37671                   sal_free(f_ent_policer_wb);
  37672                   f_ent_policer_wb = NULL;
  37673               }
  37674 
  37675           }
  37676           /* Free up the temporary slice group info */
  37677           if (fc->l2warm) {
  37678               _field_scache_slice_group_free(unit, fc, slice_idx);
  37679           }
  37680           LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  37681            "# Expansion Done reading for inst[%d] slice[%d] byte @ %d\n\r"),
  37682            inst, slice_idx, fc->scache_pos));
  37683        }
  37684        LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  37685         "## Expansion Done reading for inst[%d] byte @ s_pos=%d s_pos1=%d\n\r"),
  37686         inst, fc->scache_pos, fc->scache_pos1));
  37687     }
  37688 
  37689     if (fc->l2warm) {
  37690 
  37691         /* Mark end of Slice Info */
  37692         if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  37693             fc->scache_pos++;
  37694         }
  37695 
  37696         if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  37697             if (stage_fc->stage_id == _BCM_FIELD_STAGE_EGRESS) {
  37698                 LOG_DEBUG(BSL_LS_BCM_FP,
  37699                         (BSL_META_U(unit,"Recovering hint Ids "
  37700                                     "from pos = %d\r\n"), fc->scache_pos));
  37701                  rv = _bcm_hints_scache_hintid_recover(unit, stage_fc,
  37702                              fc, &buf[fc->scache_pos]);
  37703                  if (BCM_FAILURE(rv)) {
  37704                      goto cleanup;
  37705                  }
  37706             }
  37707         }
  37708 
  37709         /* Group Slice Selectors */
  37710         if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  37711             rv = (_field_group_slice_selectors_recover(unit,
  37712                           &buf[fc->scache_pos], stage_fc->stage_id));
  37713             if (BCM_FAILURE(rv)) {
  37714                 goto cleanup;
  37715             }
  37716         }
  37717 
  37718         temp = 0;
  37719         temp |= buf[fc->scache_pos];
  37720         fc->scache_pos++;
  37721         temp |= buf[fc->scache_pos] << 8;
  37722         fc->scache_pos++;
  37723         temp |= buf[fc->scache_pos] << 16;
  37724         fc->scache_pos++;
  37725         temp |= buf[fc->scache_pos] << 24;
  37726         fc->scache_pos++;
  37727         if (temp != _FIELD_EFP_DATA_END) {
  37728            LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  37729                "%s(): Unable to find buf EFP_DATA_END [0x%x] @ byte %d.\n"),
  37730                __func__, temp, fc->scache_pos));
  37731             fc->l2warm = 0;
  37732             rv = BCM_E_INTERNAL;
  37733         }
  37734 
  37735         if (NULL != buf1) {
  37736             temp = 0;
  37737             temp |= buf1[fc->scache_pos1];
  37738             fc->scache_pos1++;
  37739             temp |= buf1[fc->scache_pos1] << 8;
  37740             fc->scache_pos1++;
  37741             temp |= buf1[fc->scache_pos1] << 16;
  37742             fc->scache_pos1++;
  37743             temp |= buf1[fc->scache_pos1] << 24;
  37744             fc->scache_pos1++;
  37745             if (temp != _FIELD_EFP_DATA_END) {
  37746                 fc->l2warm = 0;
  37747                 rv = BCM_E_INTERNAL;
  37748                 LOG_ERROR(BSL_LS_BCM_FP, (BSL_META_U(unit,
  37749                   "%s(): Unable to find buf1 EFP_DATA_END [0x%x] @ byte %d.\n"),
  37750                    __func__, temp, fc->scache_pos1));
  37751             }
  37752         }
  37753 
  37754     }
  37755 
  37756     if (BCM_SUCCESS(rv)) {
  37757         _field_group_slice_vmap_recovery(unit, fc, stage_fc);
  37758     }
  37759 
  37760     _field_tr2_stage_reinit_all_groups_cleanup(unit, fc,
  37761                                                _BCM_FIELD_STAGE_EGRESS,
  37762                                                NULL);
  37763 cleanup:
  37764     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  37765         if (!(fc->pipe_map & (1 << inst))) {
  37766 
  37767              continue;
  37768         }
  37769         instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  37770                    _FP_MAX_NUM_PIPES : inst;
  37771 
  37772         if (efp_tcam_pipe_buf[instance]) {
  37773            soc_cm_sfree(unit, efp_tcam_pipe_buf[instance]);
  37774         }
  37775         if (efp_policy_pipe_buf[instance]) {
  37776            soc_cm_sfree(unit, efp_policy_pipe_buf[instance]);
  37777         }
  37778     }
  37779     if (efp_tcam_buf) {
  37780        soc_cm_sfree(unit, efp_tcam_buf);
  37781     }
  37782     if (efp_policy_buf) {
  37783        soc_cm_sfree(unit, efp_policy_buf);
  37784     }
  37785     if (action_bmp.w != NULL) {
  37786        _FP_ACTION_BMP_FREE(action_bmp);
  37787        action_bmp.w = NULL;
  37788     }
  37789     if (f_ent_policer_wb != NULL) {
  37790         sal_free(f_ent_policer_wb);
  37791         f_ent_policer_wb = NULL;
  37792     }
  37793 
  37794     if (NULL != sliceidx_bmp.w) {
  37795         sal_free(sliceidx_bmp.w);
  37796         sliceidx_bmp.w = NULL;
  37797     }
  37798     return rv;
  37799 }
  37800 
  37801 /*
  37802  * Function:
  37803  *     _bcm_field_th_stage_lookup_reinit
  37804  *
  37805  * Purpose:
  37806  *     Reconstruct's VFP/Lookup stage groups and entries.
  37807  *
  37808  * Parameters:
  37809  *     unit             - (IN) BCM device number.
  37810  *     fc               - (IN) Device field control structure pointer.
  37811  *     stage_fc         - (IN) FP stage control info.
  37812  *
  37813  * Returns:
  37814  *     BCM_E_XXX
  37815  */
  37816 int
  37817 _bcm_field_th_stage_lookup_reinit(int unit,
  37818                                _field_control_t *fc,
  37819                                _field_stage_t *stage_fc)
  37820 {
  37821     int vslice_idx, max, master_slice;
  37822     int idx, idx1, slice_idx, index_min, index_max, ratio, rv = BCM_E_NONE;
  37823     int mem_sz, parts_count, slice_ent_cnt = 0;
  37824     int expanded[_FP_MAX_NUM_PIPES][4];
  37825                                   /* Expansion status of slices in (V/I/E)FP. */
  37826     int slice_master_idx[_FP_MAX_NUM_PIPES][4];
  37827                                   /* Expansion status of slices in (V/I/E)FP. */
  37828     int i, pri_tcam_idx, part_index, slice_number, prev_prio;
  37829     int paired, intraslice;
  37830     char *vfp_policy_buf = NULL; /* Buffer to read the VFP_POLICY table */
  37831     char *vfp_policy_pipe_buf[_FP_MAX_NUM_PIPES+1] = {NULL};
  37832                               /* Buffer to read VFP_POLICY table in all pipes */
  37833     uint8 *buf = fc->scache_ptr[_FIELD_SCACHE_PART_0];
  37834     uint8 *buf1 = fc->scache_ptr[_FIELD_SCACHE_PART_1];
  37835     uint32 rval, dbl_wide_key, dbl_wide_key_sec;
  37836     uint32 *vfp_tcam_buf = NULL; /* Buffer to read the VFP_TCAM table */
  37837     uint32 *vfp_tcam_pipe_buf[_FP_MAX_NUM_PIPES+1] = {NULL};
  37838                               /* Buffer to read VFP_TCAM table in all pipes */
  37839     uint32 vfp_key2 = 0;
  37840     uint32 temp;
  37841     uint64 vfp_key_1;
  37842     soc_field_t fld;
  37843     vfp_tcam_entry_t *vfp_tcam_entry;
  37844     vfp_policy_table_entry_t *vfp_policy_entry;
  37845     _field_hw_qual_info_t hw_sels;
  37846     _field_slice_t *fs;
  37847     _field_group_t *fg;
  37848     _field_entry_t *f_ent = NULL;
  37849     bcm_pbmp_t entry_pbmp, temp_pbmp;
  37850     uint8 old_physical_slice, slice_num;
  37851     uint32 entry_flags;
  37852     _field_slice_t *fs_temp = NULL;
  37853     int inst, mem_inst, instance;  /* Pipe Instance. */
  37854     uint8 valid_enable;
  37855     soc_field_t vfp_en_flds[4] = {SLICE_ENABLE_SLICE_0f,
  37856                                   SLICE_ENABLE_SLICE_1f,
  37857                                   SLICE_ENABLE_SLICE_2f,
  37858                                   SLICE_ENABLE_SLICE_3f};
  37859 
  37860     soc_reg_t vfp_control_1_reg;
  37861     soc_reg_t vfp_control_2_reg;
  37862     soc_reg_t vfp_slice_control_reg;
  37863     soc_mem_t vfp_tcam;
  37864     soc_mem_t vfp_policy_table;
  37865 
  37866     int size;
  37867     int slice_size;
  37868     _field_sliceidx_bmp_t sliceidx_bmp;
  37869     int slice_offset;
  37870 
  37871     /* VALIDf in VFP_TCAM on TH2 only has one bit */
  37872     int vfp_tcam_enabled;
  37873     _field_action_bmp_t action_bmp;
  37874     _field_entry_wb_info_t f_ent_wb_info;
  37875     sliceidx_bmp.w = NULL;
  37876     slice_size = 0;
  37877     slice_offset = 0;
  37878 #if defined(BCM_TOMAHAWK2_SUPPORT) || defined (BCM_TOMAHAWK3_SUPPORT)
  37879     if (soc_feature(unit, soc_feature_field_multi_pipe_enhanced) ||
  37880         SOC_IS_TOMAHAWK3(unit)) {
  37881         vfp_tcam_enabled = 1;
  37882     } else
  37883 #endif /* BCM_TOMAHAWK2_SUPPORT */
  37884     {
  37885         vfp_tcam_enabled = 3;
  37886     }
  37887 
  37888     /* Reset Action bitmap to NULL. */
  37889     action_bmp.w = NULL;
  37890     SOC_PBMP_CLEAR(entry_pbmp);
  37891     sal_memset(expanded, 0, 4 * _FP_MAX_NUM_PIPES * sizeof(int));
  37892     sal_memset(slice_master_idx, 0, 4 * _FP_MAX_NUM_PIPES * sizeof(int));
  37893 
  37894     /* Valid entry value */
  37895     if ((soc_feature(unit, soc_feature_td3_style_fp)) ||
  37896         (soc_feature(unit, soc_feature_th3_style_fp))) {
  37897         valid_enable = 1;
  37898     } else {
  37899         valid_enable = 3;
  37900     }
  37901 
  37902     if (fc->l2warm) {
  37903         rv = _field_scache_stage_hdr_chk(fc, _FIELD_VFP_DATA_START);
  37904         if (BCM_FAILURE(rv)) {
  37905             return (rv);
  37906         }
  37907 
  37908         if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_10) {
  37909            bcm_field_group_oper_mode_t oper_mode;
  37910 
  37911            /* Retrieve Stage Operational Mode. */
  37912            oper_mode = buf[fc->scache_pos];
  37913 
  37914            LOG_DEBUG(BSL_LS_BCM_FP, (BSL_META_U(unit,
  37915                  "%s(): Recovering oper_mode:%d @ byte %d...\n\r"),
  37916                   __func__, oper_mode, fc->scache_pos));
  37917 
  37918            fc->scache_pos++;
  37919 
  37920            if (stage_fc->oper_mode != oper_mode) {
  37921               /* Initialize the stage with the given operational mode. */
  37922               rv = _bcm_field_th_group_oper_mode_set(unit,
  37923                                                   bcmFieldQualifyStageLookup,
  37924                                                   oper_mode);
  37925               if (BCM_FAILURE(rv)) {
  37926                  return rv;
  37927               }
  37928 
  37929               rv = _field_stage_control_get(unit, _BCM_FIELD_STAGE_LOOKUP,
  37930                                          &stage_fc);
  37931               BCM_IF_ERROR_RETURN(rv);
  37932            }
  37933         }
  37934      }
  37935 
  37936     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  37937        if (!(fc->pipe_map & (1 << inst))) {
  37938             continue;
  37939        }
  37940        mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  37941                    _FP_GLOBAL_INST : inst;
  37942        instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  37943                    _FP_MAX_NUM_PIPES : inst;
  37944 
  37945        BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  37946                                                           VFP_KEY_CONTROL_1r,
  37947                                                           mem_inst,
  37948                                                           &vfp_control_1_reg));
  37949        BCM_IF_ERROR_RETURN(_bcm_field_reg_instance_get(unit,
  37950                                                           VFP_KEY_CONTROL_2r,
  37951                                                           mem_inst,
  37952                                                           &vfp_control_2_reg));
  37953 
  37954        BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit, VFP_TCAMm,
  37955                                                           mem_inst, &vfp_tcam));
  37956        BCM_IF_ERROR_RETURN(_bcm_field_mem_instance_get(unit,
  37957                                                           VFP_POLICY_TABLEm,
  37958                                                           mem_inst,
  37959                                                           &vfp_policy_table));
  37960 
  37961        /* DMA various tables */
  37962        vfp_tcam_buf = soc_cm_salloc(unit, sizeof(vfp_tcam_entry_t) *
  37963                        soc_mem_index_count(unit, vfp_tcam),
  37964                        "VFP TCAM buffer");
  37965        if (NULL == vfp_tcam_buf) {
  37966           rv = BCM_E_MEMORY;
  37967           goto cleanup;
  37968        }
  37969 
  37970        sal_memset(vfp_tcam_buf, 0, sizeof(vfp_tcam_entry_t) *
  37971                          soc_mem_index_count(unit, vfp_tcam));
  37972        index_min = soc_mem_index_min(unit, vfp_tcam);
  37973        index_max = soc_mem_index_max(unit, vfp_tcam);
  37974 
  37975        fs = stage_fc->slices[inst];
  37976 
  37977        if (stage_fc->flags & _FP_STAGE_HALF_SLICE) {
  37978            slice_ent_cnt = fs->entry_count * 2;
  37979            /* DMA in chunks */
  37980            for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) {
  37981                fs = stage_fc->slices[inst] + slice_idx;
  37982                if ((rv = soc_mem_read_range(unit, vfp_tcam,
  37983                                 MEM_BLOCK_ALL, slice_idx * slice_ent_cnt,
  37984                      slice_idx * slice_ent_cnt + fs->entry_count / 2 - 1,
  37985                                vfp_tcam_buf + slice_idx * slice_ent_cnt *
  37986                          soc_mem_entry_words(unit, vfp_tcam))) < 0) {
  37987                    goto cleanup;
  37988                }
  37989 
  37990                if ((rv = soc_mem_read_range(unit, vfp_tcam,
  37991                          MEM_BLOCK_ALL,
  37992                          slice_idx * slice_ent_cnt + fs->entry_count,
  37993                          slice_idx * slice_ent_cnt + fs->entry_count +
  37994                          fs->entry_count / 2 - 1, vfp_tcam_buf +
  37995                         (slice_idx * slice_ent_cnt + fs->entry_count)
  37996                        * soc_mem_entry_words(unit, vfp_tcam))) < 0 ) {
  37997                    goto cleanup;
  37998                }
  37999            }
  38000        } else {
  38001            slice_ent_cnt = fs->entry_count;
  38002            if ((rv = soc_mem_read_range(unit, vfp_tcam, MEM_BLOCK_ALL,
  38003                                     index_min, index_max, vfp_tcam_buf)) < 0 ) {
  38004                 goto cleanup;
  38005            }
  38006        }
  38007 
  38008        vfp_policy_buf = soc_cm_salloc(unit,
  38009                         SOC_MEM_TABLE_BYTES(unit, vfp_policy_table),
  38010                         "VFP POLICY TABLE buffer");
  38011        if (NULL == vfp_policy_buf) {
  38012           rv = BCM_E_MEMORY;
  38013           goto cleanup;
  38014        }
  38015        sal_memset(vfp_policy_buf, 0, SOC_MEM_TABLE_BYTES
  38016                                     (unit, vfp_policy_table));
  38017        index_min = soc_mem_index_min(unit, vfp_policy_table);
  38018        index_max = soc_mem_index_max(unit, vfp_policy_table);
  38019        if ((rv = soc_mem_read_range(unit, vfp_policy_table,
  38020                                     MEM_BLOCK_ALL, index_min, index_max,
  38021                                     vfp_policy_buf)) < 0 ) {
  38022              goto cleanup;
  38023        }
  38024 
  38025        vfp_tcam_pipe_buf[instance] = vfp_tcam_buf;
  38026        vfp_policy_pipe_buf[instance] = vfp_policy_buf;
  38027        vfp_tcam_buf = NULL;
  38028        vfp_policy_buf = NULL;
  38029     }
  38030 
  38031     /* Get slice expansion status and virtual map for all the instances */
  38032     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  38033        if (!(fc->pipe_map & (1 << inst))) {
  38034             continue;
  38035        }
  38036        if ((rv = _field_th_slice_expanded_status_get(unit, inst, fc, stage_fc,
  38037                                  expanded[inst], slice_master_idx[inst])) < 0) {
  38038             goto cleanup;
  38039        }
  38040     }
  38041 
  38042     slice_offset = 0;
  38043     if ((fc->l2warm) &&
  38044         ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_27)) {
  38045         /* get the total slice size*/
  38046         slice_size = stage_fc->tcam_sz;
  38047         size = SHR_BITALLOCSIZE(slice_size * _FP_MAX_NUM_PIPES);
  38048         _FP_XGS3_ALLOC(sliceidx_bmp.w, size, "Sliceidx Bitmap");
  38049         if (NULL == sliceidx_bmp.w) {
  38050             rv = BCM_E_MEMORY;
  38051             goto cleanup;
  38052         }
  38053         sal_memcpy (sliceidx_bmp.w, &buf[fc->scache_pos], size);
  38054         fc->scache_pos += size;
  38055     }
  38056 
  38057 
  38058     /* Iterate over the instances. */
  38059     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  38060        if (!(fc->pipe_map & (1 << inst))) {
  38061             continue;
  38062        }
  38063        mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  38064                    _FP_GLOBAL_INST : inst;
  38065        instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  38066                    _FP_MAX_NUM_PIPES : inst;
  38067        slice_offset = inst * slice_size;
  38068 
  38069        rv = _bcm_field_reg_instance_get(unit,
  38070                                         VFP_KEY_CONTROL_1r,
  38071                                         mem_inst, &vfp_control_1_reg);
  38072        if (BCM_FAILURE(rv)) {
  38073            goto cleanup;
  38074        }
  38075        rv = _bcm_field_reg_instance_get(unit,
  38076                                         VFP_KEY_CONTROL_2r,
  38077                                         mem_inst, &vfp_control_2_reg);
  38078        if (BCM_FAILURE(rv)) {
  38079            goto cleanup;
  38080        }
  38081        rv = _bcm_field_reg_instance_get(unit,
  38082                                         VFP_SLICE_CONTROLr,
  38083                                         mem_inst, &vfp_slice_control_reg);
  38084        if (BCM_FAILURE(rv)) {
  38085            goto cleanup;
  38086        }
  38087        rv = _bcm_field_mem_instance_get(unit, VFP_TCAMm,
  38088                                         mem_inst, &vfp_tcam);
  38089        if (BCM_FAILURE(rv)) {
  38090            goto cleanup;
  38091        }
  38092        rv = _bcm_field_mem_instance_get(unit,
  38093                                         VFP_POLICY_TABLEm,
  38094                                         mem_inst,
  38095                                         &vfp_policy_table);
  38096        if (BCM_FAILURE(rv)) {
  38097            goto cleanup;
  38098        }
  38099 
  38100        /* Iterate over the slices */
  38101        if ((rv = soc_reg32_get(unit, vfp_slice_control_reg,
  38102                                REG_PORT_ANY, 0, &rval)) < 0) {
  38103            goto cleanup;
  38104        }
  38105 
  38106        if ((rv = soc_reg_get(unit, vfp_control_1_reg, REG_PORT_ANY,
  38107                              0, &vfp_key_1)) < 0) {
  38108           goto cleanup;
  38109        }
  38110        /* In TD3, vfp_key_control_2 register is not avaliable.
  38111         * we cannot match on Inner Ip header fields */
  38112        if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) {
  38113            if ((rv = soc_reg32_get(unit, vfp_control_2_reg, REG_PORT_ANY,
  38114                              0, &vfp_key2)) < 0) {
  38115                goto cleanup;
  38116            }
  38117        }
  38118        for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) {
  38119            /* Ignore disabled slice */
  38120            if (soc_reg_field_get(unit, vfp_slice_control_reg,
  38121                                    rval, vfp_en_flds[slice_idx]) == 0) {
  38122                 continue;
  38123            }
  38124            /* Ignore secondary slice in paired mode */
  38125            fld = _bcm_field_trx_slice_pairing_field[slice_idx / 2];
  38126            paired = soc_reg64_field32_get(unit, vfp_control_1_reg,
  38127                                           vfp_key_1, fld);
  38128 
  38129            fld = vfp_slice_wide_mode_flds[slice_idx];
  38130            intraslice = soc_reg64_field32_get(unit,
  38131                                               vfp_control_1_reg,
  38132                                               vfp_key_1, fld);
  38133            if (paired && (slice_idx % 2)) {
  38134                continue;
  38135            }
  38136 
  38137            /* Don't need to read selectors for expanded slice */
  38138            if (expanded[inst][slice_idx]) {
  38139                continue;
  38140            }
  38141 
  38142            /* Skip if slice has no valid groups and entries */
  38143            fs = stage_fc->slices[inst] + slice_idx;
  38144            for (idx = 0; idx < slice_ent_cnt; idx++) {
  38145                vfp_tcam_entry = soc_mem_table_idx_to_pointer
  38146                                    (unit,
  38147                                     vfp_tcam,
  38148                                     vfp_tcam_entry_t *,
  38149                                     vfp_tcam_pipe_buf[instance],
  38150                                     idx + slice_ent_cnt * slice_idx);
  38151                if (soc_mem_field32_get(unit, vfp_tcam,
  38152                                        vfp_tcam_entry, VALIDf) != 0) {
  38153                    break;
  38154                } else {
  38155                    if ((fc->l2warm) &&
  38156                        ((fc->wb_recovered_version) >=
  38157                        BCM_FIELD_WB_VERSION_1_27) &&
  38158                        (_FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  38159                        (idx + slice_ent_cnt * slice_idx) + slice_offset))) {
  38160                        break;
  38161                    }
  38162                }
  38163            }
  38164            if (idx == slice_ent_cnt && !fc->l2warm) {
  38165                continue;
  38166            }
  38167            /* If Level 2, retrieve the GIDs in this slice */
  38168            if (fc->l2warm) {
  38169                rv = _field_trx_scache_slice_group_recover(unit,
  38170                                                           fc, inst,
  38171                                                           slice_idx,
  38172                                                           NULL,
  38173                                                           stage_fc,
  38174                                                           0);
  38175                if (BCM_FAILURE(rv) && (rv != BCM_E_NOT_FOUND)) {
  38176                    fc->l2warm = 0;
  38177                    goto cleanup;
  38178                }
  38179                if (rv == BCM_E_NOT_FOUND) {
  38180                    rv = BCM_E_NONE;
  38181                    continue;
  38182                }
  38183            }
  38184 
  38185            /* Construct the group based on HW selector values */
  38186            _FIELD_SELCODE_CLEAR(hw_sels.pri_slice[0]);
  38187            hw_sels.pri_slice[0].intraslice = _FP_SELCODE_DONT_USE;
  38188            _FIELD_SELCODE_CLEAR(hw_sels.pri_slice[1]);
  38189            hw_sels.pri_slice[1].intraslice = _FP_SELCODE_DONT_USE;
  38190            _FIELD_SELCODE_CLEAR(hw_sels.sec_slice[0]);
  38191            hw_sels.sec_slice[0].intraslice = _FP_SELCODE_DONT_USE;
  38192            _FIELD_SELCODE_CLEAR(hw_sels.sec_slice[1]);
  38193            hw_sels.sec_slice[1].intraslice = _FP_SELCODE_DONT_USE;
  38194 
  38195            /* Get primary slice's selectors */
  38196            hw_sels.pri_slice[0].fpf1 = 0;
  38197            hw_sels.pri_slice[0].fpf2
  38198                = soc_reg64_field32_get(unit, vfp_control_1_reg,
  38199                         vfp_key_1, _bcm_field_trx_vfp_field_sel[slice_idx][0]);
  38200 
  38201            hw_sels.pri_slice[0].fpf3
  38202                = soc_reg64_field32_get(unit, vfp_control_1_reg,
  38203                         vfp_key_1, _bcm_field_trx_vfp_field_sel[slice_idx][1]);
  38204            hw_sels.pri_slice[0].ip_header_sel = 0;
  38205           /* In TD3, vfp_key_control_2 register is not avaliable.
  38206            * we cannot match on Inner Ip header fields */
  38207            if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) {
  38208                hw_sels.pri_slice[0].ip_header_sel
  38209                    = soc_reg_field_get(unit, vfp_control_2_reg,
  38210                         vfp_key2, _bcm_field_trx_vfp_ip_header_sel[slice_idx]);
  38211            }
  38212            /* If intraslice, get double-wide key - only 2 options */
  38213            if (intraslice) {
  38214                dbl_wide_key = soc_reg64_field32_get(unit,
  38215                                 vfp_control_1_reg,
  38216                                 vfp_key_1,
  38217                                 _bcm_field_trx_vfp_double_wide_sel[slice_idx]);
  38218 
  38219                hw_sels.pri_slice[1].intraslice = TRUE;
  38220                hw_sels.pri_slice[1].fpf2 = dbl_wide_key;
  38221                hw_sels.pri_slice[1].fpf3 = 0;
  38222                hw_sels.pri_slice[1].ip_header_sel = 0;
  38223               /* In TD3, vfp_key_control_2 register is not avaliable.
  38224                * we cannot match on Inner Ip header fields */
  38225 	       if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) {
  38226                    hw_sels.pri_slice[1].ip_header_sel
  38227                        = soc_reg_field_get(unit, vfp_control_2_reg,
  38228                             vfp_key2, _bcm_field_trx_vfp_ip_header_sel[slice_idx]);
  38229 	       }
  38230            }
  38231 
  38232            /* If paired, get secondary slice's selectors */
  38233            if (paired) {
  38234                hw_sels.sec_slice[0].fpf1 = 0;
  38235                hw_sels.sec_slice[0].fpf2
  38236                    = soc_reg64_field32_get(unit, vfp_control_1_reg,
  38237                     vfp_key_1, _bcm_field_trx_vfp_field_sel[slice_idx + 1][0]);
  38238 
  38239                hw_sels.sec_slice[0].fpf3
  38240                    = soc_reg64_field32_get(unit, vfp_control_1_reg,
  38241                     vfp_key_1, _bcm_field_trx_vfp_field_sel[slice_idx + 1][1]);
  38242                hw_sels.sec_slice[0].ip_header_sel = 0;
  38243                /* In TD3, vfp_key_control_2 register is not avaliable.
  38244                 * we cannot match on Inner Ip header fields */
  38245                if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) {
  38246                    hw_sels.sec_slice[0].ip_header_sel
  38247                        = soc_reg_field_get(unit, vfp_control_2_reg,
  38248                          vfp_key2, _bcm_field_trx_vfp_ip_header_sel[slice_idx + 1]);
  38249                }
  38250                /* If in intraslie double wide mode, get DW keysel value. */
  38251                if (intraslice) {
  38252                    dbl_wide_key_sec
  38253                        = soc_reg64_field32_get(unit,
  38254                               vfp_control_1_reg, vfp_key_1,
  38255                              _bcm_field_trx_vfp_double_wide_sel[slice_idx + 1]);
  38256 
  38257                    hw_sels.sec_slice[1].intraslice = TRUE;
  38258                    hw_sels.sec_slice[1].fpf2 = dbl_wide_key_sec;
  38259                    hw_sels.sec_slice[1].fpf3 = 0;
  38260                    hw_sels.sec_slice[1].ip_header_sel = 0;
  38261                    /* In TD3, vfp_key_control_2 register is not avaliable.
  38262                     * we cannot match on Inner Ip header fields */
  38263                    if (!soc_feature(unit, soc_feature_vfp_no_inner_ip_fields_support)) {
  38264                        hw_sels.sec_slice[1].ip_header_sel
  38265                            = soc_reg_field_get(unit,
  38266                               vfp_control_2_reg, vfp_key2,
  38267                               _bcm_field_trx_vfp_ip_header_sel[slice_idx + 1]);
  38268                    }
  38269                }
  38270            }
  38271 
  38272            /* Create a group based on HW qualifiers (or find existing) */
  38273            rv = _field_tr2_group_construct(unit, inst, &hw_sels, intraslice,
  38274                         paired, fc, -1, _BCM_FIELD_STAGE_LOOKUP, slice_idx);
  38275 
  38276            if (BCM_FAILURE(rv)) {
  38277                goto cleanup;
  38278            }
  38279            /* Now go over the entries */
  38280            fs = stage_fc->slices[inst] + slice_idx;
  38281            if (fs->group_flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) {
  38282                fs->free_count >>= 1;
  38283                ratio = 2;
  38284            } else {
  38285                ratio = 1;
  38286            }
  38287            prev_prio = -1;
  38288            for (idx = 0; idx < slice_ent_cnt / ratio; idx++) {
  38289                vfp_tcam_entry = soc_mem_table_idx_to_pointer
  38290                                     (unit, vfp_tcam,
  38291                                      vfp_tcam_entry_t *,
  38292                                      vfp_tcam_pipe_buf[instance],
  38293                                      idx + slice_ent_cnt * slice_idx);
  38294                if (soc_mem_field32_get(unit, vfp_tcam,
  38295                                        vfp_tcam_entry, VALIDf) == 0) {
  38296                    if (!(fc->l2warm)) {
  38297                        continue;
  38298                    } else {
  38299                        if ((fc->wb_recovered_version) <
  38300                             BCM_FIELD_WB_VERSION_1_27) {
  38301                            continue;
  38302                        } else if (!(_FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  38303                            (idx + slice_ent_cnt * slice_idx)+slice_offset))) {
  38304                            continue;
  38305                        }
  38306                    }
  38307                }
  38308 
  38309                /* Search groups to find match */
  38310                fg = fc->groups;
  38311                while (fg != NULL) {
  38312                    /* Check if group is in this slice */
  38313                    fs = &fg->slices[0];
  38314                    if ((fg->instance != inst) ||
  38315                        (fg->stage_id != stage_fc->stage_id) ||
  38316                        (fs->slice_number != slice_idx)) {
  38317                        fg = fg->next;
  38318                        continue;
  38319                    }
  38320                    break;
  38321                }
  38322 
  38323                if (fg == NULL) {
  38324                   rv = BCM_E_INTERNAL;
  38325                   goto cleanup;
  38326                }
  38327 
  38328                SOC_PBMP_CLEAR(entry_pbmp);
  38329                if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  38330                   SOC_PBMP_ASSIGN(entry_pbmp, PBMP_PORT_ALL(unit));
  38331                   SOC_PBMP_OR(entry_pbmp, PBMP_CMIC(unit));
  38332                } else {
  38333                   SOC_PBMP_ASSIGN(entry_pbmp, PBMP_PIPE(unit, fg->instance));
  38334                   BCM_PBMP_REMOVE(entry_pbmp, PBMP_LB(unit));
  38335                }
  38336                SOC_PBMP_ASSIGN(fg->pbmp, entry_pbmp);
  38337                BCM_PBMP_OR(fs->pbmp, fg->pbmp);
  38338 
  38339                /* Allocate memory for the entry */
  38340                rv = _bcm_field_entry_tcam_parts_count(unit, fg->stage_id,
  38341                                                       fg->flags, &parts_count);
  38342                if (BCM_FAILURE(rv)) {
  38343                    goto cleanup;
  38344                }
  38345 
  38346                mem_sz = parts_count * sizeof (_field_entry_t);
  38347                _FP_XGS3_ALLOC(f_ent, mem_sz, "field entry");
  38348                if (f_ent == NULL) {
  38349                    rv = BCM_E_MEMORY;
  38350                    goto cleanup;
  38351                }
  38352                for (idx1 = 0; idx1 < _FP_POLICER_LEVEL_COUNT; idx1++) {
  38353                     f_ent->policer[idx1].pid = _FP_INVALID_INDEX;
  38354                }
  38355 
  38356 
  38357                sal_memset(&f_ent_wb_info, 0, sizeof(_field_entry_wb_info_t));
  38358                f_ent_wb_info.action_bmp = &action_bmp;
  38359                f_ent_wb_info.sid = f_ent_wb_info.pid = -1;
  38360                if (fc->l2warm) {
  38361                    if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  38362                        action_bmp.w = NULL;
  38363                        _FP_XGS3_ALLOC(action_bmp.w,
  38364                             SHR_BITALLOCSIZE(_bcmFieldActionNoParamCount),
  38365                             "Action No Param Bitmap");
  38366                        if (action_bmp.w == NULL) {
  38367                           rv = BCM_E_MEMORY;
  38368                           sal_free(f_ent);
  38369                           goto cleanup;
  38370                        }
  38371                    }
  38372                    rv = _field_trx_entry_info_retrieve(unit, fc, stage_fc,
  38373                                                        0, &prev_prio,
  38374                                                        &f_ent_wb_info);
  38375                    if (BCM_FAILURE(rv)) {
  38376                        sal_free(f_ent);
  38377                        goto cleanup;
  38378                    }
  38379                } else {
  38380                    _bcm_field_last_alloc_eid_incr(unit);
  38381                }
  38382 
  38383                pri_tcam_idx = idx + slice_ent_cnt * slice_idx;
  38384                for (i = 0; i < parts_count; i++) {
  38385                    if (fc->l2warm) {
  38386                        /* Use retrieved EID */
  38387                        f_ent[i].eid = f_ent_wb_info.eid;
  38388                       /* Set retrieved dvp_type and svp_type */
  38389                        f_ent[i].dvp_type = f_ent_wb_info.dvp_type[i];
  38390                        f_ent[i].svp_type = f_ent_wb_info.svp_type[i];
  38391                        f_ent[i].prio = f_ent_wb_info.prio;
  38392                    } else {
  38393                        f_ent[i].eid = _bcm_field_last_alloc_eid_get(unit);
  38394                    }
  38395                    f_ent[i].group = fg;
  38396 
  38397                    rv = _bcm_field_tcam_part_to_entry_flags
  38398                            (unit, i, fg, &f_ent[i].flags);
  38399                    if (BCM_FAILURE(rv)) {
  38400                        sal_free(f_ent);
  38401                        goto cleanup;
  38402                    }
  38403 
  38404                    if (f_ent_wb_info.color_independent) {
  38405                        f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT;
  38406                    }
  38407                    rv = _bcm_field_entry_part_tcam_idx_get
  38408                            (unit, f_ent, pri_tcam_idx, i, &part_index);
  38409                    if (BCM_FAILURE(rv)) {
  38410                        sal_free(f_ent);
  38411                        goto cleanup;
  38412                    }
  38413                    rv = _bcm_field_tcam_idx_to_slice_offset(unit, stage_fc,
  38414                                            inst, part_index, &slice_number,
  38415                                                (int *)&f_ent[i].slice_idx);
  38416                    if (BCM_FAILURE(rv)) {
  38417                        sal_free(f_ent);
  38418                        goto cleanup;
  38419                    }
  38420                    f_ent[i].fs = stage_fc->slices[inst] + slice_number;
  38421                    if (0 == (f_ent[i].flags & _FP_ENTRY_SECOND_HALF)) {
  38422                        /* Decrement slice free entry count for primary
  38423                           entries. */
  38424                        f_ent[i].fs->free_count--;
  38425                    }
  38426 
  38427                    f_ent[i].fs->hw_ent_count++;
  38428 
  38429                    /* Assign entry to a slice */
  38430                    f_ent[i].fs->entries[f_ent[i].slice_idx] = f_ent + i;
  38431                    BCM_PBMP_OR(f_ent[i].fs->pbmp, fg->pbmp);
  38432                    f_ent[i].flags |= _FP_ENTRY_INSTALLED;
  38433 
  38434                    if (soc_mem_field32_get(unit, vfp_tcam,
  38435                                        vfp_tcam_entry, VALIDf) == valid_enable) {
  38436                        f_ent[i].flags |= _FP_ENTRY_ENABLED;
  38437                    } else {
  38438                         if ((fc->l2warm) && (i != 0) &&
  38439                             ((fc->wb_recovered_version) >=
  38440                             BCM_FIELD_WB_VERSION_1_27) &&
  38441                             ( _FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  38442                             pri_tcam_idx + slice_offset) )) {
  38443 
  38444                             f_ent[i].flags |= _FP_ENTRY_ENABLED;
  38445                         }
  38446                     }
  38447 
  38448                    /* Get the actions associated with this part of the entry */
  38449                    vfp_policy_entry = soc_mem_table_idx_to_pointer
  38450                                        (unit,
  38451                                         vfp_policy_table,
  38452                                         vfp_policy_table_entry_t *,
  38453                                         vfp_policy_pipe_buf[instance],
  38454                                         part_index);
  38455                    rv = _field_tr2_actions_recover
  38456                            (unit,
  38457                             vfp_policy_table,
  38458                             (uint32 *) vfp_policy_entry,
  38459                             f_ent, i, &f_ent_wb_info);
  38460                    if (BCM_FAILURE(rv)) {
  38461                        sal_free(f_ent);
  38462                        goto cleanup;
  38463                    }
  38464                    if (action_bmp.w != NULL) {
  38465                        _FP_ACTION_BMP_FREE(action_bmp);
  38466                        action_bmp.w = NULL;
  38467                    }
  38468 
  38469                    if (soc_feature(unit, soc_feature_advanced_flex_counter)) {
  38470                        _field_adv_flex_stat_info_retrieve(unit,
  38471                                          f_ent->statistic.sid);
  38472                    }
  38473                }
  38474                rv = _field_group_entry_add(unit, fg, f_ent);
  38475                if (BCM_FAILURE(rv)) {
  38476                    sal_free(f_ent);
  38477                    goto cleanup;
  38478                }
  38479                f_ent = NULL;
  38480            }
  38481            /* Free up the temporary slice group info */
  38482            if (fc->l2warm) {
  38483                if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_18) {
  38484                    /* update selcode and construct group qual offset */
  38485                    rv = _field_tr2_group_construct_quals_with_sel_update(unit, fc, stage_fc);
  38486                    if (BCM_FAILURE(rv)) {
  38487                        goto cleanup;
  38488                    }
  38489                }
  38490                _field_scache_slice_group_free(unit, fc, slice_idx);
  38491            }
  38492        }
  38493     }
  38494 
  38495     /* Iterate over the instances. */
  38496     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  38497        if (!(fc->pipe_map & (1 << inst))) {
  38498             continue;
  38499        }
  38500        mem_inst = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  38501                    _FP_GLOBAL_INST : inst;
  38502        instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  38503                    _FP_MAX_NUM_PIPES : inst;
  38504        slice_offset = inst * slice_size;
  38505 
  38506        rv = _bcm_field_reg_instance_get(unit,
  38507                                         VFP_KEY_CONTROL_1r,
  38508                                         mem_inst,
  38509                                         &vfp_control_1_reg);
  38510        if (BCM_FAILURE(rv)) {
  38511            goto cleanup;
  38512        }
  38513        rv = _bcm_field_reg_instance_get(unit,
  38514                                         VFP_KEY_CONTROL_2r,
  38515                                         mem_inst,
  38516                                         &vfp_control_2_reg);
  38517        if (BCM_FAILURE(rv)) {
  38518            goto cleanup;
  38519        }
  38520        rv = _bcm_field_mem_instance_get(unit, VFP_TCAMm,
  38521                                         mem_inst, &vfp_tcam);
  38522        if (BCM_FAILURE(rv)) {
  38523            goto cleanup;
  38524        }
  38525        rv = _bcm_field_mem_instance_get(unit,
  38526                                         VFP_POLICY_TABLEm,
  38527                                         mem_inst,
  38528                                         &vfp_policy_table);
  38529        if (BCM_FAILURE(rv)) {
  38530            goto cleanup;
  38531        }
  38532 
  38533        /* Now go over the expanded slices */
  38534        for (slice_idx = 0; slice_idx < stage_fc->tcam_slices; slice_idx++) {
  38535             if (!expanded[inst][slice_idx]) {
  38536                continue;
  38537             }
  38538             /* Ignore secondary slice in paired mode */
  38539             fld = _bcm_field_trx_slice_pairing_field[slice_idx / 2];
  38540             paired = soc_reg64_field32_get
  38541                         (unit, vfp_control_1_reg,
  38542                          vfp_key_1, fld);
  38543             if (paired && (slice_idx % 2)) {
  38544                 continue;
  38545             }
  38546             /* Skip if slice has no valid groups and entries */
  38547             fs = stage_fc->slices[inst] + slice_idx;
  38548             for (idx = 0; idx < slice_ent_cnt; idx++) {
  38549                 vfp_tcam_entry = soc_mem_table_idx_to_pointer
  38550                                      (unit, vfp_tcam,
  38551                                       vfp_tcam_entry_t *,
  38552                                       vfp_tcam_pipe_buf[instance],
  38553                                       idx + slice_ent_cnt * slice_idx);
  38554                 if (soc_mem_field32_get(unit, vfp_tcam,
  38555                                        vfp_tcam_entry, VALIDf) != 0) {
  38556                     break;
  38557                 } else {
  38558                     if ((fc->l2warm) &&
  38559                         ((fc->wb_recovered_version) >=
  38560                         BCM_FIELD_WB_VERSION_1_27) &&
  38561                         (_FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  38562                         (idx + slice_ent_cnt * slice_idx) + slice_offset))) {
  38563                        break;
  38564                     }
  38565                 }
  38566             }
  38567 
  38568             if (idx == slice_ent_cnt) {
  38569                 continue;
  38570             }
  38571 
  38572             /* If Level 2, retrieve the GIDs in this slice */
  38573             if (fc->l2warm) {
  38574                 rv = _field_trx_scache_slice_group_recover
  38575                         (unit,
  38576                          fc, inst,
  38577                          slice_idx,
  38578                          NULL,
  38579                          stage_fc,
  38580                          0);
  38581                 if (BCM_FAILURE(rv) && (rv != BCM_E_NOT_FOUND)) {
  38582                     fc->l2warm = 0;
  38583                     goto cleanup;
  38584                 }
  38585                 if (rv == BCM_E_NOT_FOUND) {
  38586                     rv = BCM_E_NONE;
  38587                     continue;
  38588                 }
  38589             }
  38590 
  38591             /* Now find the master slice for this virtual group */
  38592             vslice_idx = _field_physical_to_virtual(unit, inst,
  38593                                                     slice_idx, stage_fc);
  38594             if (vslice_idx < 0) {
  38595                 rv = BCM_E_INTERNAL;
  38596                 goto cleanup;
  38597             }
  38598 
  38599             if (fc->l2warm
  38600                     && ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_8)) {
  38601                 master_slice = slice_master_idx[inst][slice_idx];
  38602             } else {
  38603             max = -1;
  38604               for (i = 0; i < stage_fc->tcam_slices; i++) {
  38605                   if ((stage_fc->vmap[inst][0][vslice_idx].virtual_group ==
  38606                        stage_fc->vmap[inst][0][i].virtual_group) &&
  38607                        (i != vslice_idx)) {
  38608                       if (i > max) {
  38609                           max = i;
  38610                       }
  38611                   }
  38612               }
  38613               if (max < 0) {
  38614                   rv = BCM_E_INTERNAL;
  38615                   goto cleanup;
  38616               }
  38617 
  38618               master_slice = stage_fc->vmap[inst][0][max].vmap_key;
  38619             }
  38620             /* See which group is in this slice - can be only one */
  38621             fg = fc->groups;
  38622             while (fg != NULL) {
  38623                 /* Check if group is in this slice */
  38624                 fs = &fg->slices[0];
  38625                 if ((fg->instance == inst) &&
  38626                     (fg->stage_id == stage_fc->stage_id) &&
  38627                     (fs->slice_number == master_slice)) {
  38628                     break;
  38629                 }
  38630                 fg = fg->next;
  38631             }
  38632             if (fg == NULL) {
  38633                 rv = BCM_E_INTERNAL;
  38634                 goto cleanup;
  38635             }
  38636 
  38637             /* Get number of entry parts for the group. */
  38638             rv = _bcm_field_entry_tcam_parts_count (unit, fg->stage_id,
  38639                                                     fg->flags, &parts_count);
  38640             if (BCM_FAILURE(rv)) {
  38641                 goto cleanup;
  38642             }
  38643 
  38644             old_physical_slice = fs->slice_number;
  38645 
  38646             /* Set up the new physical slice parameters in Software */
  38647             for(part_index = parts_count - 1; part_index >= 0; part_index--) {
  38648                 /* Get entry flags. */
  38649                 rv = _bcm_field_tcam_part_to_entry_flags(unit, part_index, fg,
  38650                                                          &entry_flags);
  38651                 if (BCM_FAILURE(rv)) {
  38652                     goto cleanup;
  38653                 }
  38654 
  38655                 /* Get slice id for entry part */
  38656                 rv = _bcm_field_tcam_part_to_slice_number(unit, part_index,
  38657                                                           fg, &slice_num);
  38658                 if (BCM_FAILURE(rv)) {
  38659                     goto cleanup;
  38660                 }
  38661 
  38662                 /* Get slice pointer. */
  38663                 fs = stage_fc->slices[inst] + slice_idx + slice_num;
  38664 
  38665                 if (0 == (entry_flags & _FP_ENTRY_SECOND_HALF)) {
  38666                     /* Set per slice configuration & number of
  38667                      * free entries in the slice.*/
  38668                     fs->free_count = fs->entry_count;
  38669                     if (fg->flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) {
  38670                         fs->free_count >>= 1;
  38671                     }
  38672                     /* Set group flags in in slice.*/
  38673                     fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK;
  38674 
  38675                     /* Add slice to slices linked list . */
  38676                     fs_temp = stage_fc->slices[inst] +
  38677                               old_physical_slice + slice_num;
  38678                     /* To handle more than one auto expanded slice in a group */
  38679                     while (fs_temp->next != NULL) {
  38680                         fs_temp = fs_temp->next;
  38681                     }
  38682                     fs_temp->next = fs;
  38683                     fs->prev = fs_temp;
  38684                 }
  38685             }
  38686 
  38687             /* Now go over the entries */
  38688             fs = stage_fc->slices[inst] + slice_idx;
  38689             fs->group_flags = fg->flags & _FP_GROUP_STATUS_MASK;
  38690             if (fs->group_flags & _FP_GROUP_INTRASLICE_DOUBLEWIDE) {
  38691                 ratio = 2;
  38692             } else {
  38693                 ratio = 1;
  38694             }
  38695 
  38696             prev_prio = -1;
  38697             for (idx = 0; idx < slice_ent_cnt / ratio; idx++) {
  38698                 vfp_tcam_entry = soc_mem_table_idx_to_pointer
  38699                                      (unit,
  38700                                       vfp_tcam,
  38701                                       vfp_tcam_entry_t *,
  38702                                       vfp_tcam_pipe_buf[instance],
  38703                                       idx + slice_ent_cnt * slice_idx);
  38704                 if (soc_mem_field32_get(unit, vfp_tcam,
  38705                                        vfp_tcam_entry, VALIDf) == 0) {
  38706                     if (!(fc->l2warm)) {
  38707                         continue;
  38708                     } else {
  38709                         if ((fc->wb_recovered_version) <
  38710                             BCM_FIELD_WB_VERSION_1_27){
  38711                             continue;
  38712                         } else if (!(_FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  38713                             (idx + slice_ent_cnt * slice_idx)+slice_offset))) {
  38714                             continue;
  38715                         }
  38716                     }
  38717                 }
  38718 
  38719                 /* All ports are applicable to this entry */
  38720                 SOC_PBMP_CLEAR(entry_pbmp);
  38721                 if (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) {
  38722                    SOC_PBMP_ASSIGN(entry_pbmp, PBMP_PORT_ALL(unit));
  38723                    SOC_PBMP_OR(entry_pbmp, PBMP_CMIC(unit));
  38724                 } else {
  38725                    SOC_PBMP_ASSIGN(entry_pbmp, PBMP_PIPE(unit, fg->instance));
  38726                    BCM_PBMP_REMOVE(entry_pbmp, PBMP_LB(unit));
  38727                 }
  38728 
  38729 
  38730                 /* Search groups to find match */
  38731                 fg = fc->groups;
  38732                 while (fg != NULL) {
  38733                     /* Check if group is in this slice */
  38734                     fs = &fg->slices[0];
  38735                     if ((fg->instance != inst) ||
  38736                         (fg->stage_id != stage_fc->stage_id) ||
  38737                         (fs->slice_number != master_slice)) {
  38738                         fg = fg->next;
  38739                         continue;
  38740                     }
  38741 
  38742                     /* Check if entry_pbmp is a subset of group pbmp */
  38743                     SOC_PBMP_ASSIGN(temp_pbmp, fg->pbmp);
  38744                     SOC_PBMP_AND(temp_pbmp, entry_pbmp);
  38745                     if (SOC_PBMP_EQ(temp_pbmp, entry_pbmp)) {
  38746                         break;
  38747                     }
  38748                     fg = fg->next;
  38749                 }
  38750 
  38751                 if (fg == NULL) {
  38752                     goto cleanup;
  38753                 }
  38754 
  38755                 /* Allocate memory for the entry */
  38756                 rv = _bcm_field_entry_tcam_parts_count(unit,fg->stage_id,
  38757                                                        fg->flags, &parts_count);
  38758                 if (BCM_FAILURE(rv)) {
  38759                     goto cleanup;
  38760                 }
  38761                 mem_sz = parts_count * sizeof (_field_entry_t);
  38762                 _FP_XGS3_ALLOC(f_ent, mem_sz, "field entry");
  38763                 if (f_ent == NULL) {
  38764                     rv = BCM_E_MEMORY;
  38765                     goto cleanup;
  38766                 }
  38767 
  38768                 for (idx1 = 0; idx1 < _FP_POLICER_LEVEL_COUNT; idx1++) {
  38769                      f_ent->policer[idx1].pid = _FP_INVALID_INDEX;
  38770                 }
  38771 
  38772                 sal_memset(&f_ent_wb_info, 0, sizeof(_field_entry_wb_info_t));
  38773                 f_ent_wb_info.action_bmp = &action_bmp;
  38774                 f_ent_wb_info.sid = f_ent_wb_info.pid = -1;
  38775                 if (fc->l2warm) {
  38776                     if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  38777                         action_bmp.w = NULL;
  38778                         _FP_XGS3_ALLOC(action_bmp.w,
  38779                             SHR_BITALLOCSIZE(_bcmFieldActionNoParamCount),
  38780                             "Action No Param Bitmap");
  38781                         if (action_bmp.w == NULL) {
  38782                           rv = BCM_E_MEMORY;
  38783                           sal_free(f_ent);
  38784                           goto cleanup;
  38785                         }
  38786                     }
  38787                     rv = _field_trx_entry_info_retrieve
  38788                             (unit, fc, stage_fc, 0, &prev_prio,
  38789                              &f_ent_wb_info);
  38790                     if (BCM_FAILURE(rv)) {
  38791                         sal_free(f_ent);
  38792                         goto cleanup;
  38793                     }
  38794                 } else {
  38795                     _bcm_field_last_alloc_eid_incr(unit);
  38796                 }
  38797                 pri_tcam_idx = idx + slice_ent_cnt * slice_idx;
  38798                 for (i = 0; i < parts_count; i++) {
  38799                     if (fc->l2warm) {
  38800                         /* Use retrieved EID */
  38801                         f_ent[i].eid = f_ent_wb_info.eid;
  38802                         /* Set retrieved dvp_type and svp_type */
  38803                         f_ent[i].dvp_type = f_ent_wb_info.dvp_type[i];
  38804                         f_ent[i].svp_type = f_ent_wb_info.svp_type[i];
  38805                         f_ent[i].prio = f_ent_wb_info.prio;
  38806                     } else {
  38807                         f_ent[i].eid = _bcm_field_last_alloc_eid_get(unit);
  38808                     }
  38809                     f_ent[i].group = fg;
  38810 
  38811                     rv = _bcm_field_tcam_part_to_entry_flags(unit, i, fg,
  38812                                                         &f_ent[i].flags);
  38813                     if (BCM_FAILURE(rv)) {
  38814                         sal_free(f_ent);
  38815                         goto cleanup;
  38816                     }
  38817 
  38818                     if (f_ent_wb_info.color_independent) {
  38819                         f_ent[i].flags |= _FP_ENTRY_COLOR_INDEPENDENT;
  38820                     }
  38821                     rv = _bcm_field_entry_part_tcam_idx_get(unit, f_ent,
  38822                                           pri_tcam_idx, i, &part_index);
  38823                     if (BCM_FAILURE(rv)) {
  38824                         sal_free(f_ent);
  38825                         goto cleanup;
  38826                     }
  38827                     rv = _bcm_field_tcam_idx_to_slice_offset(unit, stage_fc,
  38828                                             inst, part_index, &slice_number,
  38829                                                 (int *)&f_ent[i].slice_idx);
  38830                     if (BCM_FAILURE(rv)) {
  38831                         sal_free(f_ent);
  38832                         goto cleanup;
  38833                     }
  38834                     f_ent[i].fs = stage_fc->slices[inst] + slice_number;
  38835                     if (0 == (f_ent[i].flags & _FP_ENTRY_SECOND_HALF)) {
  38836                         /* Decrement slice free entry count for primary
  38837                            entries. */
  38838                         f_ent[i].fs->free_count--;
  38839                     }
  38840 
  38841                     f_ent[i].fs->hw_ent_count++;
  38842 
  38843                     /* Assign entry to a slice */
  38844                     f_ent[i].fs->entries[f_ent[i].slice_idx] = f_ent + i;
  38845                     BCM_PBMP_OR(f_ent[i].fs->pbmp, fg->pbmp);
  38846                     f_ent[i].flags |= _FP_ENTRY_INSTALLED;
  38847 
  38848                     if (soc_mem_field32_get(unit, vfp_tcam,
  38849                                             vfp_tcam_entry, VALIDf) == vfp_tcam_enabled) {
  38850                         f_ent[i].flags |= _FP_ENTRY_ENABLED;
  38851                     } else {
  38852                         if ((fc->l2warm) && (i != 0) &&
  38853                             ((fc->wb_recovered_version) >=
  38854                             BCM_FIELD_WB_VERSION_1_27) &&
  38855                             ( _FP_SLICEIDX_BMP_TEST(sliceidx_bmp,
  38856                             pri_tcam_idx + slice_offset) )) {
  38857                             f_ent[i].flags |= _FP_ENTRY_ENABLED;
  38858                         }
  38859                     }
  38860 
  38861                     /* Get the actions associated with this part of the entry */
  38862                     vfp_policy_entry = soc_mem_table_idx_to_pointer
  38863                                         (unit,
  38864                                          vfp_policy_table,
  38865                                          vfp_policy_table_entry_t *,
  38866                                          vfp_policy_pipe_buf[instance],
  38867                                          part_index);
  38868                     rv = _field_tr2_actions_recover(unit,
  38869                                                     vfp_policy_table,
  38870                                             (uint32 *) vfp_policy_entry, f_ent,
  38871                                                     i, &f_ent_wb_info);
  38872                     if (BCM_FAILURE(rv)) {
  38873                         sal_free(f_ent);
  38874                         goto cleanup;
  38875                     }
  38876                     if (action_bmp.w != NULL) {
  38877                        _FP_ACTION_BMP_FREE(action_bmp);
  38878                        action_bmp.w = NULL;
  38879                     }
  38880 
  38881                     if (soc_feature(unit, soc_feature_advanced_flex_counter)) {
  38882                         _field_adv_flex_stat_info_retrieve(unit,
  38883                                                           f_ent->statistic.sid);
  38884                     }
  38885                 }
  38886                 rv = _field_group_entry_add(unit, fg, f_ent);
  38887                 if (BCM_FAILURE(rv)) {
  38888                     sal_free(f_ent);
  38889                     goto cleanup;
  38890                 }
  38891                 f_ent = NULL;
  38892             }
  38893             /* Free up the temporary slice group info */
  38894             if (fc->l2warm) {
  38895                 _field_scache_slice_group_free(unit, fc, slice_idx);
  38896             }
  38897         }
  38898     }
  38899 
  38900 
  38901     if (fc->l2warm) {
  38902 
  38903         /* Mark end of Slice Info */
  38904         if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  38905             fc->scache_pos++;
  38906         }
  38907 
  38908         if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  38909             if (stage_fc->stage_id == _BCM_FIELD_STAGE_LOOKUP) {
  38910                 LOG_DEBUG(BSL_LS_BCM_FP,
  38911                         (BSL_META_U(unit,"Recovering hint Ids "
  38912                                     "from pos = %d\r\n"), fc->scache_pos));
  38913                 rv = _bcm_hints_scache_hintid_recover(unit, stage_fc,
  38914                             fc, &buf[fc->scache_pos]);
  38915                 if (BCM_FAILURE(rv)) {
  38916                     goto cleanup;
  38917                 }
  38918             }
  38919         }
  38920 
  38921         /* Group Slice Selectors */
  38922         if ((fc->wb_recovered_version) >= BCM_FIELD_WB_VERSION_1_15) {
  38923             rv = (_field_group_slice_selectors_recover(unit,
  38924                         &buf[fc->scache_pos], stage_fc->stage_id));
  38925             if (BCM_FAILURE(rv)) {
  38926                 goto cleanup;
  38927             }
  38928         }
  38929 
  38930         temp = 0;
  38931         temp |= buf[fc->scache_pos];
  38932         fc->scache_pos++;
  38933         temp |= buf[fc->scache_pos] << 8;
  38934         fc->scache_pos++;
  38935         temp |= buf[fc->scache_pos] << 16;
  38936         fc->scache_pos++;
  38937         temp |= buf[fc->scache_pos] << 24;
  38938         fc->scache_pos++;
  38939         if (temp != _FIELD_VFP_DATA_END) {
  38940             fc->l2warm = 0;
  38941             rv = BCM_E_INTERNAL;
  38942         }
  38943 
  38944         if (NULL != buf1) {
  38945             temp = 0;
  38946             temp |= buf1[fc->scache_pos1];
  38947             fc->scache_pos1++;
  38948             temp |= buf1[fc->scache_pos1] << 8;
  38949             fc->scache_pos1++;
  38950             temp |= buf1[fc->scache_pos1] << 16;
  38951             fc->scache_pos1++;
  38952             temp |= buf1[fc->scache_pos1] << 24;
  38953             fc->scache_pos1++;
  38954             if (temp != _FIELD_VFP_DATA_END) {
  38955                 fc->l2warm = 0;
  38956                 rv = BCM_E_INTERNAL;
  38957             }
  38958         }
  38959     }
  38960 
  38961     if (BCM_SUCCESS(rv)) {
  38962         _field_group_slice_vmap_recovery(unit, fc, stage_fc);
  38963     }
  38964 
  38965     _field_tr2_stage_reinit_all_groups_cleanup(unit, fc,
  38966                           _BCM_FIELD_STAGE_LOOKUP, NULL);
  38967 
  38968 cleanup:
  38969     for (inst = 0; inst < stage_fc->num_instances; inst++) {
  38970         if (!(fc->pipe_map & (1 << inst))) {
  38971 
  38972              continue;
  38973         }
  38974          instance = (stage_fc->oper_mode == bcmFieldGroupOperModeGlobal) ?
  38975                      _FP_MAX_NUM_PIPES : inst;
  38976 
  38977         if (vfp_tcam_pipe_buf[instance]) {
  38978            soc_cm_sfree(unit, vfp_tcam_pipe_buf[instance]);
  38979         }
  38980         if (vfp_policy_pipe_buf[instance]) {
  38981            soc_cm_sfree(unit, vfp_policy_pipe_buf[instance]);
  38982         }
  38983     }
  38984     if (vfp_tcam_buf) {
  38985        soc_cm_sfree(unit, vfp_tcam_buf);
  38986     }
  38987     if (vfp_policy_buf) {
  38988        soc_cm_sfree(unit, vfp_policy_buf);
  38989     }
  38990     if (action_bmp.w != NULL) {
  38991        _FP_ACTION_BMP_FREE(action_bmp);
  38992        action_bmp.w = NULL;
  38993     }
  38994     if (NULL != sliceidx_bmp.w) {
  38995         sal_free(sliceidx_bmp.w);
  38996         sliceidx_bmp.w = NULL;
  38997     }
  38998     return rv;
  38999 
  39000 }
  39001 
  39002 
  39003                /*  END OF WARMBOOT ROUTINES */
  39004 #endif  /* BCM_WARM_BOOT_SUPPORT */
  39005 
  39006 #else /* BCM_TOMAHAWK_SUPPORT && BCM_FIELD_SUPPORT */
  39007 int _th_field_not_empty;
  39008 #endif  /* BCM_TOMAHAWK_SUPPORT && BCM_FIELD_SUPPORT */