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