X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fnet%2Fbnxt%2Ftf_ulp%2Fulp_flow_db.c;h=ab6013f0e3348507786a29ac955b481168f91f47;hb=1e5acc5be59bae297e75d4ba14ee2b625df40fa1;hp=8537388da6d1930e006a5a7b1a2de3705935cf8c;hpb=a2417601896f0263561383ec5a3dfe026ebe9e30;p=dpdk.git diff --git a/drivers/net/bnxt/tf_ulp/ulp_flow_db.c b/drivers/net/bnxt/tf_ulp/ulp_flow_db.c index 8537388da6..ab6013f0e3 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_flow_db.c +++ b/drivers/net/bnxt/tf_ulp/ulp_flow_db.c @@ -85,19 +85,21 @@ ulp_flow_db_active_flows_bit_is_set(struct bnxt_ulp_flow_db *flow_db, { struct bnxt_ulp_flow_tbl *f_tbl = &flow_db->flow_tbl; uint32_t a_idx = idx / ULP_INDEX_BITMAP_SIZE; - - if (flow_type == BNXT_ULP_FDB_TYPE_REGULAR) - return ULP_INDEX_BITMAP_GET(f_tbl->active_reg_flows[a_idx], - idx); - else if (flow_type == BNXT_ULP_FDB_TYPE_DEFAULT) - return ULP_INDEX_BITMAP_GET(f_tbl->active_dflt_flows[a_idx], - idx); - else if (flow_type == BNXT_ULP_FDB_TYPE_RID) - return (ULP_INDEX_BITMAP_GET(f_tbl->active_reg_flows[a_idx], - idx) && - ULP_INDEX_BITMAP_GET(f_tbl->active_reg_flows[a_idx], - idx)); - return 0; + uint32_t reg, dflt; + + reg = ULP_INDEX_BITMAP_GET(f_tbl->active_reg_flows[a_idx], idx); + dflt = ULP_INDEX_BITMAP_GET(f_tbl->active_dflt_flows[a_idx], idx); + + switch (flow_type) { + case BNXT_ULP_FDB_TYPE_REGULAR: + return (reg && !dflt); + case BNXT_ULP_FDB_TYPE_DEFAULT: + return (!reg && dflt); + case BNXT_ULP_FDB_TYPE_RID: + return (reg && dflt); + default: + return 0; + } } static inline enum tf_dir @@ -114,7 +116,7 @@ ulp_flow_db_resource_func_get(struct ulp_fdb_resource_info *res_info) func = (((res_info->nxt_resource_idx & ULP_FLOW_DB_RES_FUNC_MASK) >> ULP_FLOW_DB_RES_FUNC_BITS) << ULP_FLOW_DB_RES_FUNC_UPPER); - /* The reource func is split into upper and lower */ + /* The resource func is split into upper and lower */ if (func & ULP_FLOW_DB_RES_FUNC_NEED_LOWER) return (func | res_info->resource_func_lower); return func; @@ -150,12 +152,11 @@ ulp_flow_db_res_params_to_info(struct ulp_fdb_resource_info *resource_info, } /* Store the handle as 64bit only for EM table entries */ - if (params->resource_func != BNXT_ULP_RESOURCE_FUNC_EXT_EM_TABLE && - params->resource_func != BNXT_ULP_RESOURCE_FUNC_INT_EM_TABLE) { + if (params->resource_func != BNXT_ULP_RESOURCE_FUNC_EM_TABLE) { resource_info->resource_hndl = (uint32_t)params->resource_hndl; resource_info->resource_type = params->resource_type; resource_info->resource_sub_type = params->resource_sub_type; - resource_info->reserved = params->reserved; + resource_info->fdb_flags = params->fdb_flags; } else { resource_info->resource_em_handle = params->resource_hndl; } @@ -180,14 +181,13 @@ ulp_flow_db_res_info_to_params(struct ulp_fdb_resource_info *resource_info, params->direction = ulp_flow_db_resource_dir_get(resource_info); params->resource_func = ulp_flow_db_resource_func_get(resource_info); - if (params->resource_func == BNXT_ULP_RESOURCE_FUNC_EXT_EM_TABLE || - params->resource_func == BNXT_ULP_RESOURCE_FUNC_INT_EM_TABLE) { + if (params->resource_func == BNXT_ULP_RESOURCE_FUNC_EM_TABLE) { params->resource_hndl = resource_info->resource_em_handle; } else if (params->resource_func & ULP_FLOW_DB_RES_FUNC_NEED_LOWER) { params->resource_hndl = resource_info->resource_hndl; params->resource_type = resource_info->resource_type; params->resource_sub_type = resource_info->resource_sub_type; - params->reserved = resource_info->reserved; + params->fdb_flags = resource_info->fdb_flags; } } @@ -522,7 +522,9 @@ ulp_flow_db_init(struct bnxt_ulp_context *ulp_ctxt) bnxt_ulp_cntxt_ptr2_flow_db_set(ulp_ctxt, flow_db); /* Determine the number of flows based on EM type */ - bnxt_ulp_cntxt_mem_type_get(ulp_ctxt, &mtype); + if (bnxt_ulp_cntxt_mem_type_get(ulp_ctxt, &mtype)) + goto error_free; + if (mtype == BNXT_ULP_FLOW_MEM_TYPE_INT) num_flows = dparms->int_flow_db_num_entries; else @@ -676,6 +678,7 @@ ulp_flow_db_resource_add(struct bnxt_ulp_context *ulp_ctxt, struct bnxt_ulp_flow_db *flow_db; struct bnxt_ulp_flow_tbl *flow_tbl; struct ulp_fdb_resource_info *resource, *fid_resource; + struct bnxt_ulp_fc_info *ulp_fc_info; uint32_t idx; flow_db = bnxt_ulp_cntxt_ptr2_flow_db_get(ulp_ctxt); @@ -709,6 +712,12 @@ ulp_flow_db_resource_add(struct bnxt_ulp_context *ulp_ctxt, } fid_resource = &flow_tbl->flow_resources[fid]; + if (params->critical_resource && fid_resource->resource_em_handle) { + BNXT_TF_DBG(DEBUG, "Ignore multiple critical resources\n"); + /* Ignore the multiple critical resources */ + params->critical_resource = BNXT_ULP_CRITICAL_RESOURCE_NO; + } + if (!params->critical_resource) { /* Not the critical_resource so allocate a resource */ idx = flow_tbl->flow_tbl_stack[flow_tbl->tail_index]; @@ -728,9 +737,11 @@ ulp_flow_db_resource_add(struct bnxt_ulp_context *ulp_ctxt, ulp_flow_db_res_params_to_info(fid_resource, params); } + ulp_fc_info = bnxt_ulp_cntxt_ptr2_fc_info_get(ulp_ctxt); if (params->resource_type == TF_TBL_TYPE_ACT_STATS_64 && params->resource_sub_type == - BNXT_ULP_RESOURCE_SUB_TYPE_INDEX_TABLE_INT_COUNT) { + BNXT_ULP_RESOURCE_SUB_TYPE_INDEX_TABLE_INT_COUNT && + ulp_fc_info && ulp_fc_info->num_counters) { /* Store the first HW counter ID for this table */ if (!ulp_fc_mgr_start_idx_isset(ulp_ctxt, params->direction)) ulp_fc_mgr_start_idx_set(ulp_ctxt, params->direction, @@ -755,7 +766,7 @@ ulp_flow_db_resource_add(struct bnxt_ulp_context *ulp_ctxt, * flow_type [in] Specify it is regular or default flow * fid [in] The index to the flow entry * params [in/out] The contents to be copied into params. - * Onlythe critical_resource needs to be set by the caller. + * Only the critical_resource needs to be set by the caller. * * Returns 0 on success and negative on failure. */ @@ -878,8 +889,9 @@ ulp_flow_db_fid_free(struct bnxt_ulp_context *ulp_ctxt, enum bnxt_ulp_fdb_type flow_type, uint32_t fid) { - struct bnxt_ulp_flow_db *flow_db; + struct bnxt_tun_cache_entry *tun_tbl; struct bnxt_ulp_flow_tbl *flow_tbl; + struct bnxt_ulp_flow_db *flow_db; flow_db = bnxt_ulp_cntxt_ptr2_flow_db_get(ulp_ctxt); if (!flow_db) { @@ -919,6 +931,12 @@ ulp_flow_db_fid_free(struct bnxt_ulp_context *ulp_ctxt, if (flow_type == BNXT_ULP_FDB_TYPE_REGULAR) ulp_flow_db_func_id_set(flow_db, fid, 0); + tun_tbl = bnxt_ulp_cntxt_ptr2_tun_tbl_get(ulp_ctxt); + if (!tun_tbl) + return -EINVAL; + + ulp_clear_tun_inner_entry(tun_tbl, fid); + /* all good, return success */ return 0; } @@ -1239,9 +1257,7 @@ ulp_flow_db_resource_params_get(struct bnxt_ulp_context *ulp_ctx, } } else if (resource_func == - BNXT_ULP_RESOURCE_FUNC_EXT_EM_TABLE || - resource_func == - BNXT_ULP_RESOURCE_FUNC_INT_EM_TABLE) { + BNXT_ULP_RESOURCE_FUNC_EM_TABLE) { ulp_flow_db_res_info_to_params(fid_res, params); return 0; @@ -1277,7 +1293,7 @@ ulp_default_flow_db_cfa_action_get(struct bnxt_ulp_context *ulp_ctx, BNXT_ULP_RESOURCE_FUNC_INDEX_TABLE, sub_typ, ¶ms); if (rc) { - BNXT_TF_DBG(ERR, "CFA Action ptr not found for flow id %u\n", + BNXT_TF_DBG(INFO, "CFA Action ptr not found for flow id %u\n", flow_id); return -ENOENT; } @@ -1827,9 +1843,8 @@ ulp_flow_db_parent_flow_count_update(struct bnxt_ulp_context *ulp_ctxt, */ int32_t ulp_flow_db_parent_flow_count_get(struct bnxt_ulp_context *ulp_ctxt, - uint32_t parent_fid, - uint64_t *packet_count, - uint64_t *byte_count) + uint32_t parent_fid, uint64_t *packet_count, + uint64_t *byte_count, uint8_t count_reset) { struct bnxt_ulp_flow_db *flow_db; struct ulp_fdb_parent_child_db *p_pdb; @@ -1850,6 +1865,10 @@ ulp_flow_db_parent_flow_count_get(struct bnxt_ulp_context *ulp_ctxt, p_pdb->parent_flow_tbl[idx].pkt_count; *byte_count = p_pdb->parent_flow_tbl[idx].byte_count; + if (count_reset) { + p_pdb->parent_flow_tbl[idx].pkt_count = 0; + p_pdb->parent_flow_tbl[idx].byte_count = 0; + } } return 0; } @@ -1887,3 +1906,18 @@ ulp_flow_db_parent_flow_count_reset(struct bnxt_ulp_context *ulp_ctxt) } } } + +/* + * Set the shared bit for the flow db entry + * + * res [in] Ptr to fdb entry + * shared [in] shared flag + * + * returns none + */ +void ulp_flow_db_shared_session_set(struct ulp_flow_db_res_params *res, + enum bnxt_ulp_shared_session shared) +{ + if (res && (shared & BNXT_ULP_SHARED_SESSION_YES)) + res->fdb_flags |= ULP_FDB_FLAG_SHARED_SESSION; +}