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

keygen_ext_ctrl.c (37470B)


      1 /*
      2  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      3  * 
      4  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      5  */
      6 
      7 #include <bcm_int/esw/keygen_md.h>
      8 
      9 STATIC int
     10 bcmi_keygen_ext_code_part_get(int unit,
     11                               bcmi_keygen_md_t *keygen_md,
     12                               bcmi_keygen_ext_ctrl_sel_t ctrl_sel,
     13                               uint8 ctrl_sel_val,
     14                               int8 *part)
     15 {
     16     uint8 idx = 0;
     17     bcmi_keygen_ext_field_info_t *finfo = NULL;
     18 
     19     BCMI_KEYGEN_FUNC_ENTER(unit);
     20 
     21     BCMI_KEYGEN_NULL_CHECK(part, BCM_E_PARAM);
     22     BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM);
     23 
     24     *part = -1;
     25     for (idx = 0; idx < BCMI_KEYGEN_EXT_FIELDS_MAX; idx++) {
     26        finfo = &(keygen_md->finfo[idx]);
     27        if (finfo->section == BCMI_KEYGEN_EXT_SECTION_DISABLE) {
     28           break;
     29        }
     30        if (finfo->part == -1) {
     31            continue;
     32        }
     33        if (finfo->pri_ctrl_sel[0] == ctrl_sel &&
     34            finfo->pri_ctrl_sel_val[0] == ctrl_sel_val) {
     35            *part = finfo->part;
     36            break;
     37        }
     38     }
     39 
     40 exit:
     41     BCMI_KEYGEN_FUNC_EXIT();
     42 }
     43 
     44 int
     45 bcmi_keygen_ext_codes_init(int unit, bcmi_keygen_ext_sel_t *ext_codes)
     46 {
     47     BCMI_KEYGEN_FUNC_ENTER(unit);
     48 
     49     BCMI_KEYGEN_NULL_CHECK(ext_codes, BCM_E_PARAM);
     50 
     51     sal_memset(ext_codes, BCMI_KEYGEN_EXT_SELCODE_DONT_CARE, sizeof(bcmi_keygen_ext_sel_t));
     52 
     53 exit:
     54     BCMI_KEYGEN_FUNC_EXIT();
     55 }
     56 
     57 int
     58 bcmi_keygen_ext_codes_create(int unit,
     59                              bcmi_keygen_cfg_t *keygen_cfg,
     60                              bcmi_keygen_md_t *keygen_md,
     61                              bcmi_keygen_oper_t *keygen_oper)
     62 {
     63     uint8 part = 0;
     64     uint8 level = 0;
     65     uint16 idx = 0;
     66     uint16 pmux_idx = 0;
     67     uint16 ext_idx = 0;
     68     uint16 num_ext_codes = 0;
     69     bcmi_keygen_ext_cfg_t *ext_cfg = NULL;
     70     bcmi_keygen_ext_sel_t *ext_codes = NULL;
     71     bcmi_keygen_ext_ctrl_sel_info_t *ext_ctrl_info = NULL;
     72     bcmi_keygen_ext_field_info_t *finfo = NULL;
     73 
     74     BCMI_KEYGEN_FUNC_ENTER(unit);
     75 
     76     BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM);
     77     BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM);
     78     BCMI_KEYGEN_NULL_CHECK(keygen_oper, BCM_E_PARAM);
     79 
     80     for (level = 1; level < (keygen_md->num_ext_levels + 1); level++) {
     81         for (ext_idx = 0;
     82             ext_idx < keygen_md->ext_cfg_db->conf_size[level];
     83             ext_idx++) {
     84             ext_cfg =  keygen_md->ext_cfg_db->ext_cfg[level] + ext_idx;
     85             if (SHR_BITGET(ext_cfg->ext_attrs.w,
     86                    BCMI_KEYGEN_EXT_ATTR_PASS_THRU)) {
     87                 continue;
     88             }
     89             if (SHR_BITGET(ext_cfg->ext_attrs.w,
     90                     BCMI_KEYGEN_EXT_ATTR_NOT_WITH_QSET_UPDATE)) {
     91                 continue;
     92             }
     93             if (ext_cfg->in_use == TRUE) {
     94                 num_ext_codes++;
     95             }
     96         }
     97     }
     98 
     99     for (part = 0; part < keygen_cfg->num_parts; part++) {
    100         ext_codes = &(keygen_md->ext_codes[part]);
    101         if (ext_codes->aux_tag_a_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    102             num_ext_codes++;
    103         }
    104         if (ext_codes->aux_tag_b_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    105             num_ext_codes++;
    106         }
    107         if (ext_codes->aux_tag_c_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    108             num_ext_codes++;
    109         }
    110         if (ext_codes->aux_tag_d_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    111             num_ext_codes++;
    112         }
    113         if (ext_codes->ttl_fn_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    114             num_ext_codes++;
    115         }
    116         if (ext_codes->tcp_fn_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    117             num_ext_codes++;
    118         }
    119         if (ext_codes->tos_fn_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    120             num_ext_codes++;
    121         }
    122         if (ext_codes->class_id_cont_a_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    123             num_ext_codes++;
    124         }
    125         if (ext_codes->class_id_cont_b_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    126             num_ext_codes++;
    127         }
    128         if (ext_codes->class_id_cont_c_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    129             num_ext_codes++;
    130         }
    131         if (ext_codes->class_id_cont_d_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    132             num_ext_codes++;
    133         }
    134         if (ext_codes->src_dest_cont_0_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    135             num_ext_codes++;
    136         }
    137         if (ext_codes->src_dest_cont_1_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    138             num_ext_codes++;
    139         }
    140         if (ext_codes->src_cont_a_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    141             num_ext_codes++;
    142         }
    143         if (ext_codes->src_cont_b_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    144             num_ext_codes++;
    145         }
    146         if (ext_codes->dst_cont_a_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    147             num_ext_codes++;
    148         }
    149         if (ext_codes->dst_cont_b_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    150             num_ext_codes++;
    151         }
    152         if (ext_codes->ipbm_present != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    153             num_ext_codes++;
    154         }
    155         if (ext_codes->normalize_l3_l4_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    156             num_ext_codes++;
    157         }
    158         if (ext_codes->normalize_mac_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    159             num_ext_codes++;
    160         }
    161         if (ext_codes->udf_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    162             num_ext_codes++;
    163         }
    164         if (ext_codes->alt_ttl_fn_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    165             num_ext_codes++;
    166         }
    167         if (ext_codes->ltid_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    168             num_ext_codes++;
    169         }
    170         for (pmux_idx = 0; pmux_idx < 15; pmux_idx++) {
    171             if (ext_codes->pmux_sel[pmux_idx] == 1) {
    172                 num_ext_codes++;
    173             }
    174         }
    175     }
    176 
    177     if (num_ext_codes == 0) {
    178         BCMI_KEYGEN_RETURN_VAL_EXIT(BCM_E_NONE);
    179     }
    180 
    181     keygen_oper->ext_ctrl_sel_info_count = num_ext_codes;
    182     BCMI_KEYGEN_ALLOC(keygen_oper->ext_ctrl_sel_info,
    183                       sizeof(bcmi_keygen_ext_ctrl_sel_info_t) * num_ext_codes,
    184                       "Keygen Extractor codes");
    185     ext_ctrl_info = keygen_oper->ext_ctrl_sel_info;
    186     for (level = 1; level < (keygen_md->num_ext_levels + 1); level++) {
    187         for (ext_idx = 0;
    188             ext_idx < keygen_md->ext_cfg_db->conf_size[level];
    189             ext_idx++) {
    190             ext_cfg =  keygen_md->ext_cfg_db->ext_cfg[level] + ext_idx;
    191             if (SHR_BITGET(ext_cfg->ext_attrs.w,
    192                    BCMI_KEYGEN_EXT_ATTR_PASS_THRU)) {
    193                 continue;
    194             }
    195             if (SHR_BITGET(ext_cfg->ext_attrs.w,
    196                     BCMI_KEYGEN_EXT_ATTR_NOT_WITH_QSET_UPDATE)) {
    197                 continue;
    198             }
    199             if (ext_cfg->in_use == TRUE) {
    200                 ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_MULTIPLEXER;
    201                 finfo = ext_cfg->finfo;
    202                 ext_ctrl_info[idx].ctrl_sel_val = finfo->sec_val;
    203                 ext_ctrl_info[idx].ext_num =
    204                     BCMI_KEYGEN_EXT_ID_NUM_GET(ext_cfg->ext_id);
    205                 ext_ctrl_info[idx].part =
    206                     BCMI_KEYGEN_EXT_ID_PART_GET(ext_cfg->ext_id);
    207                 ext_ctrl_info[idx].level =
    208                     BCMI_KEYGEN_EXT_ID_LEVEL_GET(ext_cfg->ext_id);
    209                 ext_ctrl_info[idx].gran =
    210                     BCMI_KEYGEN_EXT_ID_GRAN_GET(ext_cfg->ext_id);
    211                 idx++;
    212             }
    213         }
    214     }
    215     for (part = 0; part < keygen_cfg->num_parts; part++) {
    216         ext_codes = &(keygen_md->ext_codes[part]);
    217         if (ext_codes->aux_tag_a_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    218             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A;
    219             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->aux_tag_a_sel;
    220             ext_ctrl_info[idx].part = part;
    221             idx++;
    222         }
    223         if (ext_codes->aux_tag_b_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    224             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B;
    225             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->aux_tag_b_sel;
    226             ext_ctrl_info[idx].part = part;
    227             idx++;
    228         }
    229         if (ext_codes->aux_tag_c_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    230             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C;
    231             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->aux_tag_c_sel;
    232             ext_ctrl_info[idx].part = part;
    233             idx++;
    234         }
    235         if (ext_codes->aux_tag_d_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    236             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D;
    237             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->aux_tag_d_sel;
    238             ext_ctrl_info[idx].part = part;
    239             idx++;
    240         }
    241         if (ext_codes->ttl_fn_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    242             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN;
    243             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->ttl_fn_sel;
    244             ext_ctrl_info[idx].part = part;
    245             idx++;
    246         }
    247         if (ext_codes->tcp_fn_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    248             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN;
    249             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->tcp_fn_sel;
    250             ext_ctrl_info[idx].part = part;
    251             idx++;
    252         }
    253         if (ext_codes->tos_fn_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    254             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN;
    255             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->tos_fn_sel;
    256             ext_ctrl_info[idx].part = part;
    257             idx++;
    258         }
    259         if (ext_codes->class_id_cont_a_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    260             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A;
    261             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->class_id_cont_a_sel;
    262             ext_ctrl_info[idx].part = part;
    263             idx++;
    264         }
    265         if (ext_codes->class_id_cont_b_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    266             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B;
    267             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->class_id_cont_b_sel;
    268             ext_ctrl_info[idx].part = part;
    269             idx++;
    270         }
    271         if (ext_codes->class_id_cont_c_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    272             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C;
    273             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->class_id_cont_c_sel;
    274             ext_ctrl_info[idx].part = part;
    275             idx++;
    276         }
    277         if (ext_codes->class_id_cont_d_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    278             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D;
    279             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->class_id_cont_d_sel;
    280             ext_ctrl_info[idx].part = part;
    281             idx++;
    282         }
    283         if (ext_codes->src_dest_cont_0_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    284             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0;
    285             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->src_dest_cont_0_sel;
    286             ext_ctrl_info[idx].part = part;
    287             idx++;
    288         }
    289         if (ext_codes->src_dest_cont_1_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    290             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1;
    291             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->src_dest_cont_1_sel;
    292             ext_ctrl_info[idx].part = part;
    293             idx++;
    294         }
    295         if (ext_codes->src_cont_a_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    296             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A;
    297             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->src_cont_a_sel;
    298             ext_ctrl_info[idx].part = part;
    299             idx++;
    300         }
    301         if (ext_codes->src_cont_b_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    302             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B;
    303             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->src_cont_b_sel;
    304             ext_ctrl_info[idx].part = part;
    305             idx++;
    306         }
    307         if (ext_codes->dst_cont_a_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    308             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_DST_A;
    309             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->dst_cont_a_sel;
    310             ext_ctrl_info[idx].part = part;
    311             idx++;
    312         }
    313         if (ext_codes->dst_cont_b_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    314             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_DST_B;
    315             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->dst_cont_b_sel;
    316             ext_ctrl_info[idx].part = part;
    317             idx++;
    318         }
    319         if (ext_codes->ipbm_present != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    320             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT;
    321             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->ipbm_source;
    322             ext_ctrl_info[idx].part = part;
    323             idx++;
    324         }
    325         if (ext_codes->normalize_l3_l4_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    326             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_L3_L4_NORM;
    327             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->normalize_l3_l4_sel;
    328             ext_ctrl_info[idx].part = part;
    329             idx++;
    330         }
    331         if (ext_codes->normalize_mac_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    332             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_MAC_NORM;
    333             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->normalize_mac_sel;
    334             ext_ctrl_info[idx].part = part;
    335             idx++;
    336         }
    337         if (ext_codes->udf_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    338             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_UDF;
    339             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->udf_sel;
    340             ext_ctrl_info[idx].part = part;
    341             idx++;
    342         }
    343         if (ext_codes->ltid_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    344             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_LTID;
    345             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->ltid_sel;
    346             ext_ctrl_info[idx].part = part;
    347             idx++;
    348         }
    349         for (pmux_idx = 0; pmux_idx < 15; pmux_idx++) {
    350             if (ext_codes->pmux_sel[pmux_idx] == 1) {
    351                 ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_PMUX;
    352                 ext_ctrl_info[idx].ctrl_sel_val = pmux_idx;
    353                 ext_ctrl_info[idx].part = part;
    354                 idx++;
    355             }
    356         }
    357         if (ext_codes->alt_ttl_fn_sel != BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    358             ext_ctrl_info[idx].ctrl_sel = BCMI_KEYGEN_EXT_CTRL_SEL_ALT_TTL_FN;
    359             ext_ctrl_info[idx].ctrl_sel_val = ext_codes->alt_ttl_fn_sel;
    360             ext_ctrl_info[idx].part = part;
    361             idx++;
    362         }
    363     }
    364 
    365     BCMI_KEYGEN_IF_ERR_EXIT((idx != num_ext_codes) ? BCM_E_INTERNAL : BCM_E_NONE);
    366 
    367 exit:
    368     BCMI_KEYGEN_FUNC_EXIT();
    369 }
    370 
    371 int
    372 bcmi_keygen_ext_codes_validate(int unit,
    373                                uint8 part,
    374                                bcmi_keygen_cfg_t *keygen_cfg,
    375                                bcmi_keygen_md_t *keygen_md)
    376 {
    377     uint8 idx = 0;
    378     bcmi_keygen_ext_field_info_t *finfo = NULL;
    379     bcmi_keygen_ext_ctrl_sel_info_t *keygen_ext_code = NULL;
    380     bcmi_keygen_ext_sel_t *grp_ext_code = NULL;
    381 
    382     BCMI_KEYGEN_FUNC_ENTER(unit);
    383 
    384     BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM);
    385     BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM);
    386 
    387     BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(
    388         bcmi_keygen_ext_codes_init(unit, &(keygen_md->ext_codes[part])));
    389     for (idx = 0; idx < keygen_cfg->ext_ctrl_sel_info_count; idx++) {
    390         keygen_ext_code = &(keygen_cfg->ext_ctrl_sel_info[idx]);
    391         grp_ext_code = &(keygen_md->ext_codes[keygen_ext_code->part]);
    392         if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A) {
    393             grp_ext_code->aux_tag_a_sel = keygen_ext_code->ctrl_sel_val;
    394         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B) {
    395             grp_ext_code->aux_tag_b_sel = keygen_ext_code->ctrl_sel_val;
    396         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C) {
    397             grp_ext_code->aux_tag_c_sel = keygen_ext_code->ctrl_sel_val;
    398         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D) {
    399             grp_ext_code->aux_tag_d_sel = keygen_ext_code->ctrl_sel_val;
    400         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN) {
    401             grp_ext_code->tcp_fn_sel = keygen_ext_code->ctrl_sel_val;
    402         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN) {
    403             grp_ext_code->tos_fn_sel = keygen_ext_code->ctrl_sel_val;
    404         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN) {
    405             grp_ext_code->ttl_fn_sel = keygen_ext_code->ctrl_sel_val;
    406         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A) {
    407             grp_ext_code->class_id_cont_a_sel = keygen_ext_code->ctrl_sel_val;
    408         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B) {
    409             grp_ext_code->class_id_cont_b_sel = keygen_ext_code->ctrl_sel_val;
    410         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C) {
    411             grp_ext_code->class_id_cont_c_sel = keygen_ext_code->ctrl_sel_val;
    412         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D) {
    413             grp_ext_code->class_id_cont_d_sel = keygen_ext_code->ctrl_sel_val;
    414         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A) {
    415             grp_ext_code->src_cont_a_sel = keygen_ext_code->ctrl_sel_val;
    416         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B) {
    417             grp_ext_code->src_cont_b_sel = keygen_ext_code->ctrl_sel_val;
    418         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_DST_A) {
    419             grp_ext_code->dst_cont_a_sel = keygen_ext_code->ctrl_sel_val;
    420         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_DST_B) {
    421             grp_ext_code->dst_cont_b_sel = keygen_ext_code->ctrl_sel_val;
    422         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0) {
    423             grp_ext_code->src_dest_cont_0_sel = keygen_ext_code->ctrl_sel_val;
    424         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1) {
    425             grp_ext_code->src_dest_cont_1_sel = keygen_ext_code->ctrl_sel_val;
    426         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT) {
    427             grp_ext_code->ipbm_present = 1;
    428             grp_ext_code->ipbm_source = keygen_ext_code->ctrl_sel_val;
    429         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_L3_L4_NORM) {
    430             grp_ext_code->normalize_l3_l4_sel = keygen_ext_code->ctrl_sel_val;
    431         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_MAC_NORM) {
    432             grp_ext_code->normalize_mac_sel = keygen_ext_code->ctrl_sel_val;
    433         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_UDF) {
    434             grp_ext_code->udf_sel = keygen_ext_code->ctrl_sel_val;
    435         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_ALT_TTL_FN) {
    436             grp_ext_code->alt_ttl_fn_sel = keygen_ext_code->ctrl_sel_val;
    437         } else if (keygen_ext_code->ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_LTID) {
    438             grp_ext_code->ltid_sel = keygen_ext_code->ctrl_sel_val;
    439         } else {
    440             continue;
    441         }
    442     }
    443     for (idx = 0; idx < BCMI_KEYGEN_EXT_FIELDS_MAX; idx++) {
    444        finfo = &(keygen_md->finfo[idx]);
    445        if (finfo->section == BCMI_KEYGEN_EXT_SECTION_DISABLE) {
    446           break;
    447        }
    448        if (finfo->part != part) {
    449            continue;
    450        }
    451        switch (finfo->pri_ctrl_sel[0]) {
    452            case BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_A:
    453                if (keygen_md->ext_codes[part].aux_tag_a_sel ==
    454                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    455                    keygen_md->ext_codes[part].aux_tag_a_sel =
    456                                   finfo->pri_ctrl_sel_val[0];
    457                } else if (keygen_md->ext_codes[part].aux_tag_a_sel !=
    458                           finfo->pri_ctrl_sel_val[0]) {
    459                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    460                }
    461                break;
    462            case BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_B:
    463                if (keygen_md->ext_codes[part].aux_tag_b_sel ==
    464                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    465                    keygen_md->ext_codes[part].aux_tag_b_sel =
    466                                   finfo->pri_ctrl_sel_val[0];
    467                } else if (keygen_md->ext_codes[part].aux_tag_b_sel !=
    468                           finfo->pri_ctrl_sel_val[0]) {
    469                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    470                }
    471                break;
    472            case BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_C:
    473                if (keygen_md->ext_codes[part].aux_tag_c_sel ==
    474                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    475                    keygen_md->ext_codes[part].aux_tag_c_sel =
    476                                   finfo->pri_ctrl_sel_val[0];
    477                } else if (keygen_md->ext_codes[part].aux_tag_c_sel !=
    478                           finfo->pri_ctrl_sel_val[0]) {
    479                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    480                }
    481                break;
    482            case BCMI_KEYGEN_EXT_CTRL_SEL_AUX_TAG_D:
    483                if (keygen_md->ext_codes[part].aux_tag_d_sel ==
    484                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    485                    keygen_md->ext_codes[part].aux_tag_d_sel =
    486                                   finfo->pri_ctrl_sel_val[0];
    487                } else if (keygen_md->ext_codes[part].aux_tag_d_sel !=
    488                           finfo->pri_ctrl_sel_val[0]) {
    489                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    490                }
    491                break;
    492            case BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_A:
    493                if (keygen_md->ext_codes[part].class_id_cont_a_sel ==
    494                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    495                    keygen_md->ext_codes[part].class_id_cont_a_sel =
    496                                   finfo->pri_ctrl_sel_val[0];
    497                } else if (keygen_md->ext_codes[part].class_id_cont_a_sel !=
    498                           finfo->pri_ctrl_sel_val[0]) {
    499                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    500                }
    501                break;
    502            case BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_B:
    503                if (keygen_md->ext_codes[part].class_id_cont_b_sel ==
    504                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    505                    keygen_md->ext_codes[part].class_id_cont_b_sel =
    506                                   finfo->pri_ctrl_sel_val[0];
    507                } else if (keygen_md->ext_codes[part].class_id_cont_b_sel !=
    508                           finfo->pri_ctrl_sel_val[0]) {
    509                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    510                }
    511                break;
    512            case BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C:
    513                if (keygen_md->ext_codes[part].class_id_cont_c_sel ==
    514                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    515                    keygen_md->ext_codes[part].class_id_cont_c_sel =
    516                                   finfo->pri_ctrl_sel_val[0];
    517                } else if (keygen_md->ext_codes[part].class_id_cont_c_sel !=
    518                           finfo->pri_ctrl_sel_val[0]) {
    519                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    520                }
    521                break;
    522            case BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D:
    523                if (keygen_md->ext_codes[part].class_id_cont_d_sel ==
    524                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    525                    keygen_md->ext_codes[part].class_id_cont_d_sel =
    526                                   finfo->pri_ctrl_sel_val[0];
    527                } else if (keygen_md->ext_codes[part].class_id_cont_d_sel !=
    528                           finfo->pri_ctrl_sel_val[0]) {
    529                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    530                }
    531                break;
    532            case BCMI_KEYGEN_EXT_CTRL_SEL_TCP_FN:
    533                if (keygen_md->ext_codes[part].tcp_fn_sel ==
    534                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    535                    keygen_md->ext_codes[part].tcp_fn_sel =
    536                                   finfo->pri_ctrl_sel_val[0];
    537                } else if (keygen_md->ext_codes[part].tcp_fn_sel !=
    538                           finfo->pri_ctrl_sel_val[0]) {
    539                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    540                }
    541                break;
    542            case BCMI_KEYGEN_EXT_CTRL_SEL_TTL_FN:
    543                if (keygen_md->ext_codes[part].ttl_fn_sel ==
    544                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    545                    keygen_md->ext_codes[part].ttl_fn_sel =
    546                                   finfo->pri_ctrl_sel_val[0];
    547                } else if (keygen_md->ext_codes[part].ttl_fn_sel !=
    548                           finfo->pri_ctrl_sel_val[0]) {
    549                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    550                }
    551                break;
    552            case BCMI_KEYGEN_EXT_CTRL_SEL_TOS_FN:
    553                if (keygen_md->ext_codes[part].tos_fn_sel ==
    554                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    555                    keygen_md->ext_codes[part].tos_fn_sel =
    556                                   finfo->pri_ctrl_sel_val[0];
    557                } else if (keygen_md->ext_codes[part].tos_fn_sel !=
    558                           finfo->pri_ctrl_sel_val[0]) {
    559                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    560                }
    561                break;
    562            case BCMI_KEYGEN_EXT_CTRL_SEL_SRC_A:
    563                if (keygen_md->ext_codes[part].src_cont_a_sel ==
    564                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    565                    keygen_md->ext_codes[part].src_cont_a_sel =
    566                                   finfo->pri_ctrl_sel_val[0];
    567                } else if (keygen_md->ext_codes[part].src_cont_a_sel !=
    568                           finfo->pri_ctrl_sel_val[0]) {
    569                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    570                }
    571                break;
    572            case BCMI_KEYGEN_EXT_CTRL_SEL_SRC_B:
    573                if (keygen_md->ext_codes[part].src_cont_b_sel ==
    574                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    575                    keygen_md->ext_codes[part].src_cont_b_sel =
    576                                   finfo->pri_ctrl_sel_val[0];
    577                } else if (keygen_md->ext_codes[part].src_cont_b_sel !=
    578                           finfo->pri_ctrl_sel_val[0]) {
    579                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    580                }
    581                break;
    582            case BCMI_KEYGEN_EXT_CTRL_SEL_DST_A:
    583                if (keygen_md->ext_codes[part].dst_cont_a_sel ==
    584                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    585                    keygen_md->ext_codes[part].dst_cont_a_sel =
    586                                   finfo->pri_ctrl_sel_val[0];
    587                } else if (keygen_md->ext_codes[part].dst_cont_a_sel !=
    588                           finfo->pri_ctrl_sel_val[0]) {
    589                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    590                }
    591                break;
    592            case BCMI_KEYGEN_EXT_CTRL_SEL_DST_B:
    593                if (keygen_md->ext_codes[part].dst_cont_b_sel ==
    594                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    595                    keygen_md->ext_codes[part].dst_cont_b_sel =
    596                                   finfo->pri_ctrl_sel_val[0];
    597                } else if (keygen_md->ext_codes[part].dst_cont_b_sel !=
    598                           finfo->pri_ctrl_sel_val[0]) {
    599                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    600                }
    601                break;
    602            case BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0:
    603                if (keygen_md->ext_codes[part].src_dest_cont_0_sel ==
    604                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    605                    keygen_md->ext_codes[part].src_dest_cont_0_sel =
    606                                   finfo->pri_ctrl_sel_val[0];
    607                } else if (keygen_md->ext_codes[part].src_dest_cont_0_sel !=
    608                           finfo->pri_ctrl_sel_val[0]) {
    609                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    610                }
    611                break;
    612            case BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1:
    613                if (keygen_md->ext_codes[part].src_dest_cont_1_sel ==
    614                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    615                    keygen_md->ext_codes[part].src_dest_cont_1_sel =
    616                                   finfo->pri_ctrl_sel_val[0];
    617                } else if (keygen_md->ext_codes[part].src_dest_cont_1_sel !=
    618                           finfo->pri_ctrl_sel_val[0]) {
    619                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    620                }
    621                break;
    622            case BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT:
    623                if (keygen_md->ext_codes[0].ipbm_source ==
    624                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    625                    keygen_md->ext_codes[0].ipbm_source =
    626                                   finfo->pri_ctrl_sel_val[0];
    627                } else if (keygen_md->ext_codes[0].ipbm_source !=
    628                           finfo->pri_ctrl_sel_val[0]) {
    629                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    630                }
    631                break;
    632            case BCMI_KEYGEN_EXT_CTRL_SEL_L3_L4_NORM:
    633                if (keygen_md->ext_codes[part].normalize_l3_l4_sel ==
    634                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    635                    keygen_md->ext_codes[part].normalize_l3_l4_sel =
    636                                   finfo->pri_ctrl_sel_val[0];
    637                } else if (keygen_md->ext_codes[part].normalize_l3_l4_sel !=
    638                           finfo->pri_ctrl_sel_val[0]) {
    639                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    640                }
    641                break;
    642            case BCMI_KEYGEN_EXT_CTRL_SEL_MAC_NORM:
    643                if (keygen_md->ext_codes[part].normalize_mac_sel ==
    644                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    645                    keygen_md->ext_codes[part].normalize_mac_sel =
    646                                   finfo->pri_ctrl_sel_val[0];
    647                } else if (keygen_md->ext_codes[part].normalize_mac_sel !=
    648                           finfo->pri_ctrl_sel_val[0]) {
    649                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    650                }
    651                break;
    652            case BCMI_KEYGEN_EXT_CTRL_SEL_UDF:
    653                if (keygen_md->ext_codes[part].udf_sel ==
    654                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    655                    keygen_md->ext_codes[part].udf_sel =
    656                                   finfo->pri_ctrl_sel_val[0];
    657                } else if (keygen_md->ext_codes[part].udf_sel !=
    658                           finfo->pri_ctrl_sel_val[0]) {
    659                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    660                }
    661                break;
    662            case BCMI_KEYGEN_EXT_CTRL_SEL_ALT_TTL_FN:
    663                if (keygen_md->ext_codes[part].alt_ttl_fn_sel ==
    664                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    665                    keygen_md->ext_codes[part].alt_ttl_fn_sel =
    666                                   finfo->pri_ctrl_sel_val[0];
    667                } else if (keygen_md->ext_codes[part].alt_ttl_fn_sel !=
    668                           finfo->pri_ctrl_sel_val[0]) {
    669                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    670                }
    671                break;
    672            case BCMI_KEYGEN_EXT_CTRL_SEL_LTID:
    673                if (keygen_md->ext_codes[part].ltid_sel ==
    674                    BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) {
    675                    keygen_md->ext_codes[part].ltid_sel =
    676                                   finfo->pri_ctrl_sel_val[0];
    677                } else if (keygen_md->ext_codes[part].ltid_sel !=
    678                           finfo->pri_ctrl_sel_val[0]) {
    679                    BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT(BCM_E_RESOURCE);
    680                }
    681                break;
    682            case BCMI_KEYGEN_EXT_CTRL_SEL_DISABLE:
    683                break;
    684            default:
    685                BCMI_KEYGEN_IF_ERR_EXIT(BCM_E_INTERNAL);
    686        }
    687     }
    688 
    689 exit:
    690     BCMI_KEYGEN_FUNC_EXIT();
    691 }
    692 
    693 int
    694 bcmi_keygen_ext_part_get(int unit,
    695                          bcmi_keygen_cfg_t *keygen_cfg,
    696                          bcmi_keygen_md_t *keygen_md,
    697                          bcmi_keygen_ext_field_info_t *finfo)
    698 {
    699     int8 part = -1;
    700     uint8 idx = 0;
    701     uint8 found_untried_part = FALSE;
    702     uint16 bits_extracted = 0;
    703     bcmi_keygen_ext_field_info_t *sticky_finfo = NULL;
    704 
    705     BCMI_KEYGEN_FUNC_ENTER(unit);
    706 
    707     BCMI_KEYGEN_NULL_CHECK(finfo, BCM_E_PARAM);
    708     BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM);
    709     BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM);
    710 
    711     if (keygen_cfg->flags & BCMI_KEYGEN_CFG_FLAGS_SERIAL_MUX_ALLOC) {
    712         for (idx = 0; idx < keygen_cfg->num_parts; idx++) {
    713             if (!(keygen_md->tried_part_bmp[0] & (1 << idx))) {
    714                 part = idx;
    715                 break;
    716             }
    717         }
    718     } else {
    719         if (finfo->pri_ctrl_sel[0] != BCMI_KEYGEN_EXT_CTRL_SEL_DISABLE) {
    720             BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT
    721                 (bcmi_keygen_ext_code_part_get(unit, keygen_md,
    722                                                finfo->pri_ctrl_sel[0],
    723                                                finfo->pri_ctrl_sel_val[0],
    724                                                &part));
    725         }
    726 
    727         if (part != -1 && !(keygen_md->tried_part_bmp[0] & (1 << part))) {
    728             keygen_md->tried_part_bmp[0] |= (1 << part);
    729             finfo->part = part;
    730             BCMI_KEYGEN_RETURN_VAL_EXIT(BCM_E_NONE);
    731         }
    732 
    733         for (idx = 0; idx < keygen_cfg->num_parts; idx++) {
    734             if (keygen_md->tried_part_bmp[0] & (1 << idx)) {
    735                 continue;
    736             }
    737             if (!found_untried_part) {
    738                 found_untried_part = TRUE;
    739                 part = idx;
    740                 bits_extracted = keygen_md->bits_extracted[idx][0];
    741                 continue;
    742             }
    743             if (bits_extracted > keygen_md->bits_extracted[idx][0]) {
    744                 part = idx;
    745                 bits_extracted = keygen_md->bits_extracted[idx][0];
    746             }
    747         }
    748     }
    749 
    750     if (part != -1) {
    751         keygen_md->tried_part_bmp[0] |= (1 << part);
    752         finfo->part = part;
    753     } else {
    754         BCMI_KEYGEN_IF_ERR_EXIT(BCM_E_INTERNAL);
    755     }
    756 
    757 exit:
    758     sticky_finfo = finfo->sticky;
    759     while (sticky_finfo != NULL) {
    760         sticky_finfo->part = finfo->part;
    761         sticky_finfo = sticky_finfo->sticky;
    762     }
    763     BCMI_KEYGEN_FUNC_EXIT();
    764 }
    765 
    766 int
    767 bcmi_keygen_ext_part_incr(int unit,
    768                           bcmi_keygen_cfg_t *keygen_cfg,
    769                           bcmi_keygen_md_t *keygen_md,
    770                           bcmi_keygen_ext_section_t section)
    771 {
    772     BCMI_KEYGEN_FUNC_ENTER(unit);
    773 
    774     BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM);
    775     BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM);
    776 
    777     if (keygen_md->next_part_id[0] == (keygen_cfg->num_parts - 1)) {
    778         keygen_md->next_part_id[0] = 0;
    779     } else {
    780         if (keygen_md->tried_part_bmp[0] &
    781            (1 << keygen_md->next_part_id[0])) {
    782             keygen_md->next_part_id[0]++;
    783         }
    784     }
    785 
    786 exit:
    787     BCMI_KEYGEN_FUNC_EXIT();
    788 
    789 }
    790 
    791 int
    792 bcmi_keygen_ext_ctrl_sel_validate(int unit,
    793                                bcmi_keygen_cfg_t *keygen_cfg,
    794                                bcmi_keygen_md_t *keygen_md)
    795 {
    796     uint8 idx = 0;
    797     uint8 qual_cfg_id = 0;
    798     bcm_field_qualify_t qual_id = bcmFieldQualifyCount;
    799     bcmi_keygen_qual_cfg_t *qual_cfg = NULL;
    800     bcmi_keygen_qual_cfg_info_t *qual_cfg_info = NULL;
    801 
    802     BCMI_KEYGEN_FUNC_ENTER(unit);
    803 
    804     BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM);
    805     BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM);
    806 
    807     sal_memset(keygen_md->pri_ctrl_sel_count, 0,
    808                (sizeof(uint8) * BCMI_KEYGEN_EXT_CTRL_SEL_COUNT));
    809     sal_memset(keygen_md->pri_ctrl_sel_values, 0,
    810                (sizeof(uint32) * BCMI_KEYGEN_EXT_CTRL_SEL_COUNT));
    811     for (idx = 0; idx < keygen_cfg->qual_info_count; idx++) {
    812         qual_cfg_id = keygen_md->qual_cfg_id_arr[idx];
    813         qual_id = keygen_cfg->qual_info_arr[idx].qual_id;
    814         qual_cfg_info = keygen_md->qual_cfg_info[qual_id];
    815         if (qual_cfg_info == NULL) {
    816             continue;
    817         }
    818         qual_cfg = &(qual_cfg_info->qual_cfg_arr[qual_cfg_id]);
    819         if (SHR_BITGET(qual_cfg->qual_flags.w,
    820             BCMI_KEYGEN_QUAL_FLAGS_PMUX)) {
    821             continue;
    822         }
    823         if (qual_cfg->pri_ctrl_sel ==
    824             BCMI_KEYGEN_EXT_CTRL_SEL_DISABLE) {
    825             continue;
    826         }
    827         /*
    828          * Check whether same primary control sel value was used
    829          * by given qset.
    830          */
    831         if (keygen_md->pri_ctrl_sel_values[qual_cfg->pri_ctrl_sel]
    832             & (1 << qual_cfg->pri_ctrl_sel_val)) {
    833             continue;
    834         }
    835         keygen_md->pri_ctrl_sel_values[qual_cfg->pri_ctrl_sel] |= (1 << qual_cfg->pri_ctrl_sel_val);
    836         keygen_md->pri_ctrl_sel_count[qual_cfg->pri_ctrl_sel] += 1;
    837     }
    838     for (idx = 0; idx < BCMI_KEYGEN_EXT_CTRL_SEL_COUNT; idx++) {
    839         if (keygen_md->pri_ctrl_sel_count[idx] > keygen_cfg->num_parts) {
    840             BCMI_KEYGEN_RETURN_VAL_EXIT(BCM_E_RESOURCE);
    841         }
    842     }
    843 exit:
    844     BCMI_KEYGEN_FUNC_EXIT();
    845 }
    846