net/mlx5: fix E-Switch egress mirror flow validation
[dpdk.git] / drivers / net / bnxt / bnxt_reps.c
index 935f2c0..d948745 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2014-2020 Broadcom
+ * Copyright(c) 2014-2021 Broadcom
  * All rights reserved.
  */
 
@@ -55,17 +55,17 @@ bnxt_vfr_recv(uint16_t port_id, uint16_t queue_id, struct rte_mbuf *mbuf)
        mask = rep_rxr->rx_ring_struct->ring_mask;
 
        /* Put this mbuf on the RxQ of the Representor */
-       prod_rx_buf = &rep_rxr->rx_buf_ring[rep_rxr->rx_prod & mask];
-       if (!*prod_rx_buf) {
+       prod_rx_buf = &rep_rxr->rx_buf_ring[rep_rxr->rx_raw_prod & mask];
+       if (*prod_rx_buf == NULL) {
                *prod_rx_buf = mbuf;
                vfr_bp->rx_bytes[que] += mbuf->pkt_len;
                vfr_bp->rx_pkts[que]++;
-               rep_rxr->rx_prod++;
+               rep_rxr->rx_raw_prod++;
        } else {
                /* Representor Rx ring full, drop pkt */
                vfr_bp->rx_drop_bytes[que] += mbuf->pkt_len;
                vfr_bp->rx_drop_pkts[que]++;
-               rte_pktmbuf_free(mbuf);
+               rte_mbuf_raw_free(mbuf);
        }
 
        return 0;
@@ -184,7 +184,8 @@ int bnxt_representor_init(struct rte_eth_dev *eth_dev, void *params)
        vf_rep_bp->rep_fc_r2f = rep_params->rep_fc_r2f;
        vf_rep_bp->rep_fc_f2r = rep_params->rep_fc_f2r;
 
-       eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR |
+                                       RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
        eth_dev->data->representor_id = rep_params->vf_id;
 
        rte_eth_random_addr(vf_rep_bp->dflt_mac_addr);
@@ -215,8 +216,9 @@ int bnxt_representor_init(struct rte_eth_dev *eth_dev, void *params)
                    "Switch domain id %d: Representor Device %d init done\n",
                    vf_rep_bp->switch_domain_id, vf_rep_bp->vf_id);
 
-       if (vf_rep_bp->rep_based_pf) {
+       if (BNXT_REP_BASED_PF(vf_rep_bp)) {
                vf_rep_bp->fw_fid = vf_rep_bp->rep_based_pf + 1;
+               vf_rep_bp->parent_pf_idx = vf_rep_bp->rep_based_pf;
                if (!(BNXT_REP_PF(vf_rep_bp))) {
                        /* VF representor for the remote PF,get first_vf_id */
                        rc = bnxt_hwrm_first_vf_id_query(parent_bp,
@@ -236,6 +238,10 @@ int bnxt_representor_init(struct rte_eth_dev *eth_dev, void *params)
                }
        }  else {
                vf_rep_bp->fw_fid = rep_params->vf_id + parent_bp->first_vf_id;
+               if (BNXT_VF_IS_TRUSTED(parent_bp))
+                       vf_rep_bp->parent_pf_idx = parent_bp->parent->fid - 1;
+               else
+                       vf_rep_bp->parent_pf_idx = parent_bp->fw_fid - 1;
        }
 
        PMD_DRV_LOG(INFO, "vf_rep->fw_fid = %d\n", vf_rep_bp->fw_fid);
@@ -328,11 +334,7 @@ static int bnxt_tf_vfr_alloc(struct rte_eth_dev *vfr_ethdev)
        /* update the port id so you can backtrack to ethdev */
        vfr->dpdk_port_id = vfr_ethdev->data->port_id;
 
-       if (BNXT_STINGRAY(parent_bp)) {
-               rc = bnxt_hwrm_cfa_pair_alloc(parent_bp, vfr);
-       } else {
-               rc = bnxt_hwrm_cfa_vfr_alloc(parent_bp, vfr->vf_id);
-       }
+       rc = bnxt_hwrm_cfa_pair_alloc(parent_bp, vfr);
        if (rc) {
                BNXT_TF_DBG(ERR, "Failed in hwrm vfr alloc vfr:%u rc=%d\n",
                            vfr->vf_id, rc);
@@ -467,10 +469,7 @@ static int bnxt_vfr_free(struct bnxt_representor *vfr)
                    vfr->vf_id);
        vfr->vfr_tx_cfa_action = 0;
 
-       if (BNXT_STINGRAY(parent_bp))
-               rc = bnxt_hwrm_cfa_pair_free(parent_bp, vfr);
-       else
-               rc = bnxt_hwrm_cfa_vfr_free(parent_bp, vfr->vf_id);
+       rc = bnxt_hwrm_cfa_pair_free(parent_bp, vfr);
 
        return rc;
 }