/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2020 Broadcom
+ * Copyright(c) 2019-2021 Broadcom
* All rights reserved.
*/
struct ulp_rte_act_prop act_prop;
struct ulp_rte_act_bitmap act = { 0 };
struct bnxt_ulp_context *ulp_ctx;
- uint32_t type, ulp_flags = 0;
- int rc;
+ uint32_t type, ulp_flags = 0, fid;
+ int rc = 0;
memset(&mapper_params, 0, sizeof(mapper_params));
memset(hdr_field, 0, sizeof(hdr_field));
mapper_params.act = &act;
mapper_params.act_prop = &act_prop;
mapper_params.comp_fld = comp_fld;
+ mapper_params.class_tid = ulp_class_tid;
+ mapper_params.flow_type = BNXT_ULP_FDB_TYPE_DEFAULT;
ulp_ctx = bnxt_ulp_eth_dev_ptr2_cntxt_get(eth_dev);
if (!ulp_ctx) {
type = param_list->type;
}
- mapper_params.class_tid = ulp_class_tid;
+ /* Get the function id */
+ if (ulp_port_db_port_func_id_get(ulp_ctx,
+ eth_dev->data->port_id,
+ &mapper_params.func_id)) {
+ BNXT_TF_DBG(ERR, "conversion of port to func id failed\n");
+ goto err1;
+ }
- rc = ulp_mapper_flow_create(ulp_ctx, &mapper_params, flow_id);
+ /* Protect flow creation */
+ if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) {
+ BNXT_TF_DBG(ERR, "Flow db lock acquire failed\n");
+ goto err1;
+ }
+
+ rc = ulp_flow_db_fid_alloc(ulp_ctx, BNXT_ULP_FDB_TYPE_DEFAULT,
+ mapper_params.func_id, &fid);
if (rc) {
- BNXT_TF_DBG(ERR, "Failed to create default flow.\n");
- return rc;
+ BNXT_TF_DBG(ERR, "Unable to allocate flow table entry\n");
+ goto err2;
}
+ mapper_params.flow_id = fid;
+ rc = ulp_mapper_flow_create(ulp_ctx, &mapper_params);
+ if (rc)
+ goto err3;
+
+ bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
+ *flow_id = fid;
return 0;
+
+err3:
+ ulp_flow_db_fid_free(ulp_ctx, BNXT_ULP_FDB_TYPE_DEFAULT, fid);
+err2:
+ bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
+err1:
+ BNXT_TF_DBG(ERR, "Failed to create default flow.\n");
+ return rc;
}
/*
return rc;
}
- rc = ulp_mapper_flow_destroy(ulp_ctx, flow_id,
- BNXT_ULP_DEFAULT_FLOW_TABLE);
+ if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) {
+ BNXT_TF_DBG(ERR, "Flow db lock acquire failed\n");
+ return -EINVAL;
+ }
+ rc = ulp_mapper_flow_destroy(ulp_ctx, BNXT_ULP_FDB_TYPE_DEFAULT,
+ flow_id);
if (rc)
BNXT_TF_DBG(ERR, "Failed to destroy flow.\n");
+ bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
return rc;
}
bnxt_ulp_destroy_df_rules(struct bnxt *bp, bool global)
{
struct bnxt_ulp_df_rule_info *info;
- uint8_t port_id;
+ uint16_t port_id;
if (!BNXT_TRUFLOW_EN(bp) ||
BNXT_ETH_DEV_IS_REPRESENTOR(bp->eth_dev))
bnxt_ulp_create_df_rules(struct bnxt *bp)
{
struct bnxt_ulp_df_rule_info *info;
- uint8_t port_id;
+ uint16_t port_id;
int rc;
if (!BNXT_TRUFLOW_EN(bp) ||
struct rte_eth_dev *parent_dev = vfr->parent_dev;
struct bnxt *bp = parent_dev->data->dev_private;
uint16_t vfr_port_id = vfr_ethdev->data->port_id;
- uint8_t port_id;
+ uint16_t port_id;
int rc;
if (!bp || !BNXT_TRUFLOW_EN(bp))