net/bnxt: fix L2 filter allocation
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index 3b9d3fb..40023a4 100644 (file)
@@ -194,6 +194,9 @@ static void bnxt_free_link_info(struct bnxt *bp)
 
 static void bnxt_free_leds_info(struct bnxt *bp)
 {
+       if (BNXT_VF(bp))
+               return;
+
        rte_free(bp->leds);
        bp->leds = NULL;
 }
@@ -263,6 +266,9 @@ static int bnxt_alloc_link_info(struct bnxt *bp)
 
 static int bnxt_alloc_leds_info(struct bnxt *bp)
 {
+       if (BNXT_VF(bp))
+               return 0;
+
        bp->leds = rte_zmalloc("bnxt_leds",
                               BNXT_MAX_LED * sizeof(struct bnxt_led_info),
                               0);
@@ -1162,73 +1168,6 @@ static int bnxt_handle_if_change_status(struct bnxt *bp)
        return rc;
 }
 
-static int32_t
-bnxt_create_port_app_df_rule(struct bnxt *bp, uint8_t flow_type,
-                            uint32_t *flow_id)
-{
-       uint16_t port_id = bp->eth_dev->data->port_id;
-       struct ulp_tlv_param param_list[] = {
-               {
-                       .type = BNXT_ULP_DF_PARAM_TYPE_DEV_PORT_ID,
-                       .length = 2,
-                       .value = {(port_id >> 8) & 0xff, port_id & 0xff}
-               },
-               {
-                       .type = BNXT_ULP_DF_PARAM_TYPE_LAST,
-                       .length = 0,
-                       .value = {0}
-               }
-       };
-
-       return ulp_default_flow_create(bp->eth_dev, param_list, flow_type,
-                                      flow_id);
-}
-
-static int32_t
-bnxt_create_df_rules(struct bnxt *bp)
-{
-       struct bnxt_ulp_data *cfg_data;
-       int rc;
-
-       cfg_data = bp->ulp_ctx->cfg_data;
-       rc = bnxt_create_port_app_df_rule(bp, BNXT_ULP_DF_TPL_PORT_TO_VS,
-                                         &cfg_data->port_to_app_flow_id);
-       if (rc) {
-               PMD_DRV_LOG(ERR,
-                           "Failed to create port to app default rule\n");
-               return rc;
-       }
-
-       BNXT_TF_DBG(DEBUG, "***** created port to app default rule ******\n");
-       rc = bnxt_create_port_app_df_rule(bp, BNXT_ULP_DF_TPL_VS_TO_PORT,
-                                         &cfg_data->app_to_port_flow_id);
-       if (!rc) {
-               rc = ulp_default_flow_db_cfa_action_get(bp->ulp_ctx,
-                                                       cfg_data->app_to_port_flow_id,
-                                                       &cfg_data->tx_cfa_action);
-               if (rc)
-                       goto err;
-
-               BNXT_TF_DBG(DEBUG,
-                           "***** created app to port default rule *****\n");
-               return 0;
-       }
-
-err:
-       BNXT_TF_DBG(DEBUG, "Failed to create app to port default rule\n");
-       return rc;
-}
-
-static void
-bnxt_destroy_df_rules(struct bnxt *bp)
-{
-       struct bnxt_ulp_data *cfg_data;
-
-       cfg_data = bp->ulp_ctx->cfg_data;
-       ulp_default_flow_destroy(bp->eth_dev, cfg_data->port_to_app_flow_id);
-       ulp_default_flow_destroy(bp->eth_dev, cfg_data->app_to_port_flow_id);
-}
-
 static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
 {
        struct bnxt *bp = eth_dev->data->dev_private;
@@ -1290,8 +1229,7 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
        bnxt_schedule_fw_health_check(bp);
        pthread_mutex_unlock(&bp->def_cp_lock);
 
-       if (BNXT_TRUFLOW_EN(bp))
-               bnxt_ulp_init(bp);
+       bnxt_ulp_init(bp);
 
        return 0;
 
@@ -1352,6 +1290,9 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev)
        /* disable uio/vfio intr/eventfd mapping */
        rte_intr_disable(intr_handle);
 
+       bnxt_ulp_destroy_df_rules(bp, false);
+       bnxt_ulp_deinit(bp);
+
        bnxt_cancel_fw_health_check(bp);
 
        bnxt_dev_set_link_down_op(eth_dev);
@@ -1397,12 +1338,6 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
        rte_eal_alarm_cancel(bnxt_dev_recover, (void *)bp);
        bnxt_cancel_fc_thread(bp);
 
-       if (BNXT_TRUFLOW_EN(bp)) {
-               if (bp->rep_info != NULL)
-                       bnxt_destroy_df_rules(bp);
-               bnxt_ulp_deinit(bp);
-       }
-
        if (eth_dev->data->dev_started)
                bnxt_dev_stop_op(eth_dev);
 
@@ -1425,8 +1360,7 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
        rte_memzone_free((const struct rte_memzone *)bp->rx_mem_zone);
        bp->rx_mem_zone = NULL;
 
-       rte_free(bp->pf->vf_info);
-       bp->pf->vf_info = NULL;
+       bnxt_hwrm_free_vf_info(bp);
 
        rte_free(bp->grp_info);
        bp->grp_info = NULL;
@@ -1651,8 +1585,7 @@ static int bnxt_promiscuous_disable_op(struct rte_eth_dev *eth_dev)
        if (rc != 0)
                vnic->flags = old_flags;
 
-       if (BNXT_TRUFLOW_EN(bp) && bp->rep_info != NULL)
-               bnxt_create_df_rules(bp);
+       bnxt_ulp_create_df_rules(bp);
 
        return rc;
 }
@@ -2495,15 +2428,15 @@ bnxt_vlan_tpid_set_op(struct rte_eth_dev *dev, enum rte_vlan_type vlan_type,
                        bp->outer_tpid_bd =
                                TX_BD_LONG_CFA_META_VLAN_TPID_TPID8100;
                                break;
-               case 0x9100:
+               case RTE_ETHER_TYPE_QINQ1:
                        bp->outer_tpid_bd =
                                TX_BD_LONG_CFA_META_VLAN_TPID_TPID9100;
                                break;
-               case 0x9200:
+               case RTE_ETHER_TYPE_QINQ2:
                        bp->outer_tpid_bd =
                                TX_BD_LONG_CFA_META_VLAN_TPID_TPID9200;
                                break;
-               case 0x9300:
+               case RTE_ETHER_TYPE_QINQ3:
                        bp->outer_tpid_bd =
                                 TX_BD_LONG_CFA_META_VLAN_TPID_TPID9300;
                                break;
@@ -3746,7 +3679,7 @@ free_filter:
        return ret;
 }
 
-static int
+int
 bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
                    enum rte_filter_type filter_type,
                    enum rte_filter_op filter_op, void *arg)
@@ -3754,7 +3687,12 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev,
        struct bnxt *bp = dev->data->dev_private;
        int ret = 0;
 
-       ret = is_bnxt_in_error(dev->data->dev_private);
+       if (BNXT_ETH_DEV_IS_REPRESENTOR(dev)) {
+               struct bnxt_vf_representor *vfr = dev->data->dev_private;
+               bp = vfr->parent_dev->data->dev_private;
+       }
+
+       ret = is_bnxt_in_error(bp);
        if (ret)
                return ret;
 
@@ -4433,7 +4371,7 @@ static int bnxt_restore_mac_filters(struct bnxt *bp)
        uint16_t i;
        int rc;
 
-       if (BNXT_VF(bp) & !BNXT_VF_IS_TRUSTED(bp))
+       if (BNXT_VF(bp) && !BNXT_VF_IS_TRUSTED(bp))
                return 0;
 
        rc = bnxt_dev_info_get_op(dev, &dev_info);
@@ -5461,10 +5399,6 @@ static int bnxt_init_fw(struct bnxt *bp)
 
        bnxt_hwrm_port_phy_qcaps(bp);
 
-       rc = bnxt_hwrm_cfa_adv_flow_mgmt_qcaps(bp);
-       if (rc)
-               return rc;
-
        bnxt_alloc_error_recovery_info(bp);
        /* Get the adapter error recovery support info */
        rc = bnxt_hwrm_error_recovery_qcfg(bp);
@@ -5898,8 +5832,10 @@ bnxt_uninit_locks(struct bnxt *bp)
 {
        pthread_mutex_destroy(&bp->flow_lock);
        pthread_mutex_destroy(&bp->def_cp_lock);
-       if (bp->rep_info)
+       if (bp->rep_info) {
                pthread_mutex_destroy(&bp->rep_info->vfr_lock);
+               pthread_mutex_destroy(&bp->rep_info->vfr_start_lock);
+       }
 }
 
 static int
@@ -6002,6 +5938,14 @@ static int bnxt_init_rep_info(struct bnxt *bp)
                bnxt_free_rep_info(bp);
                return rc;
        }
+
+       rc = pthread_mutex_init(&bp->rep_info->vfr_start_lock, NULL);
+       if (rc) {
+               PMD_DRV_LOG(ERR, "Unable to initialize vfr_start_lock\n");
+               bnxt_free_rep_info(bp);
+               return rc;
+       }
+
        return rc;
 }