xref: /dpdk/drivers/net/dpaa2/dpaa2_ethdev.c (revision d5b0924ba6baae2cb6ac7c880db0977d4befedc6)
1c147eae0SHemant Agrawal /*-
2c147eae0SHemant Agrawal  *   BSD LICENSE
3c147eae0SHemant Agrawal  *
4c147eae0SHemant Agrawal  *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
5fcee050aSShreyansh Jain  *   Copyright 2016 NXP.
6c147eae0SHemant Agrawal  *
7c147eae0SHemant Agrawal  *   Redistribution and use in source and binary forms, with or without
8c147eae0SHemant Agrawal  *   modification, are permitted provided that the following conditions
9c147eae0SHemant Agrawal  *   are met:
10c147eae0SHemant Agrawal  *
11c147eae0SHemant Agrawal  *     * Redistributions of source code must retain the above copyright
12c147eae0SHemant Agrawal  *       notice, this list of conditions and the following disclaimer.
13c147eae0SHemant Agrawal  *     * Redistributions in binary form must reproduce the above copyright
14c147eae0SHemant Agrawal  *       notice, this list of conditions and the following disclaimer in
15c147eae0SHemant Agrawal  *       the documentation and/or other materials provided with the
16c147eae0SHemant Agrawal  *       distribution.
17c147eae0SHemant Agrawal  *     * Neither the name of Freescale Semiconductor, Inc nor the names of its
18c147eae0SHemant Agrawal  *       contributors may be used to endorse or promote products derived
19c147eae0SHemant Agrawal  *       from this software without specific prior written permission.
20c147eae0SHemant Agrawal  *
21c147eae0SHemant Agrawal  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22c147eae0SHemant Agrawal  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23c147eae0SHemant Agrawal  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24c147eae0SHemant Agrawal  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25c147eae0SHemant Agrawal  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26c147eae0SHemant Agrawal  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27c147eae0SHemant Agrawal  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28c147eae0SHemant Agrawal  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29c147eae0SHemant Agrawal  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30c147eae0SHemant Agrawal  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31c147eae0SHemant Agrawal  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32c147eae0SHemant Agrawal  */
33c147eae0SHemant Agrawal 
34c147eae0SHemant Agrawal #include <time.h>
35c147eae0SHemant Agrawal #include <net/if.h>
36c147eae0SHemant Agrawal 
37c147eae0SHemant Agrawal #include <rte_mbuf.h>
38c147eae0SHemant Agrawal #include <rte_ethdev.h>
39c147eae0SHemant Agrawal #include <rte_malloc.h>
40c147eae0SHemant Agrawal #include <rte_memcpy.h>
41c147eae0SHemant Agrawal #include <rte_string_fns.h>
42c147eae0SHemant Agrawal #include <rte_cycles.h>
43c147eae0SHemant Agrawal #include <rte_kvargs.h>
44c147eae0SHemant Agrawal #include <rte_dev.h>
45c147eae0SHemant Agrawal #include <rte_fslmc.h>
46c147eae0SHemant Agrawal 
47d401ead1SHemant Agrawal #include <fslmc_logs.h>
48c147eae0SHemant Agrawal #include <fslmc_vfio.h>
493e5a335dSHemant Agrawal #include <dpaa2_hw_pvt.h>
50bee61d86SHemant Agrawal #include <dpaa2_hw_mempool.h>
513cf50ff5SHemant Agrawal #include <dpaa2_hw_dpio.h>
52748eccb9SHemant Agrawal #include <mc/fsl_dpmng.h>
53c147eae0SHemant Agrawal #include "dpaa2_ethdev.h"
54c147eae0SHemant Agrawal 
551d6329b2SHemant Agrawal struct rte_dpaa2_xstats_name_off {
561d6329b2SHemant Agrawal 	char name[RTE_ETH_XSTATS_NAME_SIZE];
571d6329b2SHemant Agrawal 	uint8_t page_id; /* dpni statistics page id */
581d6329b2SHemant Agrawal 	uint8_t stats_id; /* stats id in the given page */
591d6329b2SHemant Agrawal };
601d6329b2SHemant Agrawal 
611d6329b2SHemant Agrawal static const struct rte_dpaa2_xstats_name_off dpaa2_xstats_strings[] = {
621d6329b2SHemant Agrawal 	{"ingress_multicast_frames", 0, 2},
631d6329b2SHemant Agrawal 	{"ingress_multicast_bytes", 0, 3},
641d6329b2SHemant Agrawal 	{"ingress_broadcast_frames", 0, 4},
651d6329b2SHemant Agrawal 	{"ingress_broadcast_bytes", 0, 5},
661d6329b2SHemant Agrawal 	{"egress_multicast_frames", 1, 2},
671d6329b2SHemant Agrawal 	{"egress_multicast_bytes", 1, 3},
681d6329b2SHemant Agrawal 	{"egress_broadcast_frames", 1, 4},
691d6329b2SHemant Agrawal 	{"egress_broadcast_bytes", 1, 5},
701d6329b2SHemant Agrawal 	{"ingress_filtered_frames", 2, 0},
711d6329b2SHemant Agrawal 	{"ingress_discarded_frames", 2, 1},
721d6329b2SHemant Agrawal 	{"ingress_nobuffer_discards", 2, 2},
731d6329b2SHemant Agrawal 	{"egress_discarded_frames", 2, 3},
741d6329b2SHemant Agrawal 	{"egress_confirmed_frames", 2, 4},
751d6329b2SHemant Agrawal };
761d6329b2SHemant Agrawal 
77c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd;
78d4984046SHemant Agrawal static int dpaa2_dev_uninit(struct rte_eth_dev *eth_dev);
79c5acbb5eSHemant Agrawal static int dpaa2_dev_link_update(struct rte_eth_dev *dev,
80c5acbb5eSHemant Agrawal 				 int wait_to_complete);
81a1f3a12cSHemant Agrawal static int dpaa2_dev_set_link_up(struct rte_eth_dev *dev);
82a1f3a12cSHemant Agrawal static int dpaa2_dev_set_link_down(struct rte_eth_dev *dev);
83e1640849SHemant Agrawal static int dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
84c147eae0SHemant Agrawal 
85c56c86ffSHemant Agrawal /**
86c56c86ffSHemant Agrawal  * Atomically reads the link status information from global
87c56c86ffSHemant Agrawal  * structure rte_eth_dev.
88c56c86ffSHemant Agrawal  *
89c56c86ffSHemant Agrawal  * @param dev
90c56c86ffSHemant Agrawal  *   - Pointer to the structure rte_eth_dev to read from.
91c56c86ffSHemant Agrawal  *   - Pointer to the buffer to be saved with the link status.
92c56c86ffSHemant Agrawal  *
93c56c86ffSHemant Agrawal  * @return
94c56c86ffSHemant Agrawal  *   - On success, zero.
95c56c86ffSHemant Agrawal  *   - On failure, negative value.
96c56c86ffSHemant Agrawal  */
97c56c86ffSHemant Agrawal static inline int
98c56c86ffSHemant Agrawal dpaa2_dev_atomic_read_link_status(struct rte_eth_dev *dev,
99c56c86ffSHemant Agrawal 				  struct rte_eth_link *link)
100c56c86ffSHemant Agrawal {
101c56c86ffSHemant Agrawal 	struct rte_eth_link *dst = link;
102c56c86ffSHemant Agrawal 	struct rte_eth_link *src = &dev->data->dev_link;
103c56c86ffSHemant Agrawal 
104c56c86ffSHemant Agrawal 	if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
105c56c86ffSHemant Agrawal 				*(uint64_t *)src) == 0)
106c56c86ffSHemant Agrawal 		return -1;
107c56c86ffSHemant Agrawal 
108c56c86ffSHemant Agrawal 	return 0;
109c56c86ffSHemant Agrawal }
110c56c86ffSHemant Agrawal 
111c56c86ffSHemant Agrawal /**
112c56c86ffSHemant Agrawal  * Atomically writes the link status information into global
113c56c86ffSHemant Agrawal  * structure rte_eth_dev.
114c56c86ffSHemant Agrawal  *
115c56c86ffSHemant Agrawal  * @param dev
116c56c86ffSHemant Agrawal  *   - Pointer to the structure rte_eth_dev to read from.
117c56c86ffSHemant Agrawal  *   - Pointer to the buffer to be saved with the link status.
118c56c86ffSHemant Agrawal  *
119c56c86ffSHemant Agrawal  * @return
120c56c86ffSHemant Agrawal  *   - On success, zero.
121c56c86ffSHemant Agrawal  *   - On failure, negative value.
122c56c86ffSHemant Agrawal  */
123c56c86ffSHemant Agrawal static inline int
124c56c86ffSHemant Agrawal dpaa2_dev_atomic_write_link_status(struct rte_eth_dev *dev,
125c56c86ffSHemant Agrawal 				   struct rte_eth_link *link)
126c56c86ffSHemant Agrawal {
127c56c86ffSHemant Agrawal 	struct rte_eth_link *dst = &dev->data->dev_link;
128c56c86ffSHemant Agrawal 	struct rte_eth_link *src = link;
129c56c86ffSHemant Agrawal 
130c56c86ffSHemant Agrawal 	if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
131c56c86ffSHemant Agrawal 				*(uint64_t *)src) == 0)
132c56c86ffSHemant Agrawal 		return -1;
133c56c86ffSHemant Agrawal 
134c56c86ffSHemant Agrawal 	return 0;
135c56c86ffSHemant Agrawal }
136c56c86ffSHemant Agrawal 
1373ce294f2SHemant Agrawal static int
1383ce294f2SHemant Agrawal dpaa2_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
1393ce294f2SHemant Agrawal {
1403ce294f2SHemant Agrawal 	int ret;
1413ce294f2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1423ce294f2SHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
1433ce294f2SHemant Agrawal 
1443ce294f2SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1453ce294f2SHemant Agrawal 
1463ce294f2SHemant Agrawal 	if (dpni == NULL) {
147645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1483ce294f2SHemant Agrawal 		return -1;
1493ce294f2SHemant Agrawal 	}
1503ce294f2SHemant Agrawal 
1513ce294f2SHemant Agrawal 	if (on)
1523ce294f2SHemant Agrawal 		ret = dpni_add_vlan_id(dpni, CMD_PRI_LOW,
1533ce294f2SHemant Agrawal 				       priv->token, vlan_id);
1543ce294f2SHemant Agrawal 	else
1553ce294f2SHemant Agrawal 		ret = dpni_remove_vlan_id(dpni, CMD_PRI_LOW,
1563ce294f2SHemant Agrawal 					  priv->token, vlan_id);
1573ce294f2SHemant Agrawal 
1583ce294f2SHemant Agrawal 	if (ret < 0)
1593ce294f2SHemant Agrawal 		PMD_DRV_LOG(ERR, "ret = %d Unable to add/rem vlan %d hwid =%d",
1603ce294f2SHemant Agrawal 			    ret, vlan_id, priv->hw_id);
1613ce294f2SHemant Agrawal 
1623ce294f2SHemant Agrawal 	return ret;
1633ce294f2SHemant Agrawal }
1643ce294f2SHemant Agrawal 
1653ce294f2SHemant Agrawal static void
1663ce294f2SHemant Agrawal dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)
1673ce294f2SHemant Agrawal {
1683ce294f2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1693ce294f2SHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
1703ce294f2SHemant Agrawal 	int ret;
1713ce294f2SHemant Agrawal 
1723ce294f2SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1733ce294f2SHemant Agrawal 
1743ce294f2SHemant Agrawal 	if (mask & ETH_VLAN_FILTER_MASK) {
1753ce294f2SHemant Agrawal 		if (dev->data->dev_conf.rxmode.hw_vlan_filter)
1763ce294f2SHemant Agrawal 			ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
1773ce294f2SHemant Agrawal 						      priv->token, true);
1783ce294f2SHemant Agrawal 		else
1793ce294f2SHemant Agrawal 			ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
1803ce294f2SHemant Agrawal 						      priv->token, false);
1813ce294f2SHemant Agrawal 		if (ret < 0)
182645bd25aSHemant Agrawal 			RTE_LOG(ERR, PMD, "Unable to set vlan filter = %d\n",
1833ce294f2SHemant Agrawal 				ret);
1843ce294f2SHemant Agrawal 	}
185acb95928SHemant Agrawal 
186acb95928SHemant Agrawal 	if (mask & ETH_VLAN_EXTEND_MASK) {
187acb95928SHemant Agrawal 		if (dev->data->dev_conf.rxmode.hw_vlan_extend)
188acb95928SHemant Agrawal 			RTE_LOG(INFO, PMD,
189acb95928SHemant Agrawal 				"VLAN extend offload not supported\n");
190acb95928SHemant Agrawal 	}
1913ce294f2SHemant Agrawal }
1923ce294f2SHemant Agrawal 
193748eccb9SHemant Agrawal static int
194748eccb9SHemant Agrawal dpaa2_fw_version_get(struct rte_eth_dev *dev,
195748eccb9SHemant Agrawal 		     char *fw_version,
196748eccb9SHemant Agrawal 		     size_t fw_size)
197748eccb9SHemant Agrawal {
198748eccb9SHemant Agrawal 	int ret;
199748eccb9SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
200748eccb9SHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
201748eccb9SHemant Agrawal 	struct mc_soc_version mc_plat_info = {0};
202748eccb9SHemant Agrawal 	struct mc_version mc_ver_info = {0};
203748eccb9SHemant Agrawal 
204748eccb9SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
205748eccb9SHemant Agrawal 
206748eccb9SHemant Agrawal 	if (mc_get_soc_version(dpni, CMD_PRI_LOW, &mc_plat_info))
207748eccb9SHemant Agrawal 		RTE_LOG(WARNING, PMD, "\tmc_get_soc_version failed\n");
208748eccb9SHemant Agrawal 
209748eccb9SHemant Agrawal 	if (mc_get_version(dpni, CMD_PRI_LOW, &mc_ver_info))
210748eccb9SHemant Agrawal 		RTE_LOG(WARNING, PMD, "\tmc_get_version failed\n");
211748eccb9SHemant Agrawal 
212748eccb9SHemant Agrawal 	ret = snprintf(fw_version, fw_size,
213748eccb9SHemant Agrawal 		       "%x-%d.%d.%d",
214748eccb9SHemant Agrawal 		       mc_plat_info.svr,
215748eccb9SHemant Agrawal 		       mc_ver_info.major,
216748eccb9SHemant Agrawal 		       mc_ver_info.minor,
217748eccb9SHemant Agrawal 		       mc_ver_info.revision);
218748eccb9SHemant Agrawal 
219748eccb9SHemant Agrawal 	ret += 1; /* add the size of '\0' */
220748eccb9SHemant Agrawal 	if (fw_size < (uint32_t)ret)
221748eccb9SHemant Agrawal 		return ret;
222748eccb9SHemant Agrawal 	else
223748eccb9SHemant Agrawal 		return 0;
224748eccb9SHemant Agrawal }
225748eccb9SHemant Agrawal 
2263e5a335dSHemant Agrawal static void
2273e5a335dSHemant Agrawal dpaa2_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
2283e5a335dSHemant Agrawal {
2293e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
2303e5a335dSHemant Agrawal 
2313e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2323e5a335dSHemant Agrawal 
2333e5a335dSHemant Agrawal 	dev_info->if_index = priv->hw_id;
2343e5a335dSHemant Agrawal 
23533fad432SHemant Agrawal 	dev_info->max_mac_addrs = priv->max_mac_filters;
236bee61d86SHemant Agrawal 	dev_info->max_rx_pktlen = DPAA2_MAX_RX_PKT_LEN;
237bee61d86SHemant Agrawal 	dev_info->min_rx_bufsize = DPAA2_MIN_RX_BUF_SIZE;
2383e5a335dSHemant Agrawal 	dev_info->max_rx_queues = (uint16_t)priv->nb_rx_queues;
2393e5a335dSHemant Agrawal 	dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues;
240ef18dafeSHemant Agrawal 	dev_info->rx_offload_capa =
241ef18dafeSHemant Agrawal 		DEV_RX_OFFLOAD_IPV4_CKSUM |
242ef18dafeSHemant Agrawal 		DEV_RX_OFFLOAD_UDP_CKSUM |
243ef18dafeSHemant Agrawal 		DEV_RX_OFFLOAD_TCP_CKSUM |
244ef18dafeSHemant Agrawal 		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
245ef18dafeSHemant Agrawal 	dev_info->tx_offload_capa =
246ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_IPV4_CKSUM |
247ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_UDP_CKSUM |
248ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_TCP_CKSUM |
249ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_SCTP_CKSUM |
250ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
2513e5a335dSHemant Agrawal 	dev_info->speed_capa = ETH_LINK_SPEED_1G |
2523e5a335dSHemant Agrawal 			ETH_LINK_SPEED_2_5G |
2533e5a335dSHemant Agrawal 			ETH_LINK_SPEED_10G;
2543e5a335dSHemant Agrawal }
2553e5a335dSHemant Agrawal 
2563e5a335dSHemant Agrawal static int
2573e5a335dSHemant Agrawal dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev)
2583e5a335dSHemant Agrawal {
2593e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
2603e5a335dSHemant Agrawal 	uint16_t dist_idx;
2613e5a335dSHemant Agrawal 	uint32_t vq_id;
2623e5a335dSHemant Agrawal 	struct dpaa2_queue *mc_q, *mcq;
2633e5a335dSHemant Agrawal 	uint32_t tot_queues;
2643e5a335dSHemant Agrawal 	int i;
2653e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
2663e5a335dSHemant Agrawal 
2673e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2683e5a335dSHemant Agrawal 
2693e5a335dSHemant Agrawal 	tot_queues = priv->nb_rx_queues + priv->nb_tx_queues;
2703e5a335dSHemant Agrawal 	mc_q = rte_malloc(NULL, sizeof(struct dpaa2_queue) * tot_queues,
2713e5a335dSHemant Agrawal 			  RTE_CACHE_LINE_SIZE);
2723e5a335dSHemant Agrawal 	if (!mc_q) {
2733e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "malloc failed for rx/tx queues\n");
2743e5a335dSHemant Agrawal 		return -1;
2753e5a335dSHemant Agrawal 	}
2763e5a335dSHemant Agrawal 
2773e5a335dSHemant Agrawal 	for (i = 0; i < priv->nb_rx_queues; i++) {
2783e5a335dSHemant Agrawal 		mc_q->dev = dev;
2793e5a335dSHemant Agrawal 		priv->rx_vq[i] = mc_q++;
2803e5a335dSHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
2813e5a335dSHemant Agrawal 		dpaa2_q->q_storage = rte_malloc("dq_storage",
2823e5a335dSHemant Agrawal 					sizeof(struct queue_storage_info_t),
2833e5a335dSHemant Agrawal 					RTE_CACHE_LINE_SIZE);
2843e5a335dSHemant Agrawal 		if (!dpaa2_q->q_storage)
2853e5a335dSHemant Agrawal 			goto fail;
2863e5a335dSHemant Agrawal 
2873e5a335dSHemant Agrawal 		memset(dpaa2_q->q_storage, 0,
2883e5a335dSHemant Agrawal 		       sizeof(struct queue_storage_info_t));
2893cf50ff5SHemant Agrawal 		if (dpaa2_alloc_dq_storage(dpaa2_q->q_storage))
2903cf50ff5SHemant Agrawal 			goto fail;
2913e5a335dSHemant Agrawal 	}
2923e5a335dSHemant Agrawal 
2933e5a335dSHemant Agrawal 	for (i = 0; i < priv->nb_tx_queues; i++) {
2943e5a335dSHemant Agrawal 		mc_q->dev = dev;
2957ae777d0SHemant Agrawal 		mc_q->flow_id = 0xffff;
2963e5a335dSHemant Agrawal 		priv->tx_vq[i] = mc_q++;
2977ae777d0SHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->tx_vq[i];
2987ae777d0SHemant Agrawal 		dpaa2_q->cscn = rte_malloc(NULL,
2997ae777d0SHemant Agrawal 					   sizeof(struct qbman_result), 16);
3007ae777d0SHemant Agrawal 		if (!dpaa2_q->cscn)
3017ae777d0SHemant Agrawal 			goto fail_tx;
3023e5a335dSHemant Agrawal 	}
3033e5a335dSHemant Agrawal 
3043e5a335dSHemant Agrawal 	vq_id = 0;
305599017a2SHemant Agrawal 	for (dist_idx = 0; dist_idx < priv->nb_rx_queues; dist_idx++) {
3063e5a335dSHemant Agrawal 		mcq = (struct dpaa2_queue *)priv->rx_vq[vq_id];
3073e5a335dSHemant Agrawal 		mcq->tc_index = DPAA2_DEF_TC;
3083e5a335dSHemant Agrawal 		mcq->flow_id = dist_idx;
3093e5a335dSHemant Agrawal 		vq_id++;
3103e5a335dSHemant Agrawal 	}
3113e5a335dSHemant Agrawal 
3123e5a335dSHemant Agrawal 	return 0;
3137ae777d0SHemant Agrawal fail_tx:
3147ae777d0SHemant Agrawal 	i -= 1;
3157ae777d0SHemant Agrawal 	while (i >= 0) {
3167ae777d0SHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->tx_vq[i];
3177ae777d0SHemant Agrawal 		rte_free(dpaa2_q->cscn);
3187ae777d0SHemant Agrawal 		priv->tx_vq[i--] = NULL;
3197ae777d0SHemant Agrawal 	}
3207ae777d0SHemant Agrawal 	i = priv->nb_rx_queues;
3213e5a335dSHemant Agrawal fail:
3223e5a335dSHemant Agrawal 	i -= 1;
3233e5a335dSHemant Agrawal 	mc_q = priv->rx_vq[0];
3243e5a335dSHemant Agrawal 	while (i >= 0) {
3253e5a335dSHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
3263cf50ff5SHemant Agrawal 		dpaa2_free_dq_storage(dpaa2_q->q_storage);
3273e5a335dSHemant Agrawal 		rte_free(dpaa2_q->q_storage);
3283e5a335dSHemant Agrawal 		priv->rx_vq[i--] = NULL;
3293e5a335dSHemant Agrawal 	}
3303e5a335dSHemant Agrawal 	rte_free(mc_q);
3313e5a335dSHemant Agrawal 	return -1;
3323e5a335dSHemant Agrawal }
3333e5a335dSHemant Agrawal 
3343e5a335dSHemant Agrawal static int
3353e5a335dSHemant Agrawal dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
3363e5a335dSHemant Agrawal {
33721ce788cSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
33821ce788cSHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
33921ce788cSHemant Agrawal 	struct rte_eth_conf *eth_conf = &dev->data->dev_conf;
34021ce788cSHemant Agrawal 	int rx_ip_csum_offload = false;
34189c2ea8fSHemant Agrawal 	int ret;
3423e5a335dSHemant Agrawal 
3433e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
3443e5a335dSHemant Agrawal 
345e1640849SHemant Agrawal 	if (eth_conf->rxmode.jumbo_frame == 1) {
346e1640849SHemant Agrawal 		if (eth_conf->rxmode.max_rx_pkt_len <= DPAA2_MAX_RX_PKT_LEN) {
347e1640849SHemant Agrawal 			ret = dpaa2_dev_mtu_set(dev,
348e1640849SHemant Agrawal 					eth_conf->rxmode.max_rx_pkt_len);
349e1640849SHemant Agrawal 			if (ret) {
350e1640849SHemant Agrawal 				PMD_INIT_LOG(ERR,
351e1640849SHemant Agrawal 					     "unable to set mtu. check config\n");
352e1640849SHemant Agrawal 				return ret;
353e1640849SHemant Agrawal 			}
354e1640849SHemant Agrawal 		} else {
355e1640849SHemant Agrawal 			return -1;
356e1640849SHemant Agrawal 		}
357e1640849SHemant Agrawal 	}
358e1640849SHemant Agrawal 
35989c2ea8fSHemant Agrawal 	if (eth_conf->rxmode.mq_mode == ETH_MQ_RX_RSS) {
36089c2ea8fSHemant Agrawal 		ret = dpaa2_setup_flow_dist(dev,
36189c2ea8fSHemant Agrawal 				eth_conf->rx_adv_conf.rss_conf.rss_hf);
36289c2ea8fSHemant Agrawal 		if (ret) {
36389c2ea8fSHemant Agrawal 			PMD_INIT_LOG(ERR, "unable to set flow distribution."
36489c2ea8fSHemant Agrawal 				     "please check queue config\n");
36589c2ea8fSHemant Agrawal 			return ret;
36689c2ea8fSHemant Agrawal 		}
36789c2ea8fSHemant Agrawal 	}
368c5acbb5eSHemant Agrawal 
36921ce788cSHemant Agrawal 	if (eth_conf->rxmode.hw_ip_checksum)
37021ce788cSHemant Agrawal 		rx_ip_csum_offload = true;
37121ce788cSHemant Agrawal 
37221ce788cSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
37321ce788cSHemant Agrawal 			       DPNI_OFF_RX_L3_CSUM, rx_ip_csum_offload);
37421ce788cSHemant Agrawal 	if (ret) {
37521ce788cSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to set RX l3 csum:Error = %d\n", ret);
37621ce788cSHemant Agrawal 		return ret;
37721ce788cSHemant Agrawal 	}
37821ce788cSHemant Agrawal 
37921ce788cSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
38021ce788cSHemant Agrawal 			       DPNI_OFF_RX_L4_CSUM, rx_ip_csum_offload);
38121ce788cSHemant Agrawal 	if (ret) {
38221ce788cSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to get RX l4 csum:Error = %d\n", ret);
38321ce788cSHemant Agrawal 		return ret;
38421ce788cSHemant Agrawal 	}
38521ce788cSHemant Agrawal 
38621ce788cSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
38721ce788cSHemant Agrawal 			       DPNI_OFF_TX_L3_CSUM, true);
38821ce788cSHemant Agrawal 	if (ret) {
38921ce788cSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to set TX l3 csum:Error = %d\n", ret);
39021ce788cSHemant Agrawal 		return ret;
39121ce788cSHemant Agrawal 	}
39221ce788cSHemant Agrawal 
39321ce788cSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
39421ce788cSHemant Agrawal 			       DPNI_OFF_TX_L4_CSUM, true);
39521ce788cSHemant Agrawal 	if (ret) {
39621ce788cSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to get TX l4 csum:Error = %d\n", ret);
39721ce788cSHemant Agrawal 		return ret;
39821ce788cSHemant Agrawal 	}
39921ce788cSHemant Agrawal 
400c5acbb5eSHemant Agrawal 	/* update the current status */
401c5acbb5eSHemant Agrawal 	dpaa2_dev_link_update(dev, 0);
402c5acbb5eSHemant Agrawal 
4033e5a335dSHemant Agrawal 	return 0;
4043e5a335dSHemant Agrawal }
4053e5a335dSHemant Agrawal 
4063e5a335dSHemant Agrawal /* Function to setup RX flow information. It contains traffic class ID,
4073e5a335dSHemant Agrawal  * flow ID, destination configuration etc.
4083e5a335dSHemant Agrawal  */
4093e5a335dSHemant Agrawal static int
4103e5a335dSHemant Agrawal dpaa2_dev_rx_queue_setup(struct rte_eth_dev *dev,
4113e5a335dSHemant Agrawal 			 uint16_t rx_queue_id,
4123e5a335dSHemant Agrawal 			 uint16_t nb_rx_desc __rte_unused,
4133e5a335dSHemant Agrawal 			 unsigned int socket_id __rte_unused,
4143e5a335dSHemant Agrawal 			 const struct rte_eth_rxconf *rx_conf __rte_unused,
4153e5a335dSHemant Agrawal 			 struct rte_mempool *mb_pool)
4163e5a335dSHemant Agrawal {
4173e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
4183e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
41930db823eSHemant Agrawal 	struct mc_soc_version mc_plat_info = {0};
4203e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
4213e5a335dSHemant Agrawal 	struct dpni_queue cfg;
4223e5a335dSHemant Agrawal 	uint8_t options = 0;
4233e5a335dSHemant Agrawal 	uint8_t flow_id;
424bee61d86SHemant Agrawal 	uint32_t bpid;
4253e5a335dSHemant Agrawal 	int ret;
4263e5a335dSHemant Agrawal 
4273e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
4283e5a335dSHemant Agrawal 
4292bfea039SHemant Agrawal 	PMD_DRV_LOG(DEBUG, "dev =%p, queue =%d, pool = %p, conf =%p",
4303e5a335dSHemant Agrawal 		    dev, rx_queue_id, mb_pool, rx_conf);
4313e5a335dSHemant Agrawal 
432bee61d86SHemant Agrawal 	if (!priv->bp_list || priv->bp_list->mp != mb_pool) {
433bee61d86SHemant Agrawal 		bpid = mempool_to_bpid(mb_pool);
434bee61d86SHemant Agrawal 		ret = dpaa2_attach_bp_list(priv,
435bee61d86SHemant Agrawal 					   rte_dpaa2_bpid_info[bpid].bp_list);
436bee61d86SHemant Agrawal 		if (ret)
437bee61d86SHemant Agrawal 			return ret;
438bee61d86SHemant Agrawal 	}
4393e5a335dSHemant Agrawal 	dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[rx_queue_id];
4403e5a335dSHemant Agrawal 	dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */
4413e5a335dSHemant Agrawal 
442599017a2SHemant Agrawal 	/*Get the flow id from given VQ id*/
443599017a2SHemant Agrawal 	flow_id = rx_queue_id % priv->nb_rx_queues;
4443e5a335dSHemant Agrawal 	memset(&cfg, 0, sizeof(struct dpni_queue));
4453e5a335dSHemant Agrawal 
4463e5a335dSHemant Agrawal 	options = options | DPNI_QUEUE_OPT_USER_CTX;
4473e5a335dSHemant Agrawal 	cfg.user_context = (uint64_t)(dpaa2_q);
4483e5a335dSHemant Agrawal 
44937529eceSHemant Agrawal 	/*if ls2088 or rev2 device, enable the stashing */
45030db823eSHemant Agrawal 
45130db823eSHemant Agrawal 	if (mc_get_soc_version(dpni, CMD_PRI_LOW, &mc_plat_info))
45230db823eSHemant Agrawal 		PMD_INIT_LOG(ERR, "\tmc_get_soc_version failed\n");
45330db823eSHemant Agrawal 
45430db823eSHemant Agrawal 	if ((mc_plat_info.svr & 0xffff0000) != SVR_LS2080A) {
45537529eceSHemant Agrawal 		options |= DPNI_QUEUE_OPT_FLC;
45637529eceSHemant Agrawal 		cfg.flc.stash_control = true;
45737529eceSHemant Agrawal 		cfg.flc.value &= 0xFFFFFFFFFFFFFFC0;
45837529eceSHemant Agrawal 		/* 00 00 00 - last 6 bit represent annotation, context stashing,
45937529eceSHemant Agrawal 		 * data stashing setting 01 01 00 (0x14) to enable
4609464dbe9SHemant Agrawal 		 * 1 line data, 1 line annotation
46137529eceSHemant Agrawal 		 */
46237529eceSHemant Agrawal 		cfg.flc.value |= 0x14;
46337529eceSHemant Agrawal 	}
4643e5a335dSHemant Agrawal 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_RX,
4653e5a335dSHemant Agrawal 			     dpaa2_q->tc_index, flow_id, options, &cfg);
4663e5a335dSHemant Agrawal 	if (ret) {
4673e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error in setting the rx flow: = %d\n", ret);
4683e5a335dSHemant Agrawal 		return -1;
4693e5a335dSHemant Agrawal 	}
4703e5a335dSHemant Agrawal 
47123d6a87eSHemant Agrawal 	if (!(priv->flags & DPAA2_RX_TAILDROP_OFF)) {
47223d6a87eSHemant Agrawal 		struct dpni_taildrop taildrop;
47323d6a87eSHemant Agrawal 
47423d6a87eSHemant Agrawal 		taildrop.enable = 1;
47523d6a87eSHemant Agrawal 		/*enabling per rx queue congestion control */
47623d6a87eSHemant Agrawal 		taildrop.threshold = CONG_THRESHOLD_RX_Q;
47723d6a87eSHemant Agrawal 		taildrop.units = DPNI_CONGESTION_UNIT_BYTES;
478d47f0292SHemant Agrawal 		taildrop.oal = CONG_RX_OAL;
4792bfea039SHemant Agrawal 		PMD_DRV_LOG(DEBUG, "Enabling Early Drop on queue = %d",
48023d6a87eSHemant Agrawal 			    rx_queue_id);
48123d6a87eSHemant Agrawal 		ret = dpni_set_taildrop(dpni, CMD_PRI_LOW, priv->token,
48223d6a87eSHemant Agrawal 					DPNI_CP_QUEUE, DPNI_QUEUE_RX,
48323d6a87eSHemant Agrawal 					dpaa2_q->tc_index, flow_id, &taildrop);
48423d6a87eSHemant Agrawal 		if (ret) {
48523d6a87eSHemant Agrawal 			PMD_INIT_LOG(ERR, "Error in setting the rx flow"
48623d6a87eSHemant Agrawal 				     " err : = %d\n", ret);
48723d6a87eSHemant Agrawal 			return -1;
48823d6a87eSHemant Agrawal 		}
48923d6a87eSHemant Agrawal 	}
49023d6a87eSHemant Agrawal 
4913e5a335dSHemant Agrawal 	dev->data->rx_queues[rx_queue_id] = dpaa2_q;
4923e5a335dSHemant Agrawal 	return 0;
4933e5a335dSHemant Agrawal }
4943e5a335dSHemant Agrawal 
4953e5a335dSHemant Agrawal static int
4963e5a335dSHemant Agrawal dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev,
4973e5a335dSHemant Agrawal 			 uint16_t tx_queue_id,
4983e5a335dSHemant Agrawal 			 uint16_t nb_tx_desc __rte_unused,
4993e5a335dSHemant Agrawal 			 unsigned int socket_id __rte_unused,
5003e5a335dSHemant Agrawal 			 const struct rte_eth_txconf *tx_conf __rte_unused)
5013e5a335dSHemant Agrawal {
5023e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
5033e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q = (struct dpaa2_queue *)
5043e5a335dSHemant Agrawal 		priv->tx_vq[tx_queue_id];
5053e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
5063e5a335dSHemant Agrawal 	struct dpni_queue tx_conf_cfg;
5073e5a335dSHemant Agrawal 	struct dpni_queue tx_flow_cfg;
5083e5a335dSHemant Agrawal 	uint8_t options = 0, flow_id;
5093e5a335dSHemant Agrawal 	uint32_t tc_id;
5103e5a335dSHemant Agrawal 	int ret;
5113e5a335dSHemant Agrawal 
5123e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
5133e5a335dSHemant Agrawal 
5143e5a335dSHemant Agrawal 	/* Return if queue already configured */
5157ae777d0SHemant Agrawal 	if (dpaa2_q->flow_id != 0xffff)
5163e5a335dSHemant Agrawal 		return 0;
5173e5a335dSHemant Agrawal 
5183e5a335dSHemant Agrawal 	memset(&tx_conf_cfg, 0, sizeof(struct dpni_queue));
5193e5a335dSHemant Agrawal 	memset(&tx_flow_cfg, 0, sizeof(struct dpni_queue));
5203e5a335dSHemant Agrawal 
521ef18dafeSHemant Agrawal 	tc_id = tx_queue_id;
522ef18dafeSHemant Agrawal 	flow_id = 0;
5233e5a335dSHemant Agrawal 
5243e5a335dSHemant Agrawal 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_TX,
5253e5a335dSHemant Agrawal 			     tc_id, flow_id, options, &tx_flow_cfg);
5263e5a335dSHemant Agrawal 	if (ret) {
5273e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error in setting the tx flow: "
5283e5a335dSHemant Agrawal 			     "tc_id=%d, flow =%d ErrorCode = %x\n",
5293e5a335dSHemant Agrawal 			     tc_id, flow_id, -ret);
5303e5a335dSHemant Agrawal 			return -1;
5313e5a335dSHemant Agrawal 	}
5323e5a335dSHemant Agrawal 
5333e5a335dSHemant Agrawal 	dpaa2_q->flow_id = flow_id;
5343e5a335dSHemant Agrawal 
5353e5a335dSHemant Agrawal 	if (tx_queue_id == 0) {
5363e5a335dSHemant Agrawal 		/*Set tx-conf and error configuration*/
5373e5a335dSHemant Agrawal 		ret = dpni_set_tx_confirmation_mode(dpni, CMD_PRI_LOW,
5383e5a335dSHemant Agrawal 						    priv->token,
5393e5a335dSHemant Agrawal 						    DPNI_CONF_DISABLE);
5403e5a335dSHemant Agrawal 		if (ret) {
5413e5a335dSHemant Agrawal 			PMD_INIT_LOG(ERR, "Error in set tx conf mode settings"
5423e5a335dSHemant Agrawal 				     " ErrorCode = %x", ret);
5433e5a335dSHemant Agrawal 			return -1;
5443e5a335dSHemant Agrawal 		}
5453e5a335dSHemant Agrawal 	}
5463e5a335dSHemant Agrawal 	dpaa2_q->tc_index = tc_id;
5473e5a335dSHemant Agrawal 
548a0840963SHemant Agrawal 	if (!(priv->flags & DPAA2_TX_CGR_OFF)) {
5497ae777d0SHemant Agrawal 		struct dpni_congestion_notification_cfg cong_notif_cfg;
5507ae777d0SHemant Agrawal 
55129dfa62fSHemant Agrawal 		cong_notif_cfg.units = DPNI_CONGESTION_UNIT_FRAMES;
5527ae777d0SHemant Agrawal 		cong_notif_cfg.threshold_entry = CONG_ENTER_TX_THRESHOLD;
5537ae777d0SHemant Agrawal 		/* Notify that the queue is not congested when the data in
5547ae777d0SHemant Agrawal 		 * the queue is below this thershold.
5557ae777d0SHemant Agrawal 		 */
5567ae777d0SHemant Agrawal 		cong_notif_cfg.threshold_exit = CONG_EXIT_TX_THRESHOLD;
5577ae777d0SHemant Agrawal 		cong_notif_cfg.message_ctx = 0;
5587ae777d0SHemant Agrawal 		cong_notif_cfg.message_iova = (uint64_t)dpaa2_q->cscn;
5597ae777d0SHemant Agrawal 		cong_notif_cfg.dest_cfg.dest_type = DPNI_DEST_NONE;
5607ae777d0SHemant Agrawal 		cong_notif_cfg.notification_mode =
5617ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_WRITE_MEM_ON_ENTER |
5627ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_WRITE_MEM_ON_EXIT |
5637ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_COHERENT_WRITE;
5647ae777d0SHemant Agrawal 
5657ae777d0SHemant Agrawal 		ret = dpni_set_congestion_notification(dpni, CMD_PRI_LOW,
5667ae777d0SHemant Agrawal 						       priv->token,
5677ae777d0SHemant Agrawal 						       DPNI_QUEUE_TX,
5687ae777d0SHemant Agrawal 						       tc_id,
5697ae777d0SHemant Agrawal 						       &cong_notif_cfg);
5707ae777d0SHemant Agrawal 		if (ret) {
5717ae777d0SHemant Agrawal 			PMD_INIT_LOG(ERR,
5727ae777d0SHemant Agrawal 			   "Error in setting tx congestion notification: = %d",
5737ae777d0SHemant Agrawal 			   -ret);
5747ae777d0SHemant Agrawal 			return -ret;
5757ae777d0SHemant Agrawal 		}
5767ae777d0SHemant Agrawal 	}
5773e5a335dSHemant Agrawal 	dev->data->tx_queues[tx_queue_id] = dpaa2_q;
5783e5a335dSHemant Agrawal 	return 0;
5793e5a335dSHemant Agrawal }
5803e5a335dSHemant Agrawal 
5813e5a335dSHemant Agrawal static void
5823e5a335dSHemant Agrawal dpaa2_dev_rx_queue_release(void *q __rte_unused)
5833e5a335dSHemant Agrawal {
5843e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
5853e5a335dSHemant Agrawal }
5863e5a335dSHemant Agrawal 
5873e5a335dSHemant Agrawal static void
5883e5a335dSHemant Agrawal dpaa2_dev_tx_queue_release(void *q __rte_unused)
5893e5a335dSHemant Agrawal {
5903e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
5913e5a335dSHemant Agrawal }
5923e5a335dSHemant Agrawal 
593a5fc38d4SHemant Agrawal static const uint32_t *
594a5fc38d4SHemant Agrawal dpaa2_supported_ptypes_get(struct rte_eth_dev *dev)
595a5fc38d4SHemant Agrawal {
596a5fc38d4SHemant Agrawal 	static const uint32_t ptypes[] = {
597a5fc38d4SHemant Agrawal 		/*todo -= add more types */
598a5fc38d4SHemant Agrawal 		RTE_PTYPE_L2_ETHER,
599a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV4,
600a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV4_EXT,
601a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV6,
602a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV6_EXT,
603a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_TCP,
604a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_UDP,
605a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_SCTP,
606a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_ICMP,
607a5fc38d4SHemant Agrawal 		RTE_PTYPE_UNKNOWN
608a5fc38d4SHemant Agrawal 	};
609a5fc38d4SHemant Agrawal 
6105c6942fdSHemant Agrawal 	if (dev->rx_pkt_burst == dpaa2_dev_prefetch_rx)
611a5fc38d4SHemant Agrawal 		return ptypes;
612a5fc38d4SHemant Agrawal 	return NULL;
613a5fc38d4SHemant Agrawal }
614a5fc38d4SHemant Agrawal 
615c5acbb5eSHemant Agrawal /**
616c5acbb5eSHemant Agrawal  * Dpaa2 link Interrupt handler
617c5acbb5eSHemant Agrawal  *
618c5acbb5eSHemant Agrawal  * @param param
619c5acbb5eSHemant Agrawal  *  The address of parameter (struct rte_eth_dev *) regsitered before.
620c5acbb5eSHemant Agrawal  *
621c5acbb5eSHemant Agrawal  * @return
622c5acbb5eSHemant Agrawal  *  void
623c5acbb5eSHemant Agrawal  */
624c5acbb5eSHemant Agrawal static void
625c5acbb5eSHemant Agrawal dpaa2_interrupt_handler(void *param)
626c5acbb5eSHemant Agrawal {
627c5acbb5eSHemant Agrawal 	struct rte_eth_dev *dev = param;
628c5acbb5eSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
629c5acbb5eSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
630c5acbb5eSHemant Agrawal 	int ret;
631c5acbb5eSHemant Agrawal 	int irq_index = DPNI_IRQ_INDEX;
632c5acbb5eSHemant Agrawal 	unsigned int status = 0, clear = 0;
633c5acbb5eSHemant Agrawal 
634c5acbb5eSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
635c5acbb5eSHemant Agrawal 
636c5acbb5eSHemant Agrawal 	if (dpni == NULL) {
637c5acbb5eSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL");
638c5acbb5eSHemant Agrawal 		return;
639c5acbb5eSHemant Agrawal 	}
640c5acbb5eSHemant Agrawal 
641c5acbb5eSHemant Agrawal 	ret = dpni_get_irq_status(dpni, CMD_PRI_LOW, priv->token,
642c5acbb5eSHemant Agrawal 				  irq_index, &status);
643c5acbb5eSHemant Agrawal 	if (unlikely(ret)) {
644c5acbb5eSHemant Agrawal 		RTE_LOG(ERR, PMD, "Can't get irq status (err %d)", ret);
645c5acbb5eSHemant Agrawal 		clear = 0xffffffff;
646c5acbb5eSHemant Agrawal 		goto out;
647c5acbb5eSHemant Agrawal 	}
648c5acbb5eSHemant Agrawal 
649c5acbb5eSHemant Agrawal 	if (status & DPNI_IRQ_EVENT_LINK_CHANGED) {
650c5acbb5eSHemant Agrawal 		clear = DPNI_IRQ_EVENT_LINK_CHANGED;
651c5acbb5eSHemant Agrawal 		dpaa2_dev_link_update(dev, 0);
652c5acbb5eSHemant Agrawal 		/* calling all the apps registered for link status event */
653c5acbb5eSHemant Agrawal 		_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC,
654c5acbb5eSHemant Agrawal 					      NULL, NULL);
655c5acbb5eSHemant Agrawal 	}
656c5acbb5eSHemant Agrawal out:
657c5acbb5eSHemant Agrawal 	ret = dpni_clear_irq_status(dpni, CMD_PRI_LOW, priv->token,
658c5acbb5eSHemant Agrawal 				    irq_index, clear);
659c5acbb5eSHemant Agrawal 	if (unlikely(ret))
660c5acbb5eSHemant Agrawal 		RTE_LOG(ERR, PMD, "Can't clear irq status (err %d)", ret);
661c5acbb5eSHemant Agrawal }
662c5acbb5eSHemant Agrawal 
663c5acbb5eSHemant Agrawal static int
664c5acbb5eSHemant Agrawal dpaa2_eth_setup_irqs(struct rte_eth_dev *dev, int enable)
665c5acbb5eSHemant Agrawal {
666c5acbb5eSHemant Agrawal 	int err = 0;
667c5acbb5eSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
668c5acbb5eSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
669c5acbb5eSHemant Agrawal 	int irq_index = DPNI_IRQ_INDEX;
670c5acbb5eSHemant Agrawal 	unsigned int mask = DPNI_IRQ_EVENT_LINK_CHANGED;
671c5acbb5eSHemant Agrawal 
672c5acbb5eSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
673c5acbb5eSHemant Agrawal 
674c5acbb5eSHemant Agrawal 	err = dpni_set_irq_mask(dpni, CMD_PRI_LOW, priv->token,
675c5acbb5eSHemant Agrawal 				irq_index, mask);
676c5acbb5eSHemant Agrawal 	if (err < 0) {
677c5acbb5eSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error: dpni_set_irq_mask():%d (%s)", err,
678c5acbb5eSHemant Agrawal 			     strerror(-err));
679c5acbb5eSHemant Agrawal 		return err;
680c5acbb5eSHemant Agrawal 	}
681c5acbb5eSHemant Agrawal 
682c5acbb5eSHemant Agrawal 	err = dpni_set_irq_enable(dpni, CMD_PRI_LOW, priv->token,
683c5acbb5eSHemant Agrawal 				  irq_index, enable);
684c5acbb5eSHemant Agrawal 	if (err < 0)
685c5acbb5eSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error: dpni_set_irq_enable():%d (%s)", err,
686c5acbb5eSHemant Agrawal 			     strerror(-err));
687c5acbb5eSHemant Agrawal 
688c5acbb5eSHemant Agrawal 	return err;
689c5acbb5eSHemant Agrawal }
690c5acbb5eSHemant Agrawal 
6913e5a335dSHemant Agrawal static int
6923e5a335dSHemant Agrawal dpaa2_dev_start(struct rte_eth_dev *dev)
6933e5a335dSHemant Agrawal {
694c5acbb5eSHemant Agrawal 	struct rte_device *rdev = dev->device;
695c5acbb5eSHemant Agrawal 	struct rte_dpaa2_device *dpaa2_dev;
6963e5a335dSHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
6973e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = data->dev_private;
6983e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
6993e5a335dSHemant Agrawal 	struct dpni_queue cfg;
700ef18dafeSHemant Agrawal 	struct dpni_error_cfg	err_cfg;
7013e5a335dSHemant Agrawal 	uint16_t qdid;
7023e5a335dSHemant Agrawal 	struct dpni_queue_id qid;
7033e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
7043e5a335dSHemant Agrawal 	int ret, i;
705c5acbb5eSHemant Agrawal 	struct rte_intr_handle *intr_handle;
706c5acbb5eSHemant Agrawal 
707c5acbb5eSHemant Agrawal 	dpaa2_dev = container_of(rdev, struct rte_dpaa2_device, device);
708c5acbb5eSHemant Agrawal 	intr_handle = &dpaa2_dev->intr_handle;
7093e5a335dSHemant Agrawal 
7103e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
7113e5a335dSHemant Agrawal 
7123e5a335dSHemant Agrawal 	ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
7133e5a335dSHemant Agrawal 	if (ret) {
7143e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Failure %d in enabling dpni %d device\n",
7153e5a335dSHemant Agrawal 			     ret, priv->hw_id);
7163e5a335dSHemant Agrawal 		return ret;
7173e5a335dSHemant Agrawal 	}
7183e5a335dSHemant Agrawal 
719aa8c595aSHemant Agrawal 	/* Power up the phy. Needed to make the link go UP */
720a1f3a12cSHemant Agrawal 	dpaa2_dev_set_link_up(dev);
721a1f3a12cSHemant Agrawal 
7223e5a335dSHemant Agrawal 	ret = dpni_get_qdid(dpni, CMD_PRI_LOW, priv->token,
7233e5a335dSHemant Agrawal 			    DPNI_QUEUE_TX, &qdid);
7243e5a335dSHemant Agrawal 	if (ret) {
7253e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to get qdid:ErrorCode = %d\n", ret);
7263e5a335dSHemant Agrawal 		return ret;
7273e5a335dSHemant Agrawal 	}
7283e5a335dSHemant Agrawal 	priv->qdid = qdid;
7293e5a335dSHemant Agrawal 
7303e5a335dSHemant Agrawal 	for (i = 0; i < data->nb_rx_queues; i++) {
7313e5a335dSHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)data->rx_queues[i];
7323e5a335dSHemant Agrawal 		ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,
7333e5a335dSHemant Agrawal 				     DPNI_QUEUE_RX, dpaa2_q->tc_index,
7343e5a335dSHemant Agrawal 				       dpaa2_q->flow_id, &cfg, &qid);
7353e5a335dSHemant Agrawal 		if (ret) {
7363e5a335dSHemant Agrawal 			PMD_INIT_LOG(ERR, "Error to get flow "
7373e5a335dSHemant Agrawal 				     "information Error code = %d\n", ret);
7383e5a335dSHemant Agrawal 			return ret;
7393e5a335dSHemant Agrawal 		}
7403e5a335dSHemant Agrawal 		dpaa2_q->fqid = qid.fqid;
7413e5a335dSHemant Agrawal 	}
7423e5a335dSHemant Agrawal 
743ef18dafeSHemant Agrawal 	/*checksum errors, send them to normal path and set it in annotation */
744ef18dafeSHemant Agrawal 	err_cfg.errors = DPNI_ERROR_L3CE | DPNI_ERROR_L4CE;
745ef18dafeSHemant Agrawal 
746ef18dafeSHemant Agrawal 	err_cfg.error_action = DPNI_ERROR_ACTION_CONTINUE;
747ef18dafeSHemant Agrawal 	err_cfg.set_frame_annotation = true;
748ef18dafeSHemant Agrawal 
749ef18dafeSHemant Agrawal 	ret = dpni_set_errors_behavior(dpni, CMD_PRI_LOW,
750ef18dafeSHemant Agrawal 				       priv->token, &err_cfg);
751ef18dafeSHemant Agrawal 	if (ret) {
752ef18dafeSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to dpni_set_errors_behavior:"
753ef18dafeSHemant Agrawal 			     "code = %d\n", ret);
754ef18dafeSHemant Agrawal 		return ret;
755ef18dafeSHemant Agrawal 	}
7563ce294f2SHemant Agrawal 	/* VLAN Offload Settings */
7573ce294f2SHemant Agrawal 	if (priv->max_vlan_filters)
7583ce294f2SHemant Agrawal 		dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);
759ef18dafeSHemant Agrawal 
760c5acbb5eSHemant Agrawal 	/* if the interrupts were configured on this devices*/
761c5acbb5eSHemant Agrawal 	if (intr_handle && (intr_handle->fd) &&
762c5acbb5eSHemant Agrawal 	    (dev->data->dev_conf.intr_conf.lsc != 0)) {
763c5acbb5eSHemant Agrawal 		/* Registering LSC interrupt handler */
764c5acbb5eSHemant Agrawal 		rte_intr_callback_register(intr_handle,
765c5acbb5eSHemant Agrawal 					   dpaa2_interrupt_handler,
766c5acbb5eSHemant Agrawal 					   (void *)dev);
767c5acbb5eSHemant Agrawal 
768c5acbb5eSHemant Agrawal 		/* enable vfio intr/eventfd mapping
769c5acbb5eSHemant Agrawal 		 * Interrupt index 0 is required, so we can not use
770c5acbb5eSHemant Agrawal 		 * rte_intr_enable.
771c5acbb5eSHemant Agrawal 		 */
772c5acbb5eSHemant Agrawal 		rte_dpaa2_intr_enable(intr_handle, DPNI_IRQ_INDEX);
773c5acbb5eSHemant Agrawal 
774c5acbb5eSHemant Agrawal 		/* enable dpni_irqs */
775c5acbb5eSHemant Agrawal 		dpaa2_eth_setup_irqs(dev, 1);
776c5acbb5eSHemant Agrawal 	}
777c5acbb5eSHemant Agrawal 
7783e5a335dSHemant Agrawal 	return 0;
7793e5a335dSHemant Agrawal }
7803e5a335dSHemant Agrawal 
7813e5a335dSHemant Agrawal /**
7823e5a335dSHemant Agrawal  *  This routine disables all traffic on the adapter by issuing a
7833e5a335dSHemant Agrawal  *  global reset on the MAC.
7843e5a335dSHemant Agrawal  */
7853e5a335dSHemant Agrawal static void
7863e5a335dSHemant Agrawal dpaa2_dev_stop(struct rte_eth_dev *dev)
7873e5a335dSHemant Agrawal {
7883e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
7893e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
7903e5a335dSHemant Agrawal 	int ret;
791c56c86ffSHemant Agrawal 	struct rte_eth_link link;
792c5acbb5eSHemant Agrawal 	struct rte_intr_handle *intr_handle = dev->intr_handle;
7933e5a335dSHemant Agrawal 
7943e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
7953e5a335dSHemant Agrawal 
796c5acbb5eSHemant Agrawal 	/* reset interrupt callback  */
797c5acbb5eSHemant Agrawal 	if (intr_handle && (intr_handle->fd) &&
798c5acbb5eSHemant Agrawal 	    (dev->data->dev_conf.intr_conf.lsc != 0)) {
799c5acbb5eSHemant Agrawal 		/*disable dpni irqs */
800c5acbb5eSHemant Agrawal 		dpaa2_eth_setup_irqs(dev, 0);
801c5acbb5eSHemant Agrawal 
802c5acbb5eSHemant Agrawal 		/* disable vfio intr before callback unregister */
803c5acbb5eSHemant Agrawal 		rte_dpaa2_intr_disable(intr_handle, DPNI_IRQ_INDEX);
804c5acbb5eSHemant Agrawal 
805c5acbb5eSHemant Agrawal 		/* Unregistering LSC interrupt handler */
806c5acbb5eSHemant Agrawal 		rte_intr_callback_unregister(intr_handle,
807c5acbb5eSHemant Agrawal 					     dpaa2_interrupt_handler,
808c5acbb5eSHemant Agrawal 					     (void *)dev);
809c5acbb5eSHemant Agrawal 	}
810c5acbb5eSHemant Agrawal 
811a1f3a12cSHemant Agrawal 	dpaa2_dev_set_link_down(dev);
812a1f3a12cSHemant Agrawal 
8133e5a335dSHemant Agrawal 	ret = dpni_disable(dpni, CMD_PRI_LOW, priv->token);
8143e5a335dSHemant Agrawal 	if (ret) {
8153e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Failure (ret %d) in disabling dpni %d dev\n",
8163e5a335dSHemant Agrawal 			     ret, priv->hw_id);
8173e5a335dSHemant Agrawal 		return;
8183e5a335dSHemant Agrawal 	}
819c56c86ffSHemant Agrawal 
820c56c86ffSHemant Agrawal 	/* clear the recorded link status */
821c56c86ffSHemant Agrawal 	memset(&link, 0, sizeof(link));
822c56c86ffSHemant Agrawal 	dpaa2_dev_atomic_write_link_status(dev, &link);
8233e5a335dSHemant Agrawal }
8243e5a335dSHemant Agrawal 
8253e5a335dSHemant Agrawal static void
8263e5a335dSHemant Agrawal dpaa2_dev_close(struct rte_eth_dev *dev)
8273e5a335dSHemant Agrawal {
8287ae777d0SHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
8293e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
8303e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
8317ae777d0SHemant Agrawal 	int i, ret;
832a1f3a12cSHemant Agrawal 	struct rte_eth_link link;
8337ae777d0SHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
8343e5a335dSHemant Agrawal 
8353e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
8363e5a335dSHemant Agrawal 
8377ae777d0SHemant Agrawal 	for (i = 0; i < data->nb_tx_queues; i++) {
8387ae777d0SHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)data->tx_queues[i];
8397ae777d0SHemant Agrawal 		if (!dpaa2_q->cscn) {
8407ae777d0SHemant Agrawal 			rte_free(dpaa2_q->cscn);
8417ae777d0SHemant Agrawal 			dpaa2_q->cscn = NULL;
8427ae777d0SHemant Agrawal 		}
8437ae777d0SHemant Agrawal 	}
8447ae777d0SHemant Agrawal 
8453e5a335dSHemant Agrawal 	/* Clean the device first */
8463e5a335dSHemant Agrawal 	ret = dpni_reset(dpni, CMD_PRI_LOW, priv->token);
8473e5a335dSHemant Agrawal 	if (ret) {
8483e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Failure cleaning dpni device with"
8493e5a335dSHemant Agrawal 			     " error code %d\n", ret);
8503e5a335dSHemant Agrawal 		return;
8513e5a335dSHemant Agrawal 	}
852a1f3a12cSHemant Agrawal 
853a1f3a12cSHemant Agrawal 	memset(&link, 0, sizeof(link));
854a1f3a12cSHemant Agrawal 	dpaa2_dev_atomic_write_link_status(dev, &link);
8553e5a335dSHemant Agrawal }
8563e5a335dSHemant Agrawal 
857c0e5c69aSHemant Agrawal static void
858c0e5c69aSHemant Agrawal dpaa2_dev_promiscuous_enable(
859c0e5c69aSHemant Agrawal 		struct rte_eth_dev *dev)
860c0e5c69aSHemant Agrawal {
861c0e5c69aSHemant Agrawal 	int ret;
862c0e5c69aSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
863c0e5c69aSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
864c0e5c69aSHemant Agrawal 
865c0e5c69aSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
866c0e5c69aSHemant Agrawal 
867c0e5c69aSHemant Agrawal 	if (dpni == NULL) {
868645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
869c0e5c69aSHemant Agrawal 		return;
870c0e5c69aSHemant Agrawal 	}
871c0e5c69aSHemant Agrawal 
872c0e5c69aSHemant Agrawal 	ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
873c0e5c69aSHemant Agrawal 	if (ret < 0)
874645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to enable U promisc mode %d\n", ret);
8755d5aeeedSHemant Agrawal 
8765d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
8775d5aeeedSHemant Agrawal 	if (ret < 0)
878645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to enable M promisc mode %d\n", ret);
879c0e5c69aSHemant Agrawal }
880c0e5c69aSHemant Agrawal 
881c0e5c69aSHemant Agrawal static void
882c0e5c69aSHemant Agrawal dpaa2_dev_promiscuous_disable(
883c0e5c69aSHemant Agrawal 		struct rte_eth_dev *dev)
884c0e5c69aSHemant Agrawal {
885c0e5c69aSHemant Agrawal 	int ret;
886c0e5c69aSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
887c0e5c69aSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
888c0e5c69aSHemant Agrawal 
889c0e5c69aSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
890c0e5c69aSHemant Agrawal 
891c0e5c69aSHemant Agrawal 	if (dpni == NULL) {
892645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
893c0e5c69aSHemant Agrawal 		return;
894c0e5c69aSHemant Agrawal 	}
895c0e5c69aSHemant Agrawal 
896c0e5c69aSHemant Agrawal 	ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
897c0e5c69aSHemant Agrawal 	if (ret < 0)
898645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to disable U promisc mode %d\n", ret);
8995d5aeeedSHemant Agrawal 
9005d5aeeedSHemant Agrawal 	if (dev->data->all_multicast == 0) {
9015d5aeeedSHemant Agrawal 		ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW,
9025d5aeeedSHemant Agrawal 						 priv->token, false);
9035d5aeeedSHemant Agrawal 		if (ret < 0)
904645bd25aSHemant Agrawal 			RTE_LOG(ERR, PMD,
905645bd25aSHemant Agrawal 				"Unable to disable M promisc mode %d\n",
9065d5aeeedSHemant Agrawal 				ret);
9075d5aeeedSHemant Agrawal 	}
9085d5aeeedSHemant Agrawal }
9095d5aeeedSHemant Agrawal 
9105d5aeeedSHemant Agrawal static void
9115d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_enable(
9125d5aeeedSHemant Agrawal 		struct rte_eth_dev *dev)
9135d5aeeedSHemant Agrawal {
9145d5aeeedSHemant Agrawal 	int ret;
9155d5aeeedSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
9165d5aeeedSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
9175d5aeeedSHemant Agrawal 
9185d5aeeedSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
9195d5aeeedSHemant Agrawal 
9205d5aeeedSHemant Agrawal 	if (dpni == NULL) {
921645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
9225d5aeeedSHemant Agrawal 		return;
9235d5aeeedSHemant Agrawal 	}
9245d5aeeedSHemant Agrawal 
9255d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
9265d5aeeedSHemant Agrawal 	if (ret < 0)
927645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to enable multicast mode %d\n", ret);
9285d5aeeedSHemant Agrawal }
9295d5aeeedSHemant Agrawal 
9305d5aeeedSHemant Agrawal static void
9315d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_disable(struct rte_eth_dev *dev)
9325d5aeeedSHemant Agrawal {
9335d5aeeedSHemant Agrawal 	int ret;
9345d5aeeedSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
9355d5aeeedSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
9365d5aeeedSHemant Agrawal 
9375d5aeeedSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
9385d5aeeedSHemant Agrawal 
9395d5aeeedSHemant Agrawal 	if (dpni == NULL) {
940645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
9415d5aeeedSHemant Agrawal 		return;
9425d5aeeedSHemant Agrawal 	}
9435d5aeeedSHemant Agrawal 
9445d5aeeedSHemant Agrawal 	/* must remain on for all promiscuous */
9455d5aeeedSHemant Agrawal 	if (dev->data->promiscuous == 1)
9465d5aeeedSHemant Agrawal 		return;
9475d5aeeedSHemant Agrawal 
9485d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
9495d5aeeedSHemant Agrawal 	if (ret < 0)
950645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to disable multicast mode %d\n", ret);
951c0e5c69aSHemant Agrawal }
952e31d4d21SHemant Agrawal 
953e31d4d21SHemant Agrawal static int
954e31d4d21SHemant Agrawal dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
955e31d4d21SHemant Agrawal {
956e31d4d21SHemant Agrawal 	int ret;
957e31d4d21SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
958e31d4d21SHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
959e31d4d21SHemant Agrawal 	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
960e31d4d21SHemant Agrawal 
961e31d4d21SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
962e31d4d21SHemant Agrawal 
963e31d4d21SHemant Agrawal 	if (dpni == NULL) {
964645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
965e31d4d21SHemant Agrawal 		return -EINVAL;
966e31d4d21SHemant Agrawal 	}
967e31d4d21SHemant Agrawal 
968e31d4d21SHemant Agrawal 	/* check that mtu is within the allowed range */
969e31d4d21SHemant Agrawal 	if ((mtu < ETHER_MIN_MTU) || (frame_size > DPAA2_MAX_RX_PKT_LEN))
970e31d4d21SHemant Agrawal 		return -EINVAL;
971e31d4d21SHemant Agrawal 
972e1640849SHemant Agrawal 	if (frame_size > ETHER_MAX_LEN)
973e1640849SHemant Agrawal 		dev->data->dev_conf.rxmode.jumbo_frame = 1;
974e1640849SHemant Agrawal 	else
975e1640849SHemant Agrawal 		dev->data->dev_conf.rxmode.jumbo_frame = 0;
976e1640849SHemant Agrawal 
977e31d4d21SHemant Agrawal 	/* Set the Max Rx frame length as 'mtu' +
978e31d4d21SHemant Agrawal 	 * Maximum Ethernet header length
979e31d4d21SHemant Agrawal 	 */
980e31d4d21SHemant Agrawal 	ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW, priv->token,
981e31d4d21SHemant Agrawal 					mtu + ETH_VLAN_HLEN);
982e31d4d21SHemant Agrawal 	if (ret) {
983e31d4d21SHemant Agrawal 		PMD_DRV_LOG(ERR, "setting the max frame length failed");
984e31d4d21SHemant Agrawal 		return -1;
985e31d4d21SHemant Agrawal 	}
9862bfea039SHemant Agrawal 	PMD_DRV_LOG(INFO, "MTU is configured %d for the device", mtu);
987e31d4d21SHemant Agrawal 	return 0;
988e31d4d21SHemant Agrawal }
989e31d4d21SHemant Agrawal 
990b4d97b7dSHemant Agrawal static int
991b4d97b7dSHemant Agrawal dpaa2_dev_add_mac_addr(struct rte_eth_dev *dev,
992b4d97b7dSHemant Agrawal 		       struct ether_addr *addr,
993b4d97b7dSHemant Agrawal 		       __rte_unused uint32_t index,
994b4d97b7dSHemant Agrawal 		       __rte_unused uint32_t pool)
995b4d97b7dSHemant Agrawal {
996b4d97b7dSHemant Agrawal 	int ret;
997b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
998b4d97b7dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
999b4d97b7dSHemant Agrawal 
1000b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1001b4d97b7dSHemant Agrawal 
1002b4d97b7dSHemant Agrawal 	if (dpni == NULL) {
1003645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1004b4d97b7dSHemant Agrawal 		return -1;
1005b4d97b7dSHemant Agrawal 	}
1006b4d97b7dSHemant Agrawal 
1007b4d97b7dSHemant Agrawal 	ret = dpni_add_mac_addr(dpni, CMD_PRI_LOW,
1008b4d97b7dSHemant Agrawal 				priv->token, addr->addr_bytes);
1009b4d97b7dSHemant Agrawal 	if (ret)
1010645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD,
1011645bd25aSHemant Agrawal 			"error: Adding the MAC ADDR failed: err = %d\n", ret);
1012b4d97b7dSHemant Agrawal 	return 0;
1013b4d97b7dSHemant Agrawal }
1014b4d97b7dSHemant Agrawal 
1015b4d97b7dSHemant Agrawal static void
1016b4d97b7dSHemant Agrawal dpaa2_dev_remove_mac_addr(struct rte_eth_dev *dev,
1017b4d97b7dSHemant Agrawal 			  uint32_t index)
1018b4d97b7dSHemant Agrawal {
1019b4d97b7dSHemant Agrawal 	int ret;
1020b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1021b4d97b7dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1022b4d97b7dSHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
1023b4d97b7dSHemant Agrawal 	struct ether_addr *macaddr;
1024b4d97b7dSHemant Agrawal 
1025b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1026b4d97b7dSHemant Agrawal 
1027b4d97b7dSHemant Agrawal 	macaddr = &data->mac_addrs[index];
1028b4d97b7dSHemant Agrawal 
1029b4d97b7dSHemant Agrawal 	if (dpni == NULL) {
1030645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1031b4d97b7dSHemant Agrawal 		return;
1032b4d97b7dSHemant Agrawal 	}
1033b4d97b7dSHemant Agrawal 
1034b4d97b7dSHemant Agrawal 	ret = dpni_remove_mac_addr(dpni, CMD_PRI_LOW,
1035b4d97b7dSHemant Agrawal 				   priv->token, macaddr->addr_bytes);
1036b4d97b7dSHemant Agrawal 	if (ret)
1037645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD,
1038645bd25aSHemant Agrawal 			"error: Removing the MAC ADDR failed: err = %d\n", ret);
1039b4d97b7dSHemant Agrawal }
1040b4d97b7dSHemant Agrawal 
1041b4d97b7dSHemant Agrawal static void
1042b4d97b7dSHemant Agrawal dpaa2_dev_set_mac_addr(struct rte_eth_dev *dev,
1043b4d97b7dSHemant Agrawal 		       struct ether_addr *addr)
1044b4d97b7dSHemant Agrawal {
1045b4d97b7dSHemant Agrawal 	int ret;
1046b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1047b4d97b7dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1048b4d97b7dSHemant Agrawal 
1049b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1050b4d97b7dSHemant Agrawal 
1051b4d97b7dSHemant Agrawal 	if (dpni == NULL) {
1052645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1053b4d97b7dSHemant Agrawal 		return;
1054b4d97b7dSHemant Agrawal 	}
1055b4d97b7dSHemant Agrawal 
1056b4d97b7dSHemant Agrawal 	ret = dpni_set_primary_mac_addr(dpni, CMD_PRI_LOW,
1057b4d97b7dSHemant Agrawal 					priv->token, addr->addr_bytes);
1058b4d97b7dSHemant Agrawal 
1059b4d97b7dSHemant Agrawal 	if (ret)
1060645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD,
1061645bd25aSHemant Agrawal 			"error: Setting the MAC ADDR failed %d\n", ret);
1062b4d97b7dSHemant Agrawal }
1063b0aa5459SHemant Agrawal static
1064*d5b0924bSMatan Azrad int dpaa2_dev_stats_get(struct rte_eth_dev *dev,
1065b0aa5459SHemant Agrawal 			 struct rte_eth_stats *stats)
1066b0aa5459SHemant Agrawal {
1067b0aa5459SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1068b0aa5459SHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1069b0aa5459SHemant Agrawal 	int32_t  retcode;
1070b0aa5459SHemant Agrawal 	uint8_t page0 = 0, page1 = 1, page2 = 2;
1071b0aa5459SHemant Agrawal 	union dpni_statistics value;
1072b0aa5459SHemant Agrawal 
1073b0aa5459SHemant Agrawal 	memset(&value, 0, sizeof(union dpni_statistics));
1074b0aa5459SHemant Agrawal 
1075b0aa5459SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1076b0aa5459SHemant Agrawal 
1077b0aa5459SHemant Agrawal 	if (!dpni) {
1078645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1079*d5b0924bSMatan Azrad 		return -EINVAL;
1080b0aa5459SHemant Agrawal 	}
1081b0aa5459SHemant Agrawal 
1082b0aa5459SHemant Agrawal 	if (!stats) {
1083645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "stats is NULL\n");
1084*d5b0924bSMatan Azrad 		return -EINVAL;
1085b0aa5459SHemant Agrawal 	}
1086b0aa5459SHemant Agrawal 
1087b0aa5459SHemant Agrawal 	/*Get Counters from page_0*/
1088b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
108916bbc98aSShreyansh Jain 				      page0, 0, &value);
1090b0aa5459SHemant Agrawal 	if (retcode)
1091b0aa5459SHemant Agrawal 		goto err;
1092b0aa5459SHemant Agrawal 
1093b0aa5459SHemant Agrawal 	stats->ipackets = value.page_0.ingress_all_frames;
1094b0aa5459SHemant Agrawal 	stats->ibytes = value.page_0.ingress_all_bytes;
1095b0aa5459SHemant Agrawal 
1096b0aa5459SHemant Agrawal 	/*Get Counters from page_1*/
1097b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
109816bbc98aSShreyansh Jain 				      page1, 0, &value);
1099b0aa5459SHemant Agrawal 	if (retcode)
1100b0aa5459SHemant Agrawal 		goto err;
1101b0aa5459SHemant Agrawal 
1102b0aa5459SHemant Agrawal 	stats->opackets = value.page_1.egress_all_frames;
1103b0aa5459SHemant Agrawal 	stats->obytes = value.page_1.egress_all_bytes;
1104b0aa5459SHemant Agrawal 
1105b0aa5459SHemant Agrawal 	/*Get Counters from page_2*/
1106b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
110716bbc98aSShreyansh Jain 				      page2, 0, &value);
1108b0aa5459SHemant Agrawal 	if (retcode)
1109b0aa5459SHemant Agrawal 		goto err;
1110b0aa5459SHemant Agrawal 
1111b4d97b7dSHemant Agrawal 	/* Ingress drop frame count due to configured rules */
1112b4d97b7dSHemant Agrawal 	stats->ierrors = value.page_2.ingress_filtered_frames;
1113b4d97b7dSHemant Agrawal 	/* Ingress drop frame count due to error */
1114b4d97b7dSHemant Agrawal 	stats->ierrors += value.page_2.ingress_discarded_frames;
1115b4d97b7dSHemant Agrawal 
1116b0aa5459SHemant Agrawal 	stats->oerrors = value.page_2.egress_discarded_frames;
1117b0aa5459SHemant Agrawal 	stats->imissed = value.page_2.ingress_nobuffer_discards;
1118b0aa5459SHemant Agrawal 
1119*d5b0924bSMatan Azrad 	return 0;
1120b0aa5459SHemant Agrawal 
1121b0aa5459SHemant Agrawal err:
1122b0aa5459SHemant Agrawal 	RTE_LOG(ERR, PMD, "Operation not completed:Error Code = %d\n", retcode);
1123*d5b0924bSMatan Azrad 	return retcode;
1124b0aa5459SHemant Agrawal };
1125b0aa5459SHemant Agrawal 
11261d6329b2SHemant Agrawal static int
11271d6329b2SHemant Agrawal dpaa2_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
11281d6329b2SHemant Agrawal 		     unsigned int n)
11291d6329b2SHemant Agrawal {
11301d6329b2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
11311d6329b2SHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
11321d6329b2SHemant Agrawal 	int32_t  retcode;
11331d6329b2SHemant Agrawal 	union dpni_statistics value[3] = {};
11341d6329b2SHemant Agrawal 	unsigned int i = 0, num = RTE_DIM(dpaa2_xstats_strings);
11351d6329b2SHemant Agrawal 
11361d6329b2SHemant Agrawal 	if (xstats == NULL)
11371d6329b2SHemant Agrawal 		return 0;
11381d6329b2SHemant Agrawal 
11391d6329b2SHemant Agrawal 	if (n < num)
11401d6329b2SHemant Agrawal 		return num;
11411d6329b2SHemant Agrawal 
11421d6329b2SHemant Agrawal 	/* Get Counters from page_0*/
11431d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
11441d6329b2SHemant Agrawal 				      0, 0, &value[0]);
11451d6329b2SHemant Agrawal 	if (retcode)
11461d6329b2SHemant Agrawal 		goto err;
11471d6329b2SHemant Agrawal 
11481d6329b2SHemant Agrawal 	/* Get Counters from page_1*/
11491d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
11501d6329b2SHemant Agrawal 				      1, 0, &value[1]);
11511d6329b2SHemant Agrawal 	if (retcode)
11521d6329b2SHemant Agrawal 		goto err;
11531d6329b2SHemant Agrawal 
11541d6329b2SHemant Agrawal 	/* Get Counters from page_2*/
11551d6329b2SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
11561d6329b2SHemant Agrawal 				      2, 0, &value[2]);
11571d6329b2SHemant Agrawal 	if (retcode)
11581d6329b2SHemant Agrawal 		goto err;
11591d6329b2SHemant Agrawal 
11601d6329b2SHemant Agrawal 	for (i = 0; i < num; i++) {
11611d6329b2SHemant Agrawal 		xstats[i].id = i;
11621d6329b2SHemant Agrawal 		xstats[i].value = value[dpaa2_xstats_strings[i].page_id].
11631d6329b2SHemant Agrawal 			raw.counter[dpaa2_xstats_strings[i].stats_id];
11641d6329b2SHemant Agrawal 	}
11651d6329b2SHemant Agrawal 	return i;
11661d6329b2SHemant Agrawal err:
11671d6329b2SHemant Agrawal 	RTE_LOG(ERR, PMD, "Error in obtaining extended stats (%d)\n", retcode);
11681d6329b2SHemant Agrawal 	return retcode;
11691d6329b2SHemant Agrawal }
11701d6329b2SHemant Agrawal 
11711d6329b2SHemant Agrawal static int
11721d6329b2SHemant Agrawal dpaa2_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
11731d6329b2SHemant Agrawal 		       struct rte_eth_xstat_name *xstats_names,
11741d6329b2SHemant Agrawal 		       __rte_unused unsigned int limit)
11751d6329b2SHemant Agrawal {
11761d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
11771d6329b2SHemant Agrawal 
11781d6329b2SHemant Agrawal 	if (xstats_names != NULL)
11791d6329b2SHemant Agrawal 		for (i = 0; i < stat_cnt; i++)
11801d6329b2SHemant Agrawal 			snprintf(xstats_names[i].name,
11811d6329b2SHemant Agrawal 				 sizeof(xstats_names[i].name),
11821d6329b2SHemant Agrawal 				 "%s",
11831d6329b2SHemant Agrawal 				 dpaa2_xstats_strings[i].name);
11841d6329b2SHemant Agrawal 
11851d6329b2SHemant Agrawal 	return stat_cnt;
11861d6329b2SHemant Agrawal }
11871d6329b2SHemant Agrawal 
11881d6329b2SHemant Agrawal static int
11891d6329b2SHemant Agrawal dpaa2_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
11901d6329b2SHemant Agrawal 		       uint64_t *values, unsigned int n)
11911d6329b2SHemant Agrawal {
11921d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
11931d6329b2SHemant Agrawal 	uint64_t values_copy[stat_cnt];
11941d6329b2SHemant Agrawal 
11951d6329b2SHemant Agrawal 	if (!ids) {
11961d6329b2SHemant Agrawal 		struct dpaa2_dev_priv *priv = dev->data->dev_private;
11971d6329b2SHemant Agrawal 		struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
11981d6329b2SHemant Agrawal 		int32_t  retcode;
11991d6329b2SHemant Agrawal 		union dpni_statistics value[3] = {};
12001d6329b2SHemant Agrawal 
12011d6329b2SHemant Agrawal 		if (n < stat_cnt)
12021d6329b2SHemant Agrawal 			return stat_cnt;
12031d6329b2SHemant Agrawal 
12041d6329b2SHemant Agrawal 		if (!values)
12051d6329b2SHemant Agrawal 			return 0;
12061d6329b2SHemant Agrawal 
12071d6329b2SHemant Agrawal 		/* Get Counters from page_0*/
12081d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
12091d6329b2SHemant Agrawal 					      0, 0, &value[0]);
12101d6329b2SHemant Agrawal 		if (retcode)
12111d6329b2SHemant Agrawal 			return 0;
12121d6329b2SHemant Agrawal 
12131d6329b2SHemant Agrawal 		/* Get Counters from page_1*/
12141d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
12151d6329b2SHemant Agrawal 					      1, 0, &value[1]);
12161d6329b2SHemant Agrawal 		if (retcode)
12171d6329b2SHemant Agrawal 			return 0;
12181d6329b2SHemant Agrawal 
12191d6329b2SHemant Agrawal 		/* Get Counters from page_2*/
12201d6329b2SHemant Agrawal 		retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
12211d6329b2SHemant Agrawal 					      2, 0, &value[2]);
12221d6329b2SHemant Agrawal 		if (retcode)
12231d6329b2SHemant Agrawal 			return 0;
12241d6329b2SHemant Agrawal 
12251d6329b2SHemant Agrawal 		for (i = 0; i < stat_cnt; i++) {
12261d6329b2SHemant Agrawal 			values[i] = value[dpaa2_xstats_strings[i].page_id].
12271d6329b2SHemant Agrawal 				raw.counter[dpaa2_xstats_strings[i].stats_id];
12281d6329b2SHemant Agrawal 		}
12291d6329b2SHemant Agrawal 		return stat_cnt;
12301d6329b2SHemant Agrawal 	}
12311d6329b2SHemant Agrawal 
12321d6329b2SHemant Agrawal 	dpaa2_xstats_get_by_id(dev, NULL, values_copy, stat_cnt);
12331d6329b2SHemant Agrawal 
12341d6329b2SHemant Agrawal 	for (i = 0; i < n; i++) {
12351d6329b2SHemant Agrawal 		if (ids[i] >= stat_cnt) {
12361d6329b2SHemant Agrawal 			PMD_INIT_LOG(ERR, "id value isn't valid");
12371d6329b2SHemant Agrawal 			return -1;
12381d6329b2SHemant Agrawal 		}
12391d6329b2SHemant Agrawal 		values[i] = values_copy[ids[i]];
12401d6329b2SHemant Agrawal 	}
12411d6329b2SHemant Agrawal 	return n;
12421d6329b2SHemant Agrawal }
12431d6329b2SHemant Agrawal 
12441d6329b2SHemant Agrawal static int
12451d6329b2SHemant Agrawal dpaa2_xstats_get_names_by_id(
12461d6329b2SHemant Agrawal 	struct rte_eth_dev *dev,
12471d6329b2SHemant Agrawal 	struct rte_eth_xstat_name *xstats_names,
12481d6329b2SHemant Agrawal 	const uint64_t *ids,
12491d6329b2SHemant Agrawal 	unsigned int limit)
12501d6329b2SHemant Agrawal {
12511d6329b2SHemant Agrawal 	unsigned int i, stat_cnt = RTE_DIM(dpaa2_xstats_strings);
12521d6329b2SHemant Agrawal 	struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
12531d6329b2SHemant Agrawal 
12541d6329b2SHemant Agrawal 	if (!ids)
12551d6329b2SHemant Agrawal 		return dpaa2_xstats_get_names(dev, xstats_names, limit);
12561d6329b2SHemant Agrawal 
12571d6329b2SHemant Agrawal 	dpaa2_xstats_get_names(dev, xstats_names_copy, limit);
12581d6329b2SHemant Agrawal 
12591d6329b2SHemant Agrawal 	for (i = 0; i < limit; i++) {
12601d6329b2SHemant Agrawal 		if (ids[i] >= stat_cnt) {
12611d6329b2SHemant Agrawal 			PMD_INIT_LOG(ERR, "id value isn't valid");
12621d6329b2SHemant Agrawal 			return -1;
12631d6329b2SHemant Agrawal 		}
12641d6329b2SHemant Agrawal 		strcpy(xstats_names[i].name, xstats_names_copy[ids[i]].name);
12651d6329b2SHemant Agrawal 	}
12661d6329b2SHemant Agrawal 	return limit;
12671d6329b2SHemant Agrawal }
12681d6329b2SHemant Agrawal 
12691d6329b2SHemant Agrawal static void
12701d6329b2SHemant Agrawal dpaa2_dev_stats_reset(struct rte_eth_dev *dev)
1271b0aa5459SHemant Agrawal {
1272b0aa5459SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1273b0aa5459SHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1274b0aa5459SHemant Agrawal 	int32_t  retcode;
1275b0aa5459SHemant Agrawal 
1276b0aa5459SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1277b0aa5459SHemant Agrawal 
1278b0aa5459SHemant Agrawal 	if (dpni == NULL) {
1279645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1280b0aa5459SHemant Agrawal 		return;
1281b0aa5459SHemant Agrawal 	}
1282b0aa5459SHemant Agrawal 
1283b0aa5459SHemant Agrawal 	retcode =  dpni_reset_statistics(dpni, CMD_PRI_LOW, priv->token);
1284b0aa5459SHemant Agrawal 	if (retcode)
1285b0aa5459SHemant Agrawal 		goto error;
1286b0aa5459SHemant Agrawal 
1287b0aa5459SHemant Agrawal 	return;
1288b0aa5459SHemant Agrawal 
1289b0aa5459SHemant Agrawal error:
1290b0aa5459SHemant Agrawal 	RTE_LOG(ERR, PMD, "Operation not completed:Error Code = %d\n", retcode);
1291b0aa5459SHemant Agrawal 	return;
1292b0aa5459SHemant Agrawal };
1293b0aa5459SHemant Agrawal 
1294c56c86ffSHemant Agrawal /* return 0 means link status changed, -1 means not changed */
1295c56c86ffSHemant Agrawal static int
1296c56c86ffSHemant Agrawal dpaa2_dev_link_update(struct rte_eth_dev *dev,
1297c56c86ffSHemant Agrawal 			int wait_to_complete __rte_unused)
1298c56c86ffSHemant Agrawal {
1299c56c86ffSHemant Agrawal 	int ret;
1300c56c86ffSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1301c56c86ffSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1302c56c86ffSHemant Agrawal 	struct rte_eth_link link, old;
1303c56c86ffSHemant Agrawal 	struct dpni_link_state state = {0};
1304c56c86ffSHemant Agrawal 
1305c56c86ffSHemant Agrawal 	if (dpni == NULL) {
1306645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1307c56c86ffSHemant Agrawal 		return 0;
1308c56c86ffSHemant Agrawal 	}
1309c56c86ffSHemant Agrawal 	memset(&old, 0, sizeof(old));
1310c56c86ffSHemant Agrawal 	dpaa2_dev_atomic_read_link_status(dev, &old);
1311c56c86ffSHemant Agrawal 
1312c56c86ffSHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1313c56c86ffSHemant Agrawal 	if (ret < 0) {
1314645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "error: dpni_get_link_state %d\n", ret);
1315c56c86ffSHemant Agrawal 		return -1;
1316c56c86ffSHemant Agrawal 	}
1317c56c86ffSHemant Agrawal 
1318c56c86ffSHemant Agrawal 	if ((old.link_status == state.up) && (old.link_speed == state.rate)) {
1319c56c86ffSHemant Agrawal 		RTE_LOG(DEBUG, PMD, "No change in status\n");
1320c56c86ffSHemant Agrawal 		return -1;
1321c56c86ffSHemant Agrawal 	}
1322c56c86ffSHemant Agrawal 
1323c56c86ffSHemant Agrawal 	memset(&link, 0, sizeof(struct rte_eth_link));
1324c56c86ffSHemant Agrawal 	link.link_status = state.up;
1325c56c86ffSHemant Agrawal 	link.link_speed = state.rate;
1326c56c86ffSHemant Agrawal 
1327c56c86ffSHemant Agrawal 	if (state.options & DPNI_LINK_OPT_HALF_DUPLEX)
1328c56c86ffSHemant Agrawal 		link.link_duplex = ETH_LINK_HALF_DUPLEX;
1329c56c86ffSHemant Agrawal 	else
1330c56c86ffSHemant Agrawal 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
1331c56c86ffSHemant Agrawal 
1332c56c86ffSHemant Agrawal 	dpaa2_dev_atomic_write_link_status(dev, &link);
1333c56c86ffSHemant Agrawal 
1334c56c86ffSHemant Agrawal 	if (link.link_status)
1335c56c86ffSHemant Agrawal 		PMD_DRV_LOG(INFO, "Port %d Link is Up\n", dev->data->port_id);
1336c56c86ffSHemant Agrawal 	else
1337aa8c595aSHemant Agrawal 		PMD_DRV_LOG(INFO, "Port %d Link is Down", dev->data->port_id);
1338c56c86ffSHemant Agrawal 	return 0;
1339c56c86ffSHemant Agrawal }
1340c56c86ffSHemant Agrawal 
1341a1f3a12cSHemant Agrawal /**
1342a1f3a12cSHemant Agrawal  * Toggle the DPNI to enable, if not already enabled.
1343a1f3a12cSHemant Agrawal  * This is not strictly PHY up/down - it is more of logical toggling.
1344a1f3a12cSHemant Agrawal  */
1345a1f3a12cSHemant Agrawal static int
1346a1f3a12cSHemant Agrawal dpaa2_dev_set_link_up(struct rte_eth_dev *dev)
1347a1f3a12cSHemant Agrawal {
1348a1f3a12cSHemant Agrawal 	int ret = -EINVAL;
1349a1f3a12cSHemant Agrawal 	struct dpaa2_dev_priv *priv;
1350a1f3a12cSHemant Agrawal 	struct fsl_mc_io *dpni;
1351a1f3a12cSHemant Agrawal 	int en = 0;
1352aa8c595aSHemant Agrawal 	struct dpni_link_state state = {0};
1353a1f3a12cSHemant Agrawal 
1354a1f3a12cSHemant Agrawal 	priv = dev->data->dev_private;
1355a1f3a12cSHemant Agrawal 	dpni = (struct fsl_mc_io *)priv->hw;
1356a1f3a12cSHemant Agrawal 
1357a1f3a12cSHemant Agrawal 	if (dpni == NULL) {
1358645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "DPNI is NULL\n");
1359a1f3a12cSHemant Agrawal 		return ret;
1360a1f3a12cSHemant Agrawal 	}
1361a1f3a12cSHemant Agrawal 
1362a1f3a12cSHemant Agrawal 	/* Check if DPNI is currently enabled */
1363a1f3a12cSHemant Agrawal 	ret = dpni_is_enabled(dpni, CMD_PRI_LOW, priv->token, &en);
1364a1f3a12cSHemant Agrawal 	if (ret) {
1365a1f3a12cSHemant Agrawal 		/* Unable to obtain dpni status; Not continuing */
1366a1f3a12cSHemant Agrawal 		PMD_DRV_LOG(ERR, "Interface Link UP failed (%d)", ret);
1367a1f3a12cSHemant Agrawal 		return -EINVAL;
1368a1f3a12cSHemant Agrawal 	}
1369a1f3a12cSHemant Agrawal 
1370a1f3a12cSHemant Agrawal 	/* Enable link if not already enabled */
1371a1f3a12cSHemant Agrawal 	if (!en) {
1372a1f3a12cSHemant Agrawal 		ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
1373a1f3a12cSHemant Agrawal 		if (ret) {
1374a1f3a12cSHemant Agrawal 			PMD_DRV_LOG(ERR, "Interface Link UP failed (%d)", ret);
1375a1f3a12cSHemant Agrawal 			return -EINVAL;
1376a1f3a12cSHemant Agrawal 		}
1377a1f3a12cSHemant Agrawal 	}
1378aa8c595aSHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1379aa8c595aSHemant Agrawal 	if (ret < 0) {
1380aa8c595aSHemant Agrawal 		RTE_LOG(ERR, PMD, "error: dpni_get_link_state %d\n", ret);
1381aa8c595aSHemant Agrawal 		return -1;
1382aa8c595aSHemant Agrawal 	}
1383aa8c595aSHemant Agrawal 
1384a1f3a12cSHemant Agrawal 	/* changing tx burst function to start enqueues */
1385a1f3a12cSHemant Agrawal 	dev->tx_pkt_burst = dpaa2_dev_tx;
1386aa8c595aSHemant Agrawal 	dev->data->dev_link.link_status = state.up;
1387a1f3a12cSHemant Agrawal 
1388aa8c595aSHemant Agrawal 	if (state.up)
1389aa8c595aSHemant Agrawal 		PMD_DRV_LOG(INFO, "Port %d Link is set as UP",
1390aa8c595aSHemant Agrawal 			    dev->data->port_id);
1391aa8c595aSHemant Agrawal 	else
1392aa8c595aSHemant Agrawal 		PMD_DRV_LOG(INFO, "Port %d Link is DOWN", dev->data->port_id);
1393a1f3a12cSHemant Agrawal 	return ret;
1394a1f3a12cSHemant Agrawal }
1395a1f3a12cSHemant Agrawal 
1396a1f3a12cSHemant Agrawal /**
1397a1f3a12cSHemant Agrawal  * Toggle the DPNI to disable, if not already disabled.
1398a1f3a12cSHemant Agrawal  * This is not strictly PHY up/down - it is more of logical toggling.
1399a1f3a12cSHemant Agrawal  */
1400a1f3a12cSHemant Agrawal static int
1401a1f3a12cSHemant Agrawal dpaa2_dev_set_link_down(struct rte_eth_dev *dev)
1402a1f3a12cSHemant Agrawal {
1403a1f3a12cSHemant Agrawal 	int ret = -EINVAL;
1404a1f3a12cSHemant Agrawal 	struct dpaa2_dev_priv *priv;
1405a1f3a12cSHemant Agrawal 	struct fsl_mc_io *dpni;
1406a1f3a12cSHemant Agrawal 	int dpni_enabled = 0;
1407a1f3a12cSHemant Agrawal 	int retries = 10;
1408a1f3a12cSHemant Agrawal 
1409a1f3a12cSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1410a1f3a12cSHemant Agrawal 
1411a1f3a12cSHemant Agrawal 	priv = dev->data->dev_private;
1412a1f3a12cSHemant Agrawal 	dpni = (struct fsl_mc_io *)priv->hw;
1413a1f3a12cSHemant Agrawal 
1414a1f3a12cSHemant Agrawal 	if (dpni == NULL) {
1415645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Device has not yet been configured\n");
1416a1f3a12cSHemant Agrawal 		return ret;
1417a1f3a12cSHemant Agrawal 	}
1418a1f3a12cSHemant Agrawal 
1419a1f3a12cSHemant Agrawal 	/*changing  tx burst function to avoid any more enqueues */
1420a1f3a12cSHemant Agrawal 	dev->tx_pkt_burst = dummy_dev_tx;
1421a1f3a12cSHemant Agrawal 
1422a1f3a12cSHemant Agrawal 	/* Loop while dpni_disable() attempts to drain the egress FQs
1423a1f3a12cSHemant Agrawal 	 * and confirm them back to us.
1424a1f3a12cSHemant Agrawal 	 */
1425a1f3a12cSHemant Agrawal 	do {
1426a1f3a12cSHemant Agrawal 		ret = dpni_disable(dpni, 0, priv->token);
1427a1f3a12cSHemant Agrawal 		if (ret) {
1428a1f3a12cSHemant Agrawal 			PMD_DRV_LOG(ERR, "dpni disable failed (%d)", ret);
1429a1f3a12cSHemant Agrawal 			return ret;
1430a1f3a12cSHemant Agrawal 		}
1431a1f3a12cSHemant Agrawal 		ret = dpni_is_enabled(dpni, 0, priv->token, &dpni_enabled);
1432a1f3a12cSHemant Agrawal 		if (ret) {
1433a1f3a12cSHemant Agrawal 			PMD_DRV_LOG(ERR, "dpni_is_enabled failed (%d)", ret);
1434a1f3a12cSHemant Agrawal 			return ret;
1435a1f3a12cSHemant Agrawal 		}
1436a1f3a12cSHemant Agrawal 		if (dpni_enabled)
1437a1f3a12cSHemant Agrawal 			/* Allow the MC some slack */
1438a1f3a12cSHemant Agrawal 			rte_delay_us(100 * 1000);
1439a1f3a12cSHemant Agrawal 	} while (dpni_enabled && --retries);
1440a1f3a12cSHemant Agrawal 
1441a1f3a12cSHemant Agrawal 	if (!retries) {
1442a1f3a12cSHemant Agrawal 		PMD_DRV_LOG(WARNING, "Retry count exceeded disabling DPNI\n");
1443a1f3a12cSHemant Agrawal 		/* todo- we may have to manually cleanup queues.
1444a1f3a12cSHemant Agrawal 		 */
1445a1f3a12cSHemant Agrawal 	} else {
1446a1f3a12cSHemant Agrawal 		PMD_DRV_LOG(INFO, "Port %d Link DOWN successful",
1447a1f3a12cSHemant Agrawal 			    dev->data->port_id);
1448a1f3a12cSHemant Agrawal 	}
1449a1f3a12cSHemant Agrawal 
1450a1f3a12cSHemant Agrawal 	dev->data->dev_link.link_status = 0;
1451a1f3a12cSHemant Agrawal 
1452a1f3a12cSHemant Agrawal 	return ret;
1453a1f3a12cSHemant Agrawal }
1454a1f3a12cSHemant Agrawal 
1455977d0006SHemant Agrawal static int
1456977d0006SHemant Agrawal dpaa2_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
1457977d0006SHemant Agrawal {
1458977d0006SHemant Agrawal 	int ret = -EINVAL;
1459977d0006SHemant Agrawal 	struct dpaa2_dev_priv *priv;
1460977d0006SHemant Agrawal 	struct fsl_mc_io *dpni;
1461977d0006SHemant Agrawal 	struct dpni_link_state state = {0};
1462977d0006SHemant Agrawal 
1463977d0006SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1464977d0006SHemant Agrawal 
1465977d0006SHemant Agrawal 	priv = dev->data->dev_private;
1466977d0006SHemant Agrawal 	dpni = (struct fsl_mc_io *)priv->hw;
1467977d0006SHemant Agrawal 
1468977d0006SHemant Agrawal 	if (dpni == NULL || fc_conf == NULL) {
1469645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "device not configured\n");
1470977d0006SHemant Agrawal 		return ret;
1471977d0006SHemant Agrawal 	}
1472977d0006SHemant Agrawal 
1473977d0006SHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1474977d0006SHemant Agrawal 	if (ret) {
1475645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "error: dpni_get_link_state %d\n", ret);
1476977d0006SHemant Agrawal 		return ret;
1477977d0006SHemant Agrawal 	}
1478977d0006SHemant Agrawal 
1479977d0006SHemant Agrawal 	memset(fc_conf, 0, sizeof(struct rte_eth_fc_conf));
1480977d0006SHemant Agrawal 	if (state.options & DPNI_LINK_OPT_PAUSE) {
1481977d0006SHemant Agrawal 		/* DPNI_LINK_OPT_PAUSE set
1482977d0006SHemant Agrawal 		 *  if ASYM_PAUSE not set,
1483977d0006SHemant Agrawal 		 *	RX Side flow control (handle received Pause frame)
1484977d0006SHemant Agrawal 		 *	TX side flow control (send Pause frame)
1485977d0006SHemant Agrawal 		 *  if ASYM_PAUSE set,
1486977d0006SHemant Agrawal 		 *	RX Side flow control (handle received Pause frame)
1487977d0006SHemant Agrawal 		 *	No TX side flow control (send Pause frame disabled)
1488977d0006SHemant Agrawal 		 */
1489977d0006SHemant Agrawal 		if (!(state.options & DPNI_LINK_OPT_ASYM_PAUSE))
1490977d0006SHemant Agrawal 			fc_conf->mode = RTE_FC_FULL;
1491977d0006SHemant Agrawal 		else
1492977d0006SHemant Agrawal 			fc_conf->mode = RTE_FC_RX_PAUSE;
1493977d0006SHemant Agrawal 	} else {
1494977d0006SHemant Agrawal 		/* DPNI_LINK_OPT_PAUSE not set
1495977d0006SHemant Agrawal 		 *  if ASYM_PAUSE set,
1496977d0006SHemant Agrawal 		 *	TX side flow control (send Pause frame)
1497977d0006SHemant Agrawal 		 *	No RX side flow control (No action on pause frame rx)
1498977d0006SHemant Agrawal 		 *  if ASYM_PAUSE not set,
1499977d0006SHemant Agrawal 		 *	Flow control disabled
1500977d0006SHemant Agrawal 		 */
1501977d0006SHemant Agrawal 		if (state.options & DPNI_LINK_OPT_ASYM_PAUSE)
1502977d0006SHemant Agrawal 			fc_conf->mode = RTE_FC_TX_PAUSE;
1503977d0006SHemant Agrawal 		else
1504977d0006SHemant Agrawal 			fc_conf->mode = RTE_FC_NONE;
1505977d0006SHemant Agrawal 	}
1506977d0006SHemant Agrawal 
1507977d0006SHemant Agrawal 	return ret;
1508977d0006SHemant Agrawal }
1509977d0006SHemant Agrawal 
1510977d0006SHemant Agrawal static int
1511977d0006SHemant Agrawal dpaa2_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
1512977d0006SHemant Agrawal {
1513977d0006SHemant Agrawal 	int ret = -EINVAL;
1514977d0006SHemant Agrawal 	struct dpaa2_dev_priv *priv;
1515977d0006SHemant Agrawal 	struct fsl_mc_io *dpni;
1516977d0006SHemant Agrawal 	struct dpni_link_state state = {0};
1517977d0006SHemant Agrawal 	struct dpni_link_cfg cfg = {0};
1518977d0006SHemant Agrawal 
1519977d0006SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1520977d0006SHemant Agrawal 
1521977d0006SHemant Agrawal 	priv = dev->data->dev_private;
1522977d0006SHemant Agrawal 	dpni = (struct fsl_mc_io *)priv->hw;
1523977d0006SHemant Agrawal 
1524977d0006SHemant Agrawal 	if (dpni == NULL) {
1525645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1526977d0006SHemant Agrawal 		return ret;
1527977d0006SHemant Agrawal 	}
1528977d0006SHemant Agrawal 
1529977d0006SHemant Agrawal 	/* It is necessary to obtain the current state before setting fc_conf
1530977d0006SHemant Agrawal 	 * as MC would return error in case rate, autoneg or duplex values are
1531977d0006SHemant Agrawal 	 * different.
1532977d0006SHemant Agrawal 	 */
1533977d0006SHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1534977d0006SHemant Agrawal 	if (ret) {
1535645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to get link state (err=%d)\n", ret);
1536977d0006SHemant Agrawal 		return -1;
1537977d0006SHemant Agrawal 	}
1538977d0006SHemant Agrawal 
1539977d0006SHemant Agrawal 	/* Disable link before setting configuration */
1540977d0006SHemant Agrawal 	dpaa2_dev_set_link_down(dev);
1541977d0006SHemant Agrawal 
1542977d0006SHemant Agrawal 	/* Based on fc_conf, update cfg */
1543977d0006SHemant Agrawal 	cfg.rate = state.rate;
1544977d0006SHemant Agrawal 	cfg.options = state.options;
1545977d0006SHemant Agrawal 
1546977d0006SHemant Agrawal 	/* update cfg with fc_conf */
1547977d0006SHemant Agrawal 	switch (fc_conf->mode) {
1548977d0006SHemant Agrawal 	case RTE_FC_FULL:
1549977d0006SHemant Agrawal 		/* Full flow control;
1550977d0006SHemant Agrawal 		 * OPT_PAUSE set, ASYM_PAUSE not set
1551977d0006SHemant Agrawal 		 */
1552977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_PAUSE;
1553977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;
1554f090a4c3SHemant Agrawal 		break;
1555977d0006SHemant Agrawal 	case RTE_FC_TX_PAUSE:
1556977d0006SHemant Agrawal 		/* Enable RX flow control
1557977d0006SHemant Agrawal 		 * OPT_PAUSE not set;
1558977d0006SHemant Agrawal 		 * ASYM_PAUSE set;
1559977d0006SHemant Agrawal 		 */
1560977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE;
1561977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_PAUSE;
1562977d0006SHemant Agrawal 		break;
1563977d0006SHemant Agrawal 	case RTE_FC_RX_PAUSE:
1564977d0006SHemant Agrawal 		/* Enable TX Flow control
1565977d0006SHemant Agrawal 		 * OPT_PAUSE set
1566977d0006SHemant Agrawal 		 * ASYM_PAUSE set
1567977d0006SHemant Agrawal 		 */
1568977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_PAUSE;
1569977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE;
1570977d0006SHemant Agrawal 		break;
1571977d0006SHemant Agrawal 	case RTE_FC_NONE:
1572977d0006SHemant Agrawal 		/* Disable Flow control
1573977d0006SHemant Agrawal 		 * OPT_PAUSE not set
1574977d0006SHemant Agrawal 		 * ASYM_PAUSE not set
1575977d0006SHemant Agrawal 		 */
1576977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_PAUSE;
1577977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;
1578977d0006SHemant Agrawal 		break;
1579977d0006SHemant Agrawal 	default:
1580645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Incorrect Flow control flag (%d)\n",
1581977d0006SHemant Agrawal 			fc_conf->mode);
1582977d0006SHemant Agrawal 		return -1;
1583977d0006SHemant Agrawal 	}
1584977d0006SHemant Agrawal 
1585977d0006SHemant Agrawal 	ret = dpni_set_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
1586977d0006SHemant Agrawal 	if (ret)
1587645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD,
1588645bd25aSHemant Agrawal 			"Unable to set Link configuration (err=%d)\n",
1589977d0006SHemant Agrawal 			ret);
1590977d0006SHemant Agrawal 
1591977d0006SHemant Agrawal 	/* Enable link */
1592977d0006SHemant Agrawal 	dpaa2_dev_set_link_up(dev);
1593977d0006SHemant Agrawal 
1594977d0006SHemant Agrawal 	return ret;
1595977d0006SHemant Agrawal }
1596977d0006SHemant Agrawal 
159763d5c3b0SHemant Agrawal static int
159863d5c3b0SHemant Agrawal dpaa2_dev_rss_hash_update(struct rte_eth_dev *dev,
159963d5c3b0SHemant Agrawal 			  struct rte_eth_rss_conf *rss_conf)
160063d5c3b0SHemant Agrawal {
160163d5c3b0SHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
160263d5c3b0SHemant Agrawal 	struct rte_eth_conf *eth_conf = &data->dev_conf;
160363d5c3b0SHemant Agrawal 	int ret;
160463d5c3b0SHemant Agrawal 
160563d5c3b0SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
160663d5c3b0SHemant Agrawal 
160763d5c3b0SHemant Agrawal 	if (rss_conf->rss_hf) {
160863d5c3b0SHemant Agrawal 		ret = dpaa2_setup_flow_dist(dev, rss_conf->rss_hf);
160963d5c3b0SHemant Agrawal 		if (ret) {
161063d5c3b0SHemant Agrawal 			PMD_INIT_LOG(ERR, "unable to set flow dist");
161163d5c3b0SHemant Agrawal 			return ret;
161263d5c3b0SHemant Agrawal 		}
161363d5c3b0SHemant Agrawal 	} else {
161463d5c3b0SHemant Agrawal 		ret = dpaa2_remove_flow_dist(dev, 0);
161563d5c3b0SHemant Agrawal 		if (ret) {
161663d5c3b0SHemant Agrawal 			PMD_INIT_LOG(ERR, "unable to remove flow dist");
161763d5c3b0SHemant Agrawal 			return ret;
161863d5c3b0SHemant Agrawal 		}
161963d5c3b0SHemant Agrawal 	}
162063d5c3b0SHemant Agrawal 	eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_conf->rss_hf;
162163d5c3b0SHemant Agrawal 	return 0;
162263d5c3b0SHemant Agrawal }
162363d5c3b0SHemant Agrawal 
162463d5c3b0SHemant Agrawal static int
162563d5c3b0SHemant Agrawal dpaa2_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
162663d5c3b0SHemant Agrawal 			    struct rte_eth_rss_conf *rss_conf)
162763d5c3b0SHemant Agrawal {
162863d5c3b0SHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
162963d5c3b0SHemant Agrawal 	struct rte_eth_conf *eth_conf = &data->dev_conf;
163063d5c3b0SHemant Agrawal 
163163d5c3b0SHemant Agrawal 	/* dpaa2 does not support rss_key, so length should be 0*/
163263d5c3b0SHemant Agrawal 	rss_conf->rss_key_len = 0;
163363d5c3b0SHemant Agrawal 	rss_conf->rss_hf = eth_conf->rx_adv_conf.rss_conf.rss_hf;
163463d5c3b0SHemant Agrawal 	return 0;
163563d5c3b0SHemant Agrawal }
163663d5c3b0SHemant Agrawal 
16373e5a335dSHemant Agrawal static struct eth_dev_ops dpaa2_ethdev_ops = {
16383e5a335dSHemant Agrawal 	.dev_configure	  = dpaa2_eth_dev_configure,
16393e5a335dSHemant Agrawal 	.dev_start	      = dpaa2_dev_start,
16403e5a335dSHemant Agrawal 	.dev_stop	      = dpaa2_dev_stop,
16413e5a335dSHemant Agrawal 	.dev_close	      = dpaa2_dev_close,
1642c0e5c69aSHemant Agrawal 	.promiscuous_enable   = dpaa2_dev_promiscuous_enable,
1643c0e5c69aSHemant Agrawal 	.promiscuous_disable  = dpaa2_dev_promiscuous_disable,
16445d5aeeedSHemant Agrawal 	.allmulticast_enable  = dpaa2_dev_allmulticast_enable,
16455d5aeeedSHemant Agrawal 	.allmulticast_disable = dpaa2_dev_allmulticast_disable,
1646a1f3a12cSHemant Agrawal 	.dev_set_link_up      = dpaa2_dev_set_link_up,
1647a1f3a12cSHemant Agrawal 	.dev_set_link_down    = dpaa2_dev_set_link_down,
1648c56c86ffSHemant Agrawal 	.link_update	   = dpaa2_dev_link_update,
1649b0aa5459SHemant Agrawal 	.stats_get	       = dpaa2_dev_stats_get,
16501d6329b2SHemant Agrawal 	.xstats_get	       = dpaa2_dev_xstats_get,
16511d6329b2SHemant Agrawal 	.xstats_get_by_id     = dpaa2_xstats_get_by_id,
16521d6329b2SHemant Agrawal 	.xstats_get_names_by_id = dpaa2_xstats_get_names_by_id,
16531d6329b2SHemant Agrawal 	.xstats_get_names      = dpaa2_xstats_get_names,
1654b0aa5459SHemant Agrawal 	.stats_reset	   = dpaa2_dev_stats_reset,
16551d6329b2SHemant Agrawal 	.xstats_reset	      = dpaa2_dev_stats_reset,
1656748eccb9SHemant Agrawal 	.fw_version_get	   = dpaa2_fw_version_get,
16573e5a335dSHemant Agrawal 	.dev_infos_get	   = dpaa2_dev_info_get,
1658a5fc38d4SHemant Agrawal 	.dev_supported_ptypes_get = dpaa2_supported_ptypes_get,
1659e31d4d21SHemant Agrawal 	.mtu_set           = dpaa2_dev_mtu_set,
16603ce294f2SHemant Agrawal 	.vlan_filter_set      = dpaa2_vlan_filter_set,
16613ce294f2SHemant Agrawal 	.vlan_offload_set     = dpaa2_vlan_offload_set,
16623e5a335dSHemant Agrawal 	.rx_queue_setup    = dpaa2_dev_rx_queue_setup,
16633e5a335dSHemant Agrawal 	.rx_queue_release  = dpaa2_dev_rx_queue_release,
16643e5a335dSHemant Agrawal 	.tx_queue_setup    = dpaa2_dev_tx_queue_setup,
16653e5a335dSHemant Agrawal 	.tx_queue_release  = dpaa2_dev_tx_queue_release,
1666977d0006SHemant Agrawal 	.flow_ctrl_get	      = dpaa2_flow_ctrl_get,
1667977d0006SHemant Agrawal 	.flow_ctrl_set	      = dpaa2_flow_ctrl_set,
1668b4d97b7dSHemant Agrawal 	.mac_addr_add         = dpaa2_dev_add_mac_addr,
1669b4d97b7dSHemant Agrawal 	.mac_addr_remove      = dpaa2_dev_remove_mac_addr,
1670b4d97b7dSHemant Agrawal 	.mac_addr_set         = dpaa2_dev_set_mac_addr,
167163d5c3b0SHemant Agrawal 	.rss_hash_update      = dpaa2_dev_rss_hash_update,
167263d5c3b0SHemant Agrawal 	.rss_hash_conf_get    = dpaa2_dev_rss_hash_conf_get,
16733e5a335dSHemant Agrawal };
16743e5a335dSHemant Agrawal 
1675c147eae0SHemant Agrawal static int
1676c147eae0SHemant Agrawal dpaa2_dev_init(struct rte_eth_dev *eth_dev)
1677c147eae0SHemant Agrawal {
16783e5a335dSHemant Agrawal 	struct rte_device *dev = eth_dev->device;
16793e5a335dSHemant Agrawal 	struct rte_dpaa2_device *dpaa2_dev;
16803e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni_dev;
16813e5a335dSHemant Agrawal 	struct dpni_attr attr;
16823e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
1683bee61d86SHemant Agrawal 	struct dpni_buffer_layout layout;
1684599017a2SHemant Agrawal 	int ret, hw_id;
16853e5a335dSHemant Agrawal 
1686d401ead1SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1687d401ead1SHemant Agrawal 
1688c147eae0SHemant Agrawal 	/* For secondary processes, the primary has done all the work */
1689c147eae0SHemant Agrawal 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
1690c147eae0SHemant Agrawal 		return 0;
1691c147eae0SHemant Agrawal 
16923e5a335dSHemant Agrawal 	dpaa2_dev = container_of(dev, struct rte_dpaa2_device, device);
16933e5a335dSHemant Agrawal 
16943e5a335dSHemant Agrawal 	hw_id = dpaa2_dev->object_id;
16953e5a335dSHemant Agrawal 
1696d4984046SHemant Agrawal 	dpni_dev = rte_malloc(NULL, sizeof(struct fsl_mc_io), 0);
16973e5a335dSHemant Agrawal 	if (!dpni_dev) {
16983e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "malloc failed for dpni device\n");
16993e5a335dSHemant Agrawal 		return -1;
17003e5a335dSHemant Agrawal 	}
17013e5a335dSHemant Agrawal 
17023e5a335dSHemant Agrawal 	dpni_dev->regs = rte_mcp_ptr_list[0];
17033e5a335dSHemant Agrawal 	ret = dpni_open(dpni_dev, CMD_PRI_LOW, hw_id, &priv->token);
17043e5a335dSHemant Agrawal 	if (ret) {
1705d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1706d4984046SHemant Agrawal 			     "Failure in opening dpni@%d with err code %d\n",
1707d4984046SHemant Agrawal 			     hw_id, ret);
1708d4984046SHemant Agrawal 		rte_free(dpni_dev);
17093e5a335dSHemant Agrawal 		return -1;
17103e5a335dSHemant Agrawal 	}
17113e5a335dSHemant Agrawal 
17123e5a335dSHemant Agrawal 	/* Clean the device first */
17133e5a335dSHemant Agrawal 	ret = dpni_reset(dpni_dev, CMD_PRI_LOW, priv->token);
17143e5a335dSHemant Agrawal 	if (ret) {
1715d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1716d4984046SHemant Agrawal 			     "Failure cleaning dpni@%d with err code %d\n",
1717d4984046SHemant Agrawal 			     hw_id, ret);
1718d4984046SHemant Agrawal 		goto init_err;
17193e5a335dSHemant Agrawal 	}
17203e5a335dSHemant Agrawal 
17213e5a335dSHemant Agrawal 	ret = dpni_get_attributes(dpni_dev, CMD_PRI_LOW, priv->token, &attr);
17223e5a335dSHemant Agrawal 	if (ret) {
1723d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1724d4984046SHemant Agrawal 			     "Failure in get dpni@%d attribute, err code %d\n",
1725d4984046SHemant Agrawal 			     hw_id, ret);
1726d4984046SHemant Agrawal 		goto init_err;
17273e5a335dSHemant Agrawal 	}
17283e5a335dSHemant Agrawal 
172916bbc98aSShreyansh Jain 	priv->num_rx_tc = attr.num_rx_tcs;
173089c2ea8fSHemant Agrawal 
173116bbc98aSShreyansh Jain 	/* Resetting the "num_rx_queues" to equal number of queues in first TC
1732599017a2SHemant Agrawal 	 * as only one TC is supported on Rx Side. Once Multiple TCs will be
1733599017a2SHemant Agrawal 	 * in use for Rx processing then this will be changed or removed.
173489c2ea8fSHemant Agrawal 	 */
1735599017a2SHemant Agrawal 	priv->nb_rx_queues = attr.num_queues;
173689c2ea8fSHemant Agrawal 
173716bbc98aSShreyansh Jain 	/* Using number of TX queues as number of TX TCs */
173816bbc98aSShreyansh Jain 	priv->nb_tx_queues = attr.num_tx_tcs;
1739ef18dafeSHemant Agrawal 
174016bbc98aSShreyansh Jain 	PMD_DRV_LOG(DEBUG, "RX-TC= %d, nb_rx_queues= %d, nb_tx_queues=%d",
17412bfea039SHemant Agrawal 		    priv->num_rx_tc, priv->nb_rx_queues, priv->nb_tx_queues);
17423e5a335dSHemant Agrawal 
17433e5a335dSHemant Agrawal 	priv->hw = dpni_dev;
17443e5a335dSHemant Agrawal 	priv->hw_id = hw_id;
174533fad432SHemant Agrawal 	priv->options = attr.options;
174633fad432SHemant Agrawal 	priv->max_mac_filters = attr.mac_filter_entries;
174733fad432SHemant Agrawal 	priv->max_vlan_filters = attr.vlan_filter_entries;
17483e5a335dSHemant Agrawal 	priv->flags = 0;
17493e5a335dSHemant Agrawal 
17503e5a335dSHemant Agrawal 	/* Allocate memory for hardware structure for queues */
17513e5a335dSHemant Agrawal 	ret = dpaa2_alloc_rx_tx_queues(eth_dev);
17523e5a335dSHemant Agrawal 	if (ret) {
17533e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "dpaa2_alloc_rx_tx_queuesFailed\n");
1754d4984046SHemant Agrawal 		goto init_err;
17553e5a335dSHemant Agrawal 	}
17563e5a335dSHemant Agrawal 
175733fad432SHemant Agrawal 	/* Allocate memory for storing MAC addresses */
175833fad432SHemant Agrawal 	eth_dev->data->mac_addrs = rte_zmalloc("dpni",
175933fad432SHemant Agrawal 		ETHER_ADDR_LEN * attr.mac_filter_entries, 0);
176033fad432SHemant Agrawal 	if (eth_dev->data->mac_addrs == NULL) {
1761d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1762d4984046SHemant Agrawal 		   "Failed to allocate %d bytes needed to store MAC addresses",
176333fad432SHemant Agrawal 			     ETHER_ADDR_LEN * attr.mac_filter_entries);
1764d4984046SHemant Agrawal 		ret = -ENOMEM;
1765d4984046SHemant Agrawal 		goto init_err;
176633fad432SHemant Agrawal 	}
176733fad432SHemant Agrawal 
176833fad432SHemant Agrawal 	ret = dpni_get_primary_mac_addr(dpni_dev, CMD_PRI_LOW,
176933fad432SHemant Agrawal 					priv->token,
177033fad432SHemant Agrawal 			(uint8_t *)(eth_dev->data->mac_addrs[0].addr_bytes));
177133fad432SHemant Agrawal 	if (ret) {
1772d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR, "DPNI get mac address failed:Err Code = %d\n",
1773d4984046SHemant Agrawal 			     ret);
1774d4984046SHemant Agrawal 		goto init_err;
177533fad432SHemant Agrawal 	}
177633fad432SHemant Agrawal 
1777bee61d86SHemant Agrawal 	/* ... tx buffer layout ... */
1778bee61d86SHemant Agrawal 	memset(&layout, 0, sizeof(struct dpni_buffer_layout));
1779bee61d86SHemant Agrawal 	layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
1780bee61d86SHemant Agrawal 	layout.pass_frame_status = 1;
1781bee61d86SHemant Agrawal 	ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
1782bee61d86SHemant Agrawal 				     DPNI_QUEUE_TX, &layout);
1783bee61d86SHemant Agrawal 	if (ret) {
1784d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR, "Error (%d) in setting tx buffer layout",
1785d4984046SHemant Agrawal 			     ret);
1786d4984046SHemant Agrawal 		goto init_err;
1787bee61d86SHemant Agrawal 	}
1788bee61d86SHemant Agrawal 
1789bee61d86SHemant Agrawal 	/* ... tx-conf and error buffer layout ... */
1790bee61d86SHemant Agrawal 	memset(&layout, 0, sizeof(struct dpni_buffer_layout));
1791bee61d86SHemant Agrawal 	layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
1792bee61d86SHemant Agrawal 	layout.pass_frame_status = 1;
1793bee61d86SHemant Agrawal 	ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
1794bee61d86SHemant Agrawal 				     DPNI_QUEUE_TX_CONFIRM, &layout);
1795bee61d86SHemant Agrawal 	if (ret) {
1796d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR, "Error (%d) in setting tx-conf buffer layout",
1797d4984046SHemant Agrawal 			     ret);
1798d4984046SHemant Agrawal 		goto init_err;
1799bee61d86SHemant Agrawal 	}
1800bee61d86SHemant Agrawal 
18013e5a335dSHemant Agrawal 	eth_dev->dev_ops = &dpaa2_ethdev_ops;
1802c5acbb5eSHemant Agrawal 	eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
1803c147eae0SHemant Agrawal 
18045c6942fdSHemant Agrawal 	eth_dev->rx_pkt_burst = dpaa2_dev_prefetch_rx;
1805cd9935ceSHemant Agrawal 	eth_dev->tx_pkt_burst = dpaa2_dev_tx;
18061261cd68SHemant Agrawal 	rte_fslmc_vfio_dmamap();
18071261cd68SHemant Agrawal 
18082bfea039SHemant Agrawal 	RTE_LOG(INFO, PMD, "%s: netdev created\n", eth_dev->data->name);
1809c147eae0SHemant Agrawal 	return 0;
1810d4984046SHemant Agrawal init_err:
1811d4984046SHemant Agrawal 	dpaa2_dev_uninit(eth_dev);
1812d4984046SHemant Agrawal 	return ret;
1813c147eae0SHemant Agrawal }
1814c147eae0SHemant Agrawal 
1815c147eae0SHemant Agrawal static int
18163e5a335dSHemant Agrawal dpaa2_dev_uninit(struct rte_eth_dev *eth_dev)
1817c147eae0SHemant Agrawal {
18183e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
18193e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
18203e5a335dSHemant Agrawal 	int i, ret;
18213e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
18223e5a335dSHemant Agrawal 
1823d401ead1SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1824d401ead1SHemant Agrawal 
1825c147eae0SHemant Agrawal 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
1826e729ec76SHemant Agrawal 		return 0;
1827c147eae0SHemant Agrawal 
18283e5a335dSHemant Agrawal 	if (!dpni) {
18293e5a335dSHemant Agrawal 		PMD_INIT_LOG(WARNING, "Already closed or not started");
18303e5a335dSHemant Agrawal 		return -1;
18313e5a335dSHemant Agrawal 	}
18323e5a335dSHemant Agrawal 
18333e5a335dSHemant Agrawal 	dpaa2_dev_close(eth_dev);
18343e5a335dSHemant Agrawal 
18353e5a335dSHemant Agrawal 	if (priv->rx_vq[0]) {
18363e5a335dSHemant Agrawal 		/* cleaning up queue storage */
18373e5a335dSHemant Agrawal 		for (i = 0; i < priv->nb_rx_queues; i++) {
18383e5a335dSHemant Agrawal 			dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
18393e5a335dSHemant Agrawal 			if (dpaa2_q->q_storage)
18403e5a335dSHemant Agrawal 				rte_free(dpaa2_q->q_storage);
18413e5a335dSHemant Agrawal 		}
18423e5a335dSHemant Agrawal 		/*free the all queue memory */
18433e5a335dSHemant Agrawal 		rte_free(priv->rx_vq[0]);
18443e5a335dSHemant Agrawal 		priv->rx_vq[0] = NULL;
18453e5a335dSHemant Agrawal 	}
18463e5a335dSHemant Agrawal 
1847d4984046SHemant Agrawal 	/* free memory for storing MAC addresses */
184833fad432SHemant Agrawal 	if (eth_dev->data->mac_addrs) {
184933fad432SHemant Agrawal 		rte_free(eth_dev->data->mac_addrs);
185033fad432SHemant Agrawal 		eth_dev->data->mac_addrs = NULL;
185133fad432SHemant Agrawal 	}
18523e5a335dSHemant Agrawal 
18533e5a335dSHemant Agrawal 	/* Close the device at underlying layer*/
18543e5a335dSHemant Agrawal 	ret = dpni_close(dpni, CMD_PRI_LOW, priv->token);
18553e5a335dSHemant Agrawal 	if (ret) {
1856d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1857d4984046SHemant Agrawal 			     "Failure closing dpni device with err code %d\n",
1858d4984046SHemant Agrawal 			     ret);
18593e5a335dSHemant Agrawal 	}
18603e5a335dSHemant Agrawal 
18613e5a335dSHemant Agrawal 	/* Free the allocated memory for ethernet private data and dpni*/
18623e5a335dSHemant Agrawal 	priv->hw = NULL;
1863d4984046SHemant Agrawal 	rte_free(dpni);
18643e5a335dSHemant Agrawal 
18653e5a335dSHemant Agrawal 	eth_dev->dev_ops = NULL;
1866cd9935ceSHemant Agrawal 	eth_dev->rx_pkt_burst = NULL;
1867cd9935ceSHemant Agrawal 	eth_dev->tx_pkt_burst = NULL;
18683e5a335dSHemant Agrawal 
18692bfea039SHemant Agrawal 	RTE_LOG(INFO, PMD, "%s: netdev created\n", eth_dev->data->name);
1870c147eae0SHemant Agrawal 	return 0;
1871c147eae0SHemant Agrawal }
1872c147eae0SHemant Agrawal 
1873c147eae0SHemant Agrawal static int
187455fd2703SHemant Agrawal rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv,
1875c147eae0SHemant Agrawal 		struct rte_dpaa2_device *dpaa2_dev)
1876c147eae0SHemant Agrawal {
1877c147eae0SHemant Agrawal 	struct rte_eth_dev *eth_dev;
1878c147eae0SHemant Agrawal 	int diag;
1879c147eae0SHemant Agrawal 
1880c147eae0SHemant Agrawal 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
1881e729ec76SHemant Agrawal 		eth_dev = rte_eth_dev_allocate(dpaa2_dev->device.name);
1882e729ec76SHemant Agrawal 		if (!eth_dev)
1883e729ec76SHemant Agrawal 			return -ENODEV;
1884c147eae0SHemant Agrawal 		eth_dev->data->dev_private = rte_zmalloc(
1885c147eae0SHemant Agrawal 						"ethdev private structure",
1886c147eae0SHemant Agrawal 						sizeof(struct dpaa2_dev_priv),
1887c147eae0SHemant Agrawal 						RTE_CACHE_LINE_SIZE);
1888c147eae0SHemant Agrawal 		if (eth_dev->data->dev_private == NULL) {
1889d401ead1SHemant Agrawal 			PMD_INIT_LOG(CRIT, "Cannot allocate memzone for"
1890c147eae0SHemant Agrawal 				     " private port data\n");
1891c147eae0SHemant Agrawal 			rte_eth_dev_release_port(eth_dev);
1892c147eae0SHemant Agrawal 			return -ENOMEM;
1893c147eae0SHemant Agrawal 		}
1894e729ec76SHemant Agrawal 	} else {
1895e729ec76SHemant Agrawal 		eth_dev = rte_eth_dev_attach_secondary(dpaa2_dev->device.name);
1896e729ec76SHemant Agrawal 		if (!eth_dev)
1897e729ec76SHemant Agrawal 			return -ENODEV;
1898c147eae0SHemant Agrawal 	}
1899e729ec76SHemant Agrawal 
1900c147eae0SHemant Agrawal 	eth_dev->device = &dpaa2_dev->device;
190155fd2703SHemant Agrawal 	eth_dev->device->driver = &dpaa2_drv->driver;
190255fd2703SHemant Agrawal 
1903c147eae0SHemant Agrawal 	dpaa2_dev->eth_dev = eth_dev;
1904c147eae0SHemant Agrawal 	eth_dev->data->rx_mbuf_alloc_failed = 0;
1905c147eae0SHemant Agrawal 
1906c147eae0SHemant Agrawal 	/* Invoke PMD device initialization function */
1907c147eae0SHemant Agrawal 	diag = dpaa2_dev_init(eth_dev);
1908c147eae0SHemant Agrawal 	if (diag == 0)
1909c147eae0SHemant Agrawal 		return 0;
1910c147eae0SHemant Agrawal 
1911c147eae0SHemant Agrawal 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
1912c147eae0SHemant Agrawal 		rte_free(eth_dev->data->dev_private);
1913c147eae0SHemant Agrawal 	rte_eth_dev_release_port(eth_dev);
1914c147eae0SHemant Agrawal 	return diag;
1915c147eae0SHemant Agrawal }
1916c147eae0SHemant Agrawal 
1917c147eae0SHemant Agrawal static int
1918c147eae0SHemant Agrawal rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
1919c147eae0SHemant Agrawal {
1920c147eae0SHemant Agrawal 	struct rte_eth_dev *eth_dev;
1921c147eae0SHemant Agrawal 
1922c147eae0SHemant Agrawal 	eth_dev = dpaa2_dev->eth_dev;
1923c147eae0SHemant Agrawal 	dpaa2_dev_uninit(eth_dev);
1924c147eae0SHemant Agrawal 
1925c147eae0SHemant Agrawal 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
1926c147eae0SHemant Agrawal 		rte_free(eth_dev->data->dev_private);
1927c147eae0SHemant Agrawal 	rte_eth_dev_release_port(eth_dev);
1928c147eae0SHemant Agrawal 
1929c147eae0SHemant Agrawal 	return 0;
1930c147eae0SHemant Agrawal }
1931c147eae0SHemant Agrawal 
1932c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd = {
1933bad555dfSShreyansh Jain 	.drv_type = DPAA2_ETH,
1934c147eae0SHemant Agrawal 	.probe = rte_dpaa2_probe,
1935c147eae0SHemant Agrawal 	.remove = rte_dpaa2_remove,
1936c147eae0SHemant Agrawal };
1937c147eae0SHemant Agrawal 
1938c147eae0SHemant Agrawal RTE_PMD_REGISTER_DPAA2(net_dpaa2, rte_dpaa2_pmd);
1939