xref: /dpdk/drivers/net/cnxk/cn9k_flow.c (revision 4c8c8516)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2020 Marvell.
3  */
4 #include <cnxk_flow.h>
5 #include "cn9k_ethdev.h"
6 #include "cn9k_flow.h"
7 #include "cn9k_rx.h"
8 
9 struct rte_flow *
cn9k_flow_create(struct rte_eth_dev * eth_dev,const struct rte_flow_attr * attr,const struct rte_flow_item pattern[],const struct rte_flow_action actions[],struct rte_flow_error * error)10 cn9k_flow_create(struct rte_eth_dev *eth_dev, const struct rte_flow_attr *attr,
11 		 const struct rte_flow_item pattern[],
12 		 const struct rte_flow_action actions[],
13 		 struct rte_flow_error *error)
14 {
15 	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
16 	struct roc_npc *npc = &dev->npc;
17 	struct roc_npc_flow *flow;
18 	int vtag_actions = 0;
19 
20 	flow = cnxk_flow_create(eth_dev, attr, pattern, actions, error);
21 	if (!flow)
22 		return NULL;
23 
24 	vtag_actions = roc_npc_vtag_actions_get(npc);
25 
26 	if (vtag_actions) {
27 		dev->rx_offload_flags |= NIX_RX_OFFLOAD_VLAN_STRIP_F;
28 		cn9k_eth_set_rx_function(eth_dev);
29 	}
30 
31 	return (struct rte_flow *)flow;
32 }
33 
34 int
cn9k_flow_destroy(struct rte_eth_dev * eth_dev,struct rte_flow * rte_flow,struct rte_flow_error * error)35 cn9k_flow_destroy(struct rte_eth_dev *eth_dev, struct rte_flow *rte_flow,
36 		  struct rte_flow_error *error)
37 {
38 	struct roc_npc_flow *flow = (struct roc_npc_flow *)rte_flow;
39 	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
40 	struct roc_npc *npc = &dev->npc;
41 	int vtag_actions = 0;
42 
43 	vtag_actions = roc_npc_vtag_actions_get(npc);
44 	if (vtag_actions) {
45 		if (flow->nix_intf == ROC_NPC_INTF_RX) {
46 			vtag_actions = roc_npc_vtag_actions_sub_return(npc, 1);
47 			if (vtag_actions == 0) {
48 				dev->rx_offload_flags &=
49 					~NIX_RX_OFFLOAD_VLAN_STRIP_F;
50 				cn9k_eth_set_rx_function(eth_dev);
51 			}
52 		}
53 	}
54 
55 	return cnxk_flow_destroy(eth_dev, flow, error);
56 }
57