net/bnxt: add Tx TruFlow table config for P4 device
[dpdk.git] / drivers / net / octeontx2 / otx2_vlan.c
index 189c451..cce643b 100644 (file)
@@ -50,7 +50,7 @@ nix_set_rx_vlan_action(struct rte_eth_dev *eth_dev,
 
        action = NIX_RX_ACTIONOP_UCAST;
 
-       if (eth_dev->data->dev_conf.rxmode.mq_mode == ETH_MQ_RX_RSS) {
+       if (eth_dev->data->dev_conf.rxmode.mq_mode == RTE_ETH_MQ_RX_RSS) {
                action = NIX_RX_ACTIONOP_RSS;
                action |= (uint64_t)(dev->rss_info.alg_idx) << 56;
        }
@@ -99,7 +99,7 @@ nix_set_tx_vlan_action(struct mcam_entry *entry, enum rte_vlan_type type,
         * Take offset from LA since in case of untagged packet,
         * lbptr is zero.
         */
-       if (type == ETH_VLAN_TYPE_OUTER) {
+       if (type == RTE_ETH_VLAN_TYPE_OUTER) {
                vtag_action.act.vtag0_def = vtag_index;
                vtag_action.act.vtag0_lid = NPC_LID_LA;
                vtag_action.act.vtag0_op = NIX_TX_VTAGOP_INSERT;
@@ -300,28 +300,32 @@ nix_vlan_mcam_config(struct rte_eth_dev *eth_dev,
 
        /* Adds vlan_id & LB CTAG flag to MCAM KW */
        if (flags & VLAN_ID_MATCH) {
-               entry.kw[kwi] |= NPC_LT_LB_CTAG << mkex->lb_lt_offset;
-               entry.kw_mask[kwi] |= 0xFULL << mkex->lb_lt_offset;
+               entry.kw[kwi] |= (NPC_LT_LB_CTAG | NPC_LT_LB_STAG_QINQ)
+                                                       << mkex->lb_lt_offset;
+               entry.kw_mask[kwi] |=
+                       (0xF & ~(NPC_LT_LB_CTAG ^ NPC_LT_LB_STAG_QINQ))
+                                                       << mkex->lb_lt_offset;
 
-               mcam_data = (vlan_id << 16);
-               mcam_mask = (BIT_ULL(16) - 1) << 16;
+               mcam_data = (uint16_t)vlan_id;
+               mcam_mask = (BIT_ULL(16) - 1);
                otx2_mbox_memcpy(key_data + mkex->lb_xtract.key_off,
-                                    &mcam_data, mkex->lb_xtract.len + 1);
+                                    &mcam_data, mkex->lb_xtract.len);
                otx2_mbox_memcpy(key_mask + mkex->lb_xtract.key_off,
-                                    &mcam_mask, mkex->lb_xtract.len + 1);
+                                    &mcam_mask, mkex->lb_xtract.len);
        }
 
        /* Adds LB STAG flag to MCAM KW */
        if (flags & QINQ_F_MATCH) {
-               entry.kw[kwi] |= NPC_LT_LB_STAG << mkex->lb_lt_offset;
+               entry.kw[kwi] |= NPC_LT_LB_STAG_QINQ << mkex->lb_lt_offset;
                entry.kw_mask[kwi] |= 0xFULL << mkex->lb_lt_offset;
        }
 
        /* Adds LB CTAG & LB STAG flags to MCAM KW */
        if (flags & VTAG_F_MATCH) {
-               entry.kw[kwi] |= (NPC_LT_LB_CTAG | NPC_LT_LB_STAG)
+               entry.kw[kwi] |= (NPC_LT_LB_CTAG | NPC_LT_LB_STAG_QINQ)
                                                        << mkex->lb_lt_offset;
-               entry.kw_mask[kwi] |= (NPC_LT_LB_CTAG & NPC_LT_LB_STAG)
+               entry.kw_mask[kwi] |=
+                       (0xF & ~(NPC_LT_LB_CTAG ^ NPC_LT_LB_STAG_QINQ))
                                                        << mkex->lb_lt_offset;
        }
 
@@ -409,7 +413,7 @@ nix_vlan_handle_default_rx_entry(struct rte_eth_dev *eth_dev, bool strip,
                if (vlan->strip_on ||
                    (vlan->qinq_on && !vlan->qinq_before_def)) {
                        if (eth_dev->data->dev_conf.rxmode.mq_mode ==
-                                                               ETH_MQ_RX_RSS)
+                                                               RTE_ETH_MQ_RX_RSS)
                                vlan->def_rx_mcam_ent.action |=
                                                        NIX_RX_ACTIONOP_RSS;
                        else
@@ -468,9 +472,9 @@ nix_vlan_handle_default_tx_entry(struct rte_eth_dev *eth_dev,
                pf_func = (dev->pf_func & 0xff) << 8;
                pf_func |= (dev->pf_func >> 8) & 0xff;
 
-               /* PF Func extracted to KW1[63:48] */
-               entry.kw[1] = (uint64_t)pf_func << 48;
-               entry.kw_mask[1] = (BIT_ULL(16) - 1) << 48;
+               /* PF Func extracted to KW1[47:32] */
+               entry.kw[0] = (uint64_t)pf_func << 32;
+               entry.kw_mask[0] = (BIT_ULL(16) - 1) << 32;
 
                nix_set_tx_vlan_action(&entry, type, vtag_index);
                vlan->def_tx_mcam_ent = entry;
@@ -649,7 +653,9 @@ otx2_nix_vlan_filter_set(struct rte_eth_dev *eth_dev, uint16_t vlan_id,
        } else {
                TAILQ_FOREACH(entry, &vlan->fltr_tbl, next) {
                        if (entry->vlan_id == vlan_id) {
-                               nix_vlan_mcam_free(dev, entry->mcam_idx);
+                               rc = nix_vlan_mcam_free(dev, entry->mcam_idx);
+                               if (rc)
+                                       return rc;
                                TAILQ_REMOVE(&vlan->fltr_tbl, entry, next);
                                rte_free(entry);
                                break;
@@ -707,57 +713,52 @@ otx2_nix_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask)
        struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
        uint64_t offloads = dev->rx_offloads;
        struct rte_eth_rxmode *rxmode;
-       int rc;
+       int rc = 0;
 
        rxmode = &eth_dev->data->dev_conf.rxmode;
 
-       if (mask & ETH_VLAN_EXTEND_MASK) {
-               otx2_err("Extend offload not supported");
-               return -ENOTSUP;
-       }
-
-       if (mask & ETH_VLAN_STRIP_MASK) {
-               if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_STRIP) {
-                       offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+       if (mask & RTE_ETH_VLAN_STRIP_MASK) {
+               if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) {
+                       offloads |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
                        rc = nix_vlan_hw_strip(eth_dev, true);
                } else {
-                       offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
+                       offloads &= ~RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
                        rc = nix_vlan_hw_strip(eth_dev, false);
                }
                if (rc)
                        goto done;
        }
 
-       if (mask & ETH_VLAN_FILTER_MASK) {
-               if (rxmode->offloads & DEV_RX_OFFLOAD_VLAN_FILTER) {
-                       offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+       if (mask & RTE_ETH_VLAN_FILTER_MASK) {
+               if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER) {
+                       offloads |= RTE_ETH_RX_OFFLOAD_VLAN_FILTER;
                        rc = nix_vlan_hw_filter(eth_dev, true, 0);
                } else {
-                       offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
+                       offloads &= ~RTE_ETH_RX_OFFLOAD_VLAN_FILTER;
                        rc = nix_vlan_hw_filter(eth_dev, false, 0);
                }
                if (rc)
                        goto done;
        }
 
-       if (rxmode->offloads & DEV_RX_OFFLOAD_QINQ_STRIP) {
+       if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_QINQ_STRIP) {
                if (!dev->vlan_info.qinq_on) {
-                       offloads |= DEV_RX_OFFLOAD_QINQ_STRIP;
+                       offloads |= RTE_ETH_RX_OFFLOAD_QINQ_STRIP;
                        rc = otx2_nix_config_double_vlan(eth_dev, true);
                        if (rc)
                                goto done;
                }
        } else {
                if (dev->vlan_info.qinq_on) {
-                       offloads &= ~DEV_RX_OFFLOAD_QINQ_STRIP;
+                       offloads &= ~RTE_ETH_RX_OFFLOAD_QINQ_STRIP;
                        rc = otx2_nix_config_double_vlan(eth_dev, false);
                        if (rc)
                                goto done;
                }
        }
 
-       if (offloads & (DEV_RX_OFFLOAD_VLAN_STRIP |
-                       DEV_RX_OFFLOAD_QINQ_STRIP)) {
+       if (offloads & (RTE_ETH_RX_OFFLOAD_VLAN_STRIP |
+                       RTE_ETH_RX_OFFLOAD_QINQ_STRIP)) {
                dev->rx_offloads |= offloads;
                dev->rx_offload_flags |= NIX_RX_OFFLOAD_VLAN_STRIP_F;
                otx2_eth_set_rx_function(eth_dev);
@@ -779,7 +780,7 @@ otx2_nix_vlan_tpid_set(struct rte_eth_dev *eth_dev,
        tpid_cfg = otx2_mbox_alloc_msg_nix_set_vlan_tpid(mbox);
 
        tpid_cfg->tpid = tpid;
-       if (type == ETH_VLAN_TYPE_OUTER)
+       if (type == RTE_ETH_VLAN_TYPE_OUTER)
                tpid_cfg->vlan_type = NIX_VLAN_TYPE_OUTER;
        else
                tpid_cfg->vlan_type = NIX_VLAN_TYPE_INNER;
@@ -788,7 +789,7 @@ otx2_nix_vlan_tpid_set(struct rte_eth_dev *eth_dev,
        if (rc)
                return rc;
 
-       if (type == ETH_VLAN_TYPE_OUTER)
+       if (type == RTE_ETH_VLAN_TYPE_OUTER)
                dev->vlan_info.outer_vlan_tpid = tpid;
        else
                dev->vlan_info.inner_vlan_tpid = tpid;
@@ -837,8 +838,8 @@ otx2_nix_vlan_pvid_set(struct rte_eth_dev *dev,       uint16_t vlan_id, int on)
                vtag_cfg->vtag_size = NIX_VTAGSIZE_T4;
 
                if (vlan->outer_vlan_tpid)
-                       vtag_cfg->tx.vtag0 =
-                               (vlan->outer_vlan_tpid << 16) | vlan_id;
+                       vtag_cfg->tx.vtag0 = ((uint32_t)vlan->outer_vlan_tpid
+                                             << 16) | vlan_id;
                else
                        vtag_cfg->tx.vtag0 =
                                ((RTE_ETHER_TYPE_VLAN << 16) | vlan_id);
@@ -863,7 +864,7 @@ otx2_nix_vlan_pvid_set(struct rte_eth_dev *dev,       uint16_t vlan_id, int on)
                vlan->outer_vlan_idx = 0;
        }
 
-       rc = nix_vlan_handle_default_tx_entry(dev, ETH_VLAN_TYPE_OUTER,
+       rc = nix_vlan_handle_default_tx_entry(dev, RTE_ETH_VLAN_TYPE_OUTER,
                                              vtag_index, on);
        if (rc < 0) {
                printf("Default tx entry failed with rc %d\n", rc);
@@ -985,12 +986,12 @@ otx2_nix_vlan_offload_init(struct rte_eth_dev *eth_dev)
        } else {
                /* Reinstall all mcam entries now if filter offload is set */
                if (eth_dev->data->dev_conf.rxmode.offloads &
-                   DEV_RX_OFFLOAD_VLAN_FILTER)
+                   RTE_ETH_RX_OFFLOAD_VLAN_FILTER)
                        nix_vlan_reinstall_vlan_filters(eth_dev);
        }
 
        mask =
-           ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK;
+           RTE_ETH_VLAN_STRIP_MASK | RTE_ETH_VLAN_FILTER_MASK;
        rc = otx2_nix_vlan_offload_set(eth_dev, mask);
        if (rc) {
                otx2_err("Failed to set vlan offload rc=%d", rc);