xref: /dpdk/drivers/net/dpaa2/dpaa2_ethdev.c (revision c5acbb5ea20e452e4d123a7562d1c46a72b8938a)
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 
55c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd;
56d4984046SHemant Agrawal static int dpaa2_dev_uninit(struct rte_eth_dev *eth_dev);
57*c5acbb5eSHemant Agrawal static int dpaa2_dev_link_update(struct rte_eth_dev *dev,
58*c5acbb5eSHemant Agrawal 				 int wait_to_complete);
59a1f3a12cSHemant Agrawal static int dpaa2_dev_set_link_up(struct rte_eth_dev *dev);
60a1f3a12cSHemant Agrawal static int dpaa2_dev_set_link_down(struct rte_eth_dev *dev);
61e1640849SHemant Agrawal static int dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu);
62c147eae0SHemant Agrawal 
63c56c86ffSHemant Agrawal /**
64c56c86ffSHemant Agrawal  * Atomically reads the link status information from global
65c56c86ffSHemant Agrawal  * structure rte_eth_dev.
66c56c86ffSHemant Agrawal  *
67c56c86ffSHemant Agrawal  * @param dev
68c56c86ffSHemant Agrawal  *   - Pointer to the structure rte_eth_dev to read from.
69c56c86ffSHemant Agrawal  *   - Pointer to the buffer to be saved with the link status.
70c56c86ffSHemant Agrawal  *
71c56c86ffSHemant Agrawal  * @return
72c56c86ffSHemant Agrawal  *   - On success, zero.
73c56c86ffSHemant Agrawal  *   - On failure, negative value.
74c56c86ffSHemant Agrawal  */
75c56c86ffSHemant Agrawal static inline int
76c56c86ffSHemant Agrawal dpaa2_dev_atomic_read_link_status(struct rte_eth_dev *dev,
77c56c86ffSHemant Agrawal 				  struct rte_eth_link *link)
78c56c86ffSHemant Agrawal {
79c56c86ffSHemant Agrawal 	struct rte_eth_link *dst = link;
80c56c86ffSHemant Agrawal 	struct rte_eth_link *src = &dev->data->dev_link;
81c56c86ffSHemant Agrawal 
82c56c86ffSHemant Agrawal 	if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
83c56c86ffSHemant Agrawal 				*(uint64_t *)src) == 0)
84c56c86ffSHemant Agrawal 		return -1;
85c56c86ffSHemant Agrawal 
86c56c86ffSHemant Agrawal 	return 0;
87c56c86ffSHemant Agrawal }
88c56c86ffSHemant Agrawal 
89c56c86ffSHemant Agrawal /**
90c56c86ffSHemant Agrawal  * Atomically writes the link status information into global
91c56c86ffSHemant Agrawal  * structure rte_eth_dev.
92c56c86ffSHemant Agrawal  *
93c56c86ffSHemant Agrawal  * @param dev
94c56c86ffSHemant Agrawal  *   - Pointer to the structure rte_eth_dev to read from.
95c56c86ffSHemant Agrawal  *   - Pointer to the buffer to be saved with the link status.
96c56c86ffSHemant Agrawal  *
97c56c86ffSHemant Agrawal  * @return
98c56c86ffSHemant Agrawal  *   - On success, zero.
99c56c86ffSHemant Agrawal  *   - On failure, negative value.
100c56c86ffSHemant Agrawal  */
101c56c86ffSHemant Agrawal static inline int
102c56c86ffSHemant Agrawal dpaa2_dev_atomic_write_link_status(struct rte_eth_dev *dev,
103c56c86ffSHemant Agrawal 				   struct rte_eth_link *link)
104c56c86ffSHemant Agrawal {
105c56c86ffSHemant Agrawal 	struct rte_eth_link *dst = &dev->data->dev_link;
106c56c86ffSHemant Agrawal 	struct rte_eth_link *src = link;
107c56c86ffSHemant Agrawal 
108c56c86ffSHemant Agrawal 	if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
109c56c86ffSHemant Agrawal 				*(uint64_t *)src) == 0)
110c56c86ffSHemant Agrawal 		return -1;
111c56c86ffSHemant Agrawal 
112c56c86ffSHemant Agrawal 	return 0;
113c56c86ffSHemant Agrawal }
114c56c86ffSHemant Agrawal 
1153ce294f2SHemant Agrawal static int
1163ce294f2SHemant Agrawal dpaa2_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
1173ce294f2SHemant Agrawal {
1183ce294f2SHemant Agrawal 	int ret;
1193ce294f2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1203ce294f2SHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
1213ce294f2SHemant Agrawal 
1223ce294f2SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1233ce294f2SHemant Agrawal 
1243ce294f2SHemant Agrawal 	if (dpni == NULL) {
125645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1263ce294f2SHemant Agrawal 		return -1;
1273ce294f2SHemant Agrawal 	}
1283ce294f2SHemant Agrawal 
1293ce294f2SHemant Agrawal 	if (on)
1303ce294f2SHemant Agrawal 		ret = dpni_add_vlan_id(dpni, CMD_PRI_LOW,
1313ce294f2SHemant Agrawal 				       priv->token, vlan_id);
1323ce294f2SHemant Agrawal 	else
1333ce294f2SHemant Agrawal 		ret = dpni_remove_vlan_id(dpni, CMD_PRI_LOW,
1343ce294f2SHemant Agrawal 					  priv->token, vlan_id);
1353ce294f2SHemant Agrawal 
1363ce294f2SHemant Agrawal 	if (ret < 0)
1373ce294f2SHemant Agrawal 		PMD_DRV_LOG(ERR, "ret = %d Unable to add/rem vlan %d hwid =%d",
1383ce294f2SHemant Agrawal 			    ret, vlan_id, priv->hw_id);
1393ce294f2SHemant Agrawal 
1403ce294f2SHemant Agrawal 	return ret;
1413ce294f2SHemant Agrawal }
1423ce294f2SHemant Agrawal 
1433ce294f2SHemant Agrawal static void
1443ce294f2SHemant Agrawal dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)
1453ce294f2SHemant Agrawal {
1463ce294f2SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1473ce294f2SHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
1483ce294f2SHemant Agrawal 	int ret;
1493ce294f2SHemant Agrawal 
1503ce294f2SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1513ce294f2SHemant Agrawal 
1523ce294f2SHemant Agrawal 	if (mask & ETH_VLAN_FILTER_MASK) {
1533ce294f2SHemant Agrawal 		if (dev->data->dev_conf.rxmode.hw_vlan_filter)
1543ce294f2SHemant Agrawal 			ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
1553ce294f2SHemant Agrawal 						      priv->token, true);
1563ce294f2SHemant Agrawal 		else
1573ce294f2SHemant Agrawal 			ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
1583ce294f2SHemant Agrawal 						      priv->token, false);
1593ce294f2SHemant Agrawal 		if (ret < 0)
160645bd25aSHemant Agrawal 			RTE_LOG(ERR, PMD, "Unable to set vlan filter = %d\n",
1613ce294f2SHemant Agrawal 				ret);
1623ce294f2SHemant Agrawal 	}
1633ce294f2SHemant Agrawal }
1643ce294f2SHemant Agrawal 
165748eccb9SHemant Agrawal static int
166748eccb9SHemant Agrawal dpaa2_fw_version_get(struct rte_eth_dev *dev,
167748eccb9SHemant Agrawal 		     char *fw_version,
168748eccb9SHemant Agrawal 		     size_t fw_size)
169748eccb9SHemant Agrawal {
170748eccb9SHemant Agrawal 	int ret;
171748eccb9SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
172748eccb9SHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
173748eccb9SHemant Agrawal 	struct mc_soc_version mc_plat_info = {0};
174748eccb9SHemant Agrawal 	struct mc_version mc_ver_info = {0};
175748eccb9SHemant Agrawal 
176748eccb9SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
177748eccb9SHemant Agrawal 
178748eccb9SHemant Agrawal 	if (mc_get_soc_version(dpni, CMD_PRI_LOW, &mc_plat_info))
179748eccb9SHemant Agrawal 		RTE_LOG(WARNING, PMD, "\tmc_get_soc_version failed\n");
180748eccb9SHemant Agrawal 
181748eccb9SHemant Agrawal 	if (mc_get_version(dpni, CMD_PRI_LOW, &mc_ver_info))
182748eccb9SHemant Agrawal 		RTE_LOG(WARNING, PMD, "\tmc_get_version failed\n");
183748eccb9SHemant Agrawal 
184748eccb9SHemant Agrawal 	ret = snprintf(fw_version, fw_size,
185748eccb9SHemant Agrawal 		       "%x-%d.%d.%d",
186748eccb9SHemant Agrawal 		       mc_plat_info.svr,
187748eccb9SHemant Agrawal 		       mc_ver_info.major,
188748eccb9SHemant Agrawal 		       mc_ver_info.minor,
189748eccb9SHemant Agrawal 		       mc_ver_info.revision);
190748eccb9SHemant Agrawal 
191748eccb9SHemant Agrawal 	ret += 1; /* add the size of '\0' */
192748eccb9SHemant Agrawal 	if (fw_size < (uint32_t)ret)
193748eccb9SHemant Agrawal 		return ret;
194748eccb9SHemant Agrawal 	else
195748eccb9SHemant Agrawal 		return 0;
196748eccb9SHemant Agrawal }
197748eccb9SHemant Agrawal 
1983e5a335dSHemant Agrawal static void
1993e5a335dSHemant Agrawal dpaa2_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
2003e5a335dSHemant Agrawal {
2013e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
2023e5a335dSHemant Agrawal 
2033e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2043e5a335dSHemant Agrawal 
2053e5a335dSHemant Agrawal 	dev_info->if_index = priv->hw_id;
2063e5a335dSHemant Agrawal 
20733fad432SHemant Agrawal 	dev_info->max_mac_addrs = priv->max_mac_filters;
208bee61d86SHemant Agrawal 	dev_info->max_rx_pktlen = DPAA2_MAX_RX_PKT_LEN;
209bee61d86SHemant Agrawal 	dev_info->min_rx_bufsize = DPAA2_MIN_RX_BUF_SIZE;
2103e5a335dSHemant Agrawal 	dev_info->max_rx_queues = (uint16_t)priv->nb_rx_queues;
2113e5a335dSHemant Agrawal 	dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues;
212ef18dafeSHemant Agrawal 	dev_info->rx_offload_capa =
213ef18dafeSHemant Agrawal 		DEV_RX_OFFLOAD_IPV4_CKSUM |
214ef18dafeSHemant Agrawal 		DEV_RX_OFFLOAD_UDP_CKSUM |
215ef18dafeSHemant Agrawal 		DEV_RX_OFFLOAD_TCP_CKSUM |
216ef18dafeSHemant Agrawal 		DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
217ef18dafeSHemant Agrawal 	dev_info->tx_offload_capa =
218ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_IPV4_CKSUM |
219ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_UDP_CKSUM |
220ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_TCP_CKSUM |
221ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_SCTP_CKSUM |
222ef18dafeSHemant Agrawal 		DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
2233e5a335dSHemant Agrawal 	dev_info->speed_capa = ETH_LINK_SPEED_1G |
2243e5a335dSHemant Agrawal 			ETH_LINK_SPEED_2_5G |
2253e5a335dSHemant Agrawal 			ETH_LINK_SPEED_10G;
2263e5a335dSHemant Agrawal }
2273e5a335dSHemant Agrawal 
2283e5a335dSHemant Agrawal static int
2293e5a335dSHemant Agrawal dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev)
2303e5a335dSHemant Agrawal {
2313e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
2323e5a335dSHemant Agrawal 	uint16_t dist_idx;
2333e5a335dSHemant Agrawal 	uint32_t vq_id;
2343e5a335dSHemant Agrawal 	struct dpaa2_queue *mc_q, *mcq;
2353e5a335dSHemant Agrawal 	uint32_t tot_queues;
2363e5a335dSHemant Agrawal 	int i;
2373e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
2383e5a335dSHemant Agrawal 
2393e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
2403e5a335dSHemant Agrawal 
2413e5a335dSHemant Agrawal 	tot_queues = priv->nb_rx_queues + priv->nb_tx_queues;
2423e5a335dSHemant Agrawal 	mc_q = rte_malloc(NULL, sizeof(struct dpaa2_queue) * tot_queues,
2433e5a335dSHemant Agrawal 			  RTE_CACHE_LINE_SIZE);
2443e5a335dSHemant Agrawal 	if (!mc_q) {
2453e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "malloc failed for rx/tx queues\n");
2463e5a335dSHemant Agrawal 		return -1;
2473e5a335dSHemant Agrawal 	}
2483e5a335dSHemant Agrawal 
2493e5a335dSHemant Agrawal 	for (i = 0; i < priv->nb_rx_queues; i++) {
2503e5a335dSHemant Agrawal 		mc_q->dev = dev;
2513e5a335dSHemant Agrawal 		priv->rx_vq[i] = mc_q++;
2523e5a335dSHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
2533e5a335dSHemant Agrawal 		dpaa2_q->q_storage = rte_malloc("dq_storage",
2543e5a335dSHemant Agrawal 					sizeof(struct queue_storage_info_t),
2553e5a335dSHemant Agrawal 					RTE_CACHE_LINE_SIZE);
2563e5a335dSHemant Agrawal 		if (!dpaa2_q->q_storage)
2573e5a335dSHemant Agrawal 			goto fail;
2583e5a335dSHemant Agrawal 
2593e5a335dSHemant Agrawal 		memset(dpaa2_q->q_storage, 0,
2603e5a335dSHemant Agrawal 		       sizeof(struct queue_storage_info_t));
2613cf50ff5SHemant Agrawal 		if (dpaa2_alloc_dq_storage(dpaa2_q->q_storage))
2623cf50ff5SHemant Agrawal 			goto fail;
2633e5a335dSHemant Agrawal 	}
2643e5a335dSHemant Agrawal 
2653e5a335dSHemant Agrawal 	for (i = 0; i < priv->nb_tx_queues; i++) {
2663e5a335dSHemant Agrawal 		mc_q->dev = dev;
2677ae777d0SHemant Agrawal 		mc_q->flow_id = 0xffff;
2683e5a335dSHemant Agrawal 		priv->tx_vq[i] = mc_q++;
2697ae777d0SHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->tx_vq[i];
2707ae777d0SHemant Agrawal 		dpaa2_q->cscn = rte_malloc(NULL,
2717ae777d0SHemant Agrawal 					   sizeof(struct qbman_result), 16);
2727ae777d0SHemant Agrawal 		if (!dpaa2_q->cscn)
2737ae777d0SHemant Agrawal 			goto fail_tx;
2743e5a335dSHemant Agrawal 	}
2753e5a335dSHemant Agrawal 
2763e5a335dSHemant Agrawal 	vq_id = 0;
277599017a2SHemant Agrawal 	for (dist_idx = 0; dist_idx < priv->nb_rx_queues; dist_idx++) {
2783e5a335dSHemant Agrawal 		mcq = (struct dpaa2_queue *)priv->rx_vq[vq_id];
2793e5a335dSHemant Agrawal 		mcq->tc_index = DPAA2_DEF_TC;
2803e5a335dSHemant Agrawal 		mcq->flow_id = dist_idx;
2813e5a335dSHemant Agrawal 		vq_id++;
2823e5a335dSHemant Agrawal 	}
2833e5a335dSHemant Agrawal 
2843e5a335dSHemant Agrawal 	return 0;
2857ae777d0SHemant Agrawal fail_tx:
2867ae777d0SHemant Agrawal 	i -= 1;
2877ae777d0SHemant Agrawal 	while (i >= 0) {
2887ae777d0SHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->tx_vq[i];
2897ae777d0SHemant Agrawal 		rte_free(dpaa2_q->cscn);
2907ae777d0SHemant Agrawal 		priv->tx_vq[i--] = NULL;
2917ae777d0SHemant Agrawal 	}
2927ae777d0SHemant Agrawal 	i = priv->nb_rx_queues;
2933e5a335dSHemant Agrawal fail:
2943e5a335dSHemant Agrawal 	i -= 1;
2953e5a335dSHemant Agrawal 	mc_q = priv->rx_vq[0];
2963e5a335dSHemant Agrawal 	while (i >= 0) {
2973e5a335dSHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
2983cf50ff5SHemant Agrawal 		dpaa2_free_dq_storage(dpaa2_q->q_storage);
2993e5a335dSHemant Agrawal 		rte_free(dpaa2_q->q_storage);
3003e5a335dSHemant Agrawal 		priv->rx_vq[i--] = NULL;
3013e5a335dSHemant Agrawal 	}
3023e5a335dSHemant Agrawal 	rte_free(mc_q);
3033e5a335dSHemant Agrawal 	return -1;
3043e5a335dSHemant Agrawal }
3053e5a335dSHemant Agrawal 
3063e5a335dSHemant Agrawal static int
3073e5a335dSHemant Agrawal dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
3083e5a335dSHemant Agrawal {
3093e5a335dSHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
3103e5a335dSHemant Agrawal 	struct rte_eth_conf *eth_conf = &data->dev_conf;
31189c2ea8fSHemant Agrawal 	int ret;
3123e5a335dSHemant Agrawal 
3133e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
3143e5a335dSHemant Agrawal 
315e1640849SHemant Agrawal 	if (eth_conf->rxmode.jumbo_frame == 1) {
316e1640849SHemant Agrawal 		if (eth_conf->rxmode.max_rx_pkt_len <= DPAA2_MAX_RX_PKT_LEN) {
317e1640849SHemant Agrawal 			ret = dpaa2_dev_mtu_set(dev,
318e1640849SHemant Agrawal 					eth_conf->rxmode.max_rx_pkt_len);
319e1640849SHemant Agrawal 			if (ret) {
320e1640849SHemant Agrawal 				PMD_INIT_LOG(ERR,
321e1640849SHemant Agrawal 					     "unable to set mtu. check config\n");
322e1640849SHemant Agrawal 				return ret;
323e1640849SHemant Agrawal 			}
324e1640849SHemant Agrawal 		} else {
325e1640849SHemant Agrawal 			return -1;
326e1640849SHemant Agrawal 		}
327e1640849SHemant Agrawal 	}
328e1640849SHemant Agrawal 
3293e5a335dSHemant Agrawal 	/* Check for correct configuration */
3303e5a335dSHemant Agrawal 	if (eth_conf->rxmode.mq_mode != ETH_MQ_RX_RSS &&
3313e5a335dSHemant Agrawal 	    data->nb_rx_queues > 1) {
3323e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Distribution is not enabled, "
3333e5a335dSHemant Agrawal 			    "but Rx queues more than 1\n");
3343e5a335dSHemant Agrawal 		return -1;
3353e5a335dSHemant Agrawal 	}
3363e5a335dSHemant Agrawal 
33789c2ea8fSHemant Agrawal 	if (eth_conf->rxmode.mq_mode == ETH_MQ_RX_RSS) {
33889c2ea8fSHemant Agrawal 		/* Return in case number of Rx queues is 1 */
33989c2ea8fSHemant Agrawal 		if (data->nb_rx_queues == 1)
34089c2ea8fSHemant Agrawal 			return 0;
34189c2ea8fSHemant Agrawal 		ret = dpaa2_setup_flow_dist(dev,
34289c2ea8fSHemant Agrawal 				eth_conf->rx_adv_conf.rss_conf.rss_hf);
34389c2ea8fSHemant Agrawal 		if (ret) {
34489c2ea8fSHemant Agrawal 			PMD_INIT_LOG(ERR, "unable to set flow distribution."
34589c2ea8fSHemant Agrawal 				     "please check queue config\n");
34689c2ea8fSHemant Agrawal 			return ret;
34789c2ea8fSHemant Agrawal 		}
34889c2ea8fSHemant Agrawal 	}
349*c5acbb5eSHemant Agrawal 
350*c5acbb5eSHemant Agrawal 	/* update the current status */
351*c5acbb5eSHemant Agrawal 	dpaa2_dev_link_update(dev, 0);
352*c5acbb5eSHemant Agrawal 
3533e5a335dSHemant Agrawal 	return 0;
3543e5a335dSHemant Agrawal }
3553e5a335dSHemant Agrawal 
3563e5a335dSHemant Agrawal /* Function to setup RX flow information. It contains traffic class ID,
3573e5a335dSHemant Agrawal  * flow ID, destination configuration etc.
3583e5a335dSHemant Agrawal  */
3593e5a335dSHemant Agrawal static int
3603e5a335dSHemant Agrawal dpaa2_dev_rx_queue_setup(struct rte_eth_dev *dev,
3613e5a335dSHemant Agrawal 			 uint16_t rx_queue_id,
3623e5a335dSHemant Agrawal 			 uint16_t nb_rx_desc __rte_unused,
3633e5a335dSHemant Agrawal 			 unsigned int socket_id __rte_unused,
3643e5a335dSHemant Agrawal 			 const struct rte_eth_rxconf *rx_conf __rte_unused,
3653e5a335dSHemant Agrawal 			 struct rte_mempool *mb_pool)
3663e5a335dSHemant Agrawal {
3673e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
3683e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
36930db823eSHemant Agrawal 	struct mc_soc_version mc_plat_info = {0};
3703e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
3713e5a335dSHemant Agrawal 	struct dpni_queue cfg;
3723e5a335dSHemant Agrawal 	uint8_t options = 0;
3733e5a335dSHemant Agrawal 	uint8_t flow_id;
374bee61d86SHemant Agrawal 	uint32_t bpid;
3753e5a335dSHemant Agrawal 	int ret;
3763e5a335dSHemant Agrawal 
3773e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
3783e5a335dSHemant Agrawal 
3793e5a335dSHemant Agrawal 	PMD_INIT_LOG(DEBUG, "dev =%p, queue =%d, pool = %p, conf =%p",
3803e5a335dSHemant Agrawal 		     dev, rx_queue_id, mb_pool, rx_conf);
3813e5a335dSHemant Agrawal 
382bee61d86SHemant Agrawal 	if (!priv->bp_list || priv->bp_list->mp != mb_pool) {
383bee61d86SHemant Agrawal 		bpid = mempool_to_bpid(mb_pool);
384bee61d86SHemant Agrawal 		ret = dpaa2_attach_bp_list(priv,
385bee61d86SHemant Agrawal 					   rte_dpaa2_bpid_info[bpid].bp_list);
386bee61d86SHemant Agrawal 		if (ret)
387bee61d86SHemant Agrawal 			return ret;
388bee61d86SHemant Agrawal 	}
3893e5a335dSHemant Agrawal 	dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[rx_queue_id];
3903e5a335dSHemant Agrawal 	dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */
3913e5a335dSHemant Agrawal 
392599017a2SHemant Agrawal 	/*Get the flow id from given VQ id*/
393599017a2SHemant Agrawal 	flow_id = rx_queue_id % priv->nb_rx_queues;
3943e5a335dSHemant Agrawal 	memset(&cfg, 0, sizeof(struct dpni_queue));
3953e5a335dSHemant Agrawal 
3963e5a335dSHemant Agrawal 	options = options | DPNI_QUEUE_OPT_USER_CTX;
3973e5a335dSHemant Agrawal 	cfg.user_context = (uint64_t)(dpaa2_q);
3983e5a335dSHemant Agrawal 
39937529eceSHemant Agrawal 	/*if ls2088 or rev2 device, enable the stashing */
40030db823eSHemant Agrawal 
40130db823eSHemant Agrawal 	if (mc_get_soc_version(dpni, CMD_PRI_LOW, &mc_plat_info))
40230db823eSHemant Agrawal 		PMD_INIT_LOG(ERR, "\tmc_get_soc_version failed\n");
40330db823eSHemant Agrawal 
40430db823eSHemant Agrawal 	if ((mc_plat_info.svr & 0xffff0000) != SVR_LS2080A) {
40537529eceSHemant Agrawal 		options |= DPNI_QUEUE_OPT_FLC;
40637529eceSHemant Agrawal 		cfg.flc.stash_control = true;
40737529eceSHemant Agrawal 		cfg.flc.value &= 0xFFFFFFFFFFFFFFC0;
40837529eceSHemant Agrawal 		/* 00 00 00 - last 6 bit represent annotation, context stashing,
40937529eceSHemant Agrawal 		 * data stashing setting 01 01 00 (0x14) to enable
4109464dbe9SHemant Agrawal 		 * 1 line data, 1 line annotation
41137529eceSHemant Agrawal 		 */
41237529eceSHemant Agrawal 		cfg.flc.value |= 0x14;
41337529eceSHemant Agrawal 	}
4143e5a335dSHemant Agrawal 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_RX,
4153e5a335dSHemant Agrawal 			     dpaa2_q->tc_index, flow_id, options, &cfg);
4163e5a335dSHemant Agrawal 	if (ret) {
4173e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error in setting the rx flow: = %d\n", ret);
4183e5a335dSHemant Agrawal 		return -1;
4193e5a335dSHemant Agrawal 	}
4203e5a335dSHemant Agrawal 
42123d6a87eSHemant Agrawal 	if (!(priv->flags & DPAA2_RX_TAILDROP_OFF)) {
42223d6a87eSHemant Agrawal 		struct dpni_taildrop taildrop;
42323d6a87eSHemant Agrawal 
42423d6a87eSHemant Agrawal 		taildrop.enable = 1;
42523d6a87eSHemant Agrawal 		/*enabling per rx queue congestion control */
42623d6a87eSHemant Agrawal 		taildrop.threshold = CONG_THRESHOLD_RX_Q;
42723d6a87eSHemant Agrawal 		taildrop.units = DPNI_CONGESTION_UNIT_BYTES;
428d47f0292SHemant Agrawal 		taildrop.oal = CONG_RX_OAL;
42923d6a87eSHemant Agrawal 		PMD_INIT_LOG(DEBUG, "Enabling Early Drop on queue = %d",
43023d6a87eSHemant Agrawal 			     rx_queue_id);
43123d6a87eSHemant Agrawal 		ret = dpni_set_taildrop(dpni, CMD_PRI_LOW, priv->token,
43223d6a87eSHemant Agrawal 					DPNI_CP_QUEUE, DPNI_QUEUE_RX,
43323d6a87eSHemant Agrawal 					dpaa2_q->tc_index, flow_id, &taildrop);
43423d6a87eSHemant Agrawal 		if (ret) {
43523d6a87eSHemant Agrawal 			PMD_INIT_LOG(ERR, "Error in setting the rx flow"
43623d6a87eSHemant Agrawal 				     " err : = %d\n", ret);
43723d6a87eSHemant Agrawal 			return -1;
43823d6a87eSHemant Agrawal 		}
43923d6a87eSHemant Agrawal 	}
44023d6a87eSHemant Agrawal 
4413e5a335dSHemant Agrawal 	dev->data->rx_queues[rx_queue_id] = dpaa2_q;
4423e5a335dSHemant Agrawal 	return 0;
4433e5a335dSHemant Agrawal }
4443e5a335dSHemant Agrawal 
4453e5a335dSHemant Agrawal static int
4463e5a335dSHemant Agrawal dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev,
4473e5a335dSHemant Agrawal 			 uint16_t tx_queue_id,
4483e5a335dSHemant Agrawal 			 uint16_t nb_tx_desc __rte_unused,
4493e5a335dSHemant Agrawal 			 unsigned int socket_id __rte_unused,
4503e5a335dSHemant Agrawal 			 const struct rte_eth_txconf *tx_conf __rte_unused)
4513e5a335dSHemant Agrawal {
4523e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
4533e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q = (struct dpaa2_queue *)
4543e5a335dSHemant Agrawal 		priv->tx_vq[tx_queue_id];
4553e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = priv->hw;
4563e5a335dSHemant Agrawal 	struct dpni_queue tx_conf_cfg;
4573e5a335dSHemant Agrawal 	struct dpni_queue tx_flow_cfg;
4583e5a335dSHemant Agrawal 	uint8_t options = 0, flow_id;
4593e5a335dSHemant Agrawal 	uint32_t tc_id;
4603e5a335dSHemant Agrawal 	int ret;
4613e5a335dSHemant Agrawal 
4623e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
4633e5a335dSHemant Agrawal 
4643e5a335dSHemant Agrawal 	/* Return if queue already configured */
4657ae777d0SHemant Agrawal 	if (dpaa2_q->flow_id != 0xffff)
4663e5a335dSHemant Agrawal 		return 0;
4673e5a335dSHemant Agrawal 
4683e5a335dSHemant Agrawal 	memset(&tx_conf_cfg, 0, sizeof(struct dpni_queue));
4693e5a335dSHemant Agrawal 	memset(&tx_flow_cfg, 0, sizeof(struct dpni_queue));
4703e5a335dSHemant Agrawal 
471ef18dafeSHemant Agrawal 	tc_id = tx_queue_id;
472ef18dafeSHemant Agrawal 	flow_id = 0;
4733e5a335dSHemant Agrawal 
4743e5a335dSHemant Agrawal 	ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_TX,
4753e5a335dSHemant Agrawal 			     tc_id, flow_id, options, &tx_flow_cfg);
4763e5a335dSHemant Agrawal 	if (ret) {
4773e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error in setting the tx flow: "
4783e5a335dSHemant Agrawal 			     "tc_id=%d, flow =%d ErrorCode = %x\n",
4793e5a335dSHemant Agrawal 			     tc_id, flow_id, -ret);
4803e5a335dSHemant Agrawal 			return -1;
4813e5a335dSHemant Agrawal 	}
4823e5a335dSHemant Agrawal 
4833e5a335dSHemant Agrawal 	dpaa2_q->flow_id = flow_id;
4843e5a335dSHemant Agrawal 
4853e5a335dSHemant Agrawal 	if (tx_queue_id == 0) {
4863e5a335dSHemant Agrawal 		/*Set tx-conf and error configuration*/
4873e5a335dSHemant Agrawal 		ret = dpni_set_tx_confirmation_mode(dpni, CMD_PRI_LOW,
4883e5a335dSHemant Agrawal 						    priv->token,
4893e5a335dSHemant Agrawal 						    DPNI_CONF_DISABLE);
4903e5a335dSHemant Agrawal 		if (ret) {
4913e5a335dSHemant Agrawal 			PMD_INIT_LOG(ERR, "Error in set tx conf mode settings"
4923e5a335dSHemant Agrawal 				     " ErrorCode = %x", ret);
4933e5a335dSHemant Agrawal 			return -1;
4943e5a335dSHemant Agrawal 		}
4953e5a335dSHemant Agrawal 	}
4963e5a335dSHemant Agrawal 	dpaa2_q->tc_index = tc_id;
4973e5a335dSHemant Agrawal 
498a0840963SHemant Agrawal 	if (!(priv->flags & DPAA2_TX_CGR_OFF)) {
4997ae777d0SHemant Agrawal 		struct dpni_congestion_notification_cfg cong_notif_cfg;
5007ae777d0SHemant Agrawal 
50129dfa62fSHemant Agrawal 		cong_notif_cfg.units = DPNI_CONGESTION_UNIT_FRAMES;
5027ae777d0SHemant Agrawal 		cong_notif_cfg.threshold_entry = CONG_ENTER_TX_THRESHOLD;
5037ae777d0SHemant Agrawal 		/* Notify that the queue is not congested when the data in
5047ae777d0SHemant Agrawal 		 * the queue is below this thershold.
5057ae777d0SHemant Agrawal 		 */
5067ae777d0SHemant Agrawal 		cong_notif_cfg.threshold_exit = CONG_EXIT_TX_THRESHOLD;
5077ae777d0SHemant Agrawal 		cong_notif_cfg.message_ctx = 0;
5087ae777d0SHemant Agrawal 		cong_notif_cfg.message_iova = (uint64_t)dpaa2_q->cscn;
5097ae777d0SHemant Agrawal 		cong_notif_cfg.dest_cfg.dest_type = DPNI_DEST_NONE;
5107ae777d0SHemant Agrawal 		cong_notif_cfg.notification_mode =
5117ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_WRITE_MEM_ON_ENTER |
5127ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_WRITE_MEM_ON_EXIT |
5137ae777d0SHemant Agrawal 					 DPNI_CONG_OPT_COHERENT_WRITE;
5147ae777d0SHemant Agrawal 
5157ae777d0SHemant Agrawal 		ret = dpni_set_congestion_notification(dpni, CMD_PRI_LOW,
5167ae777d0SHemant Agrawal 						       priv->token,
5177ae777d0SHemant Agrawal 						       DPNI_QUEUE_TX,
5187ae777d0SHemant Agrawal 						       tc_id,
5197ae777d0SHemant Agrawal 						       &cong_notif_cfg);
5207ae777d0SHemant Agrawal 		if (ret) {
5217ae777d0SHemant Agrawal 			PMD_INIT_LOG(ERR,
5227ae777d0SHemant Agrawal 			   "Error in setting tx congestion notification: = %d",
5237ae777d0SHemant Agrawal 			   -ret);
5247ae777d0SHemant Agrawal 			return -ret;
5257ae777d0SHemant Agrawal 		}
5267ae777d0SHemant Agrawal 	}
5273e5a335dSHemant Agrawal 	dev->data->tx_queues[tx_queue_id] = dpaa2_q;
5283e5a335dSHemant Agrawal 	return 0;
5293e5a335dSHemant Agrawal }
5303e5a335dSHemant Agrawal 
5313e5a335dSHemant Agrawal static void
5323e5a335dSHemant Agrawal dpaa2_dev_rx_queue_release(void *q __rte_unused)
5333e5a335dSHemant Agrawal {
5343e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
5353e5a335dSHemant Agrawal }
5363e5a335dSHemant Agrawal 
5373e5a335dSHemant Agrawal static void
5383e5a335dSHemant Agrawal dpaa2_dev_tx_queue_release(void *q __rte_unused)
5393e5a335dSHemant Agrawal {
5403e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
5413e5a335dSHemant Agrawal }
5423e5a335dSHemant Agrawal 
543a5fc38d4SHemant Agrawal static const uint32_t *
544a5fc38d4SHemant Agrawal dpaa2_supported_ptypes_get(struct rte_eth_dev *dev)
545a5fc38d4SHemant Agrawal {
546a5fc38d4SHemant Agrawal 	static const uint32_t ptypes[] = {
547a5fc38d4SHemant Agrawal 		/*todo -= add more types */
548a5fc38d4SHemant Agrawal 		RTE_PTYPE_L2_ETHER,
549a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV4,
550a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV4_EXT,
551a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV6,
552a5fc38d4SHemant Agrawal 		RTE_PTYPE_L3_IPV6_EXT,
553a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_TCP,
554a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_UDP,
555a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_SCTP,
556a5fc38d4SHemant Agrawal 		RTE_PTYPE_L4_ICMP,
557a5fc38d4SHemant Agrawal 		RTE_PTYPE_UNKNOWN
558a5fc38d4SHemant Agrawal 	};
559a5fc38d4SHemant Agrawal 
5605c6942fdSHemant Agrawal 	if (dev->rx_pkt_burst == dpaa2_dev_prefetch_rx)
561a5fc38d4SHemant Agrawal 		return ptypes;
562a5fc38d4SHemant Agrawal 	return NULL;
563a5fc38d4SHemant Agrawal }
564a5fc38d4SHemant Agrawal 
565*c5acbb5eSHemant Agrawal /**
566*c5acbb5eSHemant Agrawal  * Dpaa2 link Interrupt handler
567*c5acbb5eSHemant Agrawal  *
568*c5acbb5eSHemant Agrawal  * @param param
569*c5acbb5eSHemant Agrawal  *  The address of parameter (struct rte_eth_dev *) regsitered before.
570*c5acbb5eSHemant Agrawal  *
571*c5acbb5eSHemant Agrawal  * @return
572*c5acbb5eSHemant Agrawal  *  void
573*c5acbb5eSHemant Agrawal  */
574*c5acbb5eSHemant Agrawal static void
575*c5acbb5eSHemant Agrawal dpaa2_interrupt_handler(void *param)
576*c5acbb5eSHemant Agrawal {
577*c5acbb5eSHemant Agrawal 	struct rte_eth_dev *dev = param;
578*c5acbb5eSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
579*c5acbb5eSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
580*c5acbb5eSHemant Agrawal 	int ret;
581*c5acbb5eSHemant Agrawal 	int irq_index = DPNI_IRQ_INDEX;
582*c5acbb5eSHemant Agrawal 	unsigned int status = 0, clear = 0;
583*c5acbb5eSHemant Agrawal 
584*c5acbb5eSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
585*c5acbb5eSHemant Agrawal 
586*c5acbb5eSHemant Agrawal 	if (dpni == NULL) {
587*c5acbb5eSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL");
588*c5acbb5eSHemant Agrawal 		return;
589*c5acbb5eSHemant Agrawal 	}
590*c5acbb5eSHemant Agrawal 
591*c5acbb5eSHemant Agrawal 	ret = dpni_get_irq_status(dpni, CMD_PRI_LOW, priv->token,
592*c5acbb5eSHemant Agrawal 				  irq_index, &status);
593*c5acbb5eSHemant Agrawal 	if (unlikely(ret)) {
594*c5acbb5eSHemant Agrawal 		RTE_LOG(ERR, PMD, "Can't get irq status (err %d)", ret);
595*c5acbb5eSHemant Agrawal 		clear = 0xffffffff;
596*c5acbb5eSHemant Agrawal 		goto out;
597*c5acbb5eSHemant Agrawal 	}
598*c5acbb5eSHemant Agrawal 
599*c5acbb5eSHemant Agrawal 	if (status & DPNI_IRQ_EVENT_LINK_CHANGED) {
600*c5acbb5eSHemant Agrawal 		clear = DPNI_IRQ_EVENT_LINK_CHANGED;
601*c5acbb5eSHemant Agrawal 		dpaa2_dev_link_update(dev, 0);
602*c5acbb5eSHemant Agrawal 		/* calling all the apps registered for link status event */
603*c5acbb5eSHemant Agrawal 		_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC,
604*c5acbb5eSHemant Agrawal 					      NULL, NULL);
605*c5acbb5eSHemant Agrawal 	}
606*c5acbb5eSHemant Agrawal out:
607*c5acbb5eSHemant Agrawal 	ret = dpni_clear_irq_status(dpni, CMD_PRI_LOW, priv->token,
608*c5acbb5eSHemant Agrawal 				    irq_index, clear);
609*c5acbb5eSHemant Agrawal 	if (unlikely(ret))
610*c5acbb5eSHemant Agrawal 		RTE_LOG(ERR, PMD, "Can't clear irq status (err %d)", ret);
611*c5acbb5eSHemant Agrawal }
612*c5acbb5eSHemant Agrawal 
613*c5acbb5eSHemant Agrawal static int
614*c5acbb5eSHemant Agrawal dpaa2_eth_setup_irqs(struct rte_eth_dev *dev, int enable)
615*c5acbb5eSHemant Agrawal {
616*c5acbb5eSHemant Agrawal 	int err = 0;
617*c5acbb5eSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
618*c5acbb5eSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
619*c5acbb5eSHemant Agrawal 	int irq_index = DPNI_IRQ_INDEX;
620*c5acbb5eSHemant Agrawal 	unsigned int mask = DPNI_IRQ_EVENT_LINK_CHANGED;
621*c5acbb5eSHemant Agrawal 
622*c5acbb5eSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
623*c5acbb5eSHemant Agrawal 
624*c5acbb5eSHemant Agrawal 	err = dpni_set_irq_mask(dpni, CMD_PRI_LOW, priv->token,
625*c5acbb5eSHemant Agrawal 				irq_index, mask);
626*c5acbb5eSHemant Agrawal 	if (err < 0) {
627*c5acbb5eSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error: dpni_set_irq_mask():%d (%s)", err,
628*c5acbb5eSHemant Agrawal 			     strerror(-err));
629*c5acbb5eSHemant Agrawal 		return err;
630*c5acbb5eSHemant Agrawal 	}
631*c5acbb5eSHemant Agrawal 
632*c5acbb5eSHemant Agrawal 	err = dpni_set_irq_enable(dpni, CMD_PRI_LOW, priv->token,
633*c5acbb5eSHemant Agrawal 				  irq_index, enable);
634*c5acbb5eSHemant Agrawal 	if (err < 0)
635*c5acbb5eSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error: dpni_set_irq_enable():%d (%s)", err,
636*c5acbb5eSHemant Agrawal 			     strerror(-err));
637*c5acbb5eSHemant Agrawal 
638*c5acbb5eSHemant Agrawal 	return err;
639*c5acbb5eSHemant Agrawal }
640*c5acbb5eSHemant Agrawal 
6413e5a335dSHemant Agrawal static int
6423e5a335dSHemant Agrawal dpaa2_dev_start(struct rte_eth_dev *dev)
6433e5a335dSHemant Agrawal {
644*c5acbb5eSHemant Agrawal 	struct rte_device *rdev = dev->device;
645*c5acbb5eSHemant Agrawal 	struct rte_dpaa2_device *dpaa2_dev;
6463e5a335dSHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
6473e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = data->dev_private;
6483e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
6493e5a335dSHemant Agrawal 	struct dpni_queue cfg;
650ef18dafeSHemant Agrawal 	struct dpni_error_cfg	err_cfg;
6513e5a335dSHemant Agrawal 	uint16_t qdid;
6523e5a335dSHemant Agrawal 	struct dpni_queue_id qid;
6533e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
6543e5a335dSHemant Agrawal 	int ret, i;
655*c5acbb5eSHemant Agrawal 	struct rte_intr_handle *intr_handle;
656*c5acbb5eSHemant Agrawal 
657*c5acbb5eSHemant Agrawal 	dpaa2_dev = container_of(rdev, struct rte_dpaa2_device, device);
658*c5acbb5eSHemant Agrawal 	intr_handle = &dpaa2_dev->intr_handle;
6593e5a335dSHemant Agrawal 
6603e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
6613e5a335dSHemant Agrawal 
6623e5a335dSHemant Agrawal 	ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
6633e5a335dSHemant Agrawal 	if (ret) {
6643e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Failure %d in enabling dpni %d device\n",
6653e5a335dSHemant Agrawal 			     ret, priv->hw_id);
6663e5a335dSHemant Agrawal 		return ret;
6673e5a335dSHemant Agrawal 	}
6683e5a335dSHemant Agrawal 
669a1f3a12cSHemant Agrawal 	/* Power up the phy. Needed to make the link go Up */
670a1f3a12cSHemant Agrawal 	dpaa2_dev_set_link_up(dev);
671a1f3a12cSHemant Agrawal 
6723e5a335dSHemant Agrawal 	ret = dpni_get_qdid(dpni, CMD_PRI_LOW, priv->token,
6733e5a335dSHemant Agrawal 			    DPNI_QUEUE_TX, &qdid);
6743e5a335dSHemant Agrawal 	if (ret) {
6753e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to get qdid:ErrorCode = %d\n", ret);
6763e5a335dSHemant Agrawal 		return ret;
6773e5a335dSHemant Agrawal 	}
6783e5a335dSHemant Agrawal 	priv->qdid = qdid;
6793e5a335dSHemant Agrawal 
6803e5a335dSHemant Agrawal 	for (i = 0; i < data->nb_rx_queues; i++) {
6813e5a335dSHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)data->rx_queues[i];
6823e5a335dSHemant Agrawal 		ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,
6833e5a335dSHemant Agrawal 				     DPNI_QUEUE_RX, dpaa2_q->tc_index,
6843e5a335dSHemant Agrawal 				       dpaa2_q->flow_id, &cfg, &qid);
6853e5a335dSHemant Agrawal 		if (ret) {
6863e5a335dSHemant Agrawal 			PMD_INIT_LOG(ERR, "Error to get flow "
6873e5a335dSHemant Agrawal 				     "information Error code = %d\n", ret);
6883e5a335dSHemant Agrawal 			return ret;
6893e5a335dSHemant Agrawal 		}
6903e5a335dSHemant Agrawal 		dpaa2_q->fqid = qid.fqid;
6913e5a335dSHemant Agrawal 	}
6923e5a335dSHemant Agrawal 
693ef18dafeSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
694ef18dafeSHemant Agrawal 			       DPNI_OFF_RX_L3_CSUM, true);
695ef18dafeSHemant Agrawal 	if (ret) {
696ef18dafeSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to set RX l3 csum:Error = %d\n", ret);
697ef18dafeSHemant Agrawal 		return ret;
698ef18dafeSHemant Agrawal 	}
699ef18dafeSHemant Agrawal 
700ef18dafeSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
701ef18dafeSHemant Agrawal 			       DPNI_OFF_RX_L4_CSUM, true);
702ef18dafeSHemant Agrawal 	if (ret) {
703ef18dafeSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to get RX l4 csum:Error = %d\n", ret);
704ef18dafeSHemant Agrawal 		return ret;
705ef18dafeSHemant Agrawal 	}
706ef18dafeSHemant Agrawal 
707ef18dafeSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
708ef18dafeSHemant Agrawal 			       DPNI_OFF_TX_L3_CSUM, true);
709ef18dafeSHemant Agrawal 	if (ret) {
710ef18dafeSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to set TX l3 csum:Error = %d\n", ret);
711ef18dafeSHemant Agrawal 		return ret;
712ef18dafeSHemant Agrawal 	}
713ef18dafeSHemant Agrawal 
714ef18dafeSHemant Agrawal 	ret = dpni_set_offload(dpni, CMD_PRI_LOW, priv->token,
715ef18dafeSHemant Agrawal 			       DPNI_OFF_TX_L4_CSUM, true);
716ef18dafeSHemant Agrawal 	if (ret) {
717ef18dafeSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to get TX l4 csum:Error = %d\n", ret);
718ef18dafeSHemant Agrawal 		return ret;
719ef18dafeSHemant Agrawal 	}
720ef18dafeSHemant Agrawal 
721ef18dafeSHemant Agrawal 	/*checksum errors, send them to normal path and set it in annotation */
722ef18dafeSHemant Agrawal 	err_cfg.errors = DPNI_ERROR_L3CE | DPNI_ERROR_L4CE;
723ef18dafeSHemant Agrawal 
724ef18dafeSHemant Agrawal 	err_cfg.error_action = DPNI_ERROR_ACTION_CONTINUE;
725ef18dafeSHemant Agrawal 	err_cfg.set_frame_annotation = true;
726ef18dafeSHemant Agrawal 
727ef18dafeSHemant Agrawal 	ret = dpni_set_errors_behavior(dpni, CMD_PRI_LOW,
728ef18dafeSHemant Agrawal 				       priv->token, &err_cfg);
729ef18dafeSHemant Agrawal 	if (ret) {
730ef18dafeSHemant Agrawal 		PMD_INIT_LOG(ERR, "Error to dpni_set_errors_behavior:"
731ef18dafeSHemant Agrawal 			     "code = %d\n", ret);
732ef18dafeSHemant Agrawal 		return ret;
733ef18dafeSHemant Agrawal 	}
7343ce294f2SHemant Agrawal 	/* VLAN Offload Settings */
7353ce294f2SHemant Agrawal 	if (priv->max_vlan_filters)
7363ce294f2SHemant Agrawal 		dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);
737ef18dafeSHemant Agrawal 
738*c5acbb5eSHemant Agrawal 	/* if the interrupts were configured on this devices*/
739*c5acbb5eSHemant Agrawal 	if (intr_handle && (intr_handle->fd) &&
740*c5acbb5eSHemant Agrawal 	    (dev->data->dev_conf.intr_conf.lsc != 0)) {
741*c5acbb5eSHemant Agrawal 		/* Registering LSC interrupt handler */
742*c5acbb5eSHemant Agrawal 		rte_intr_callback_register(intr_handle,
743*c5acbb5eSHemant Agrawal 					   dpaa2_interrupt_handler,
744*c5acbb5eSHemant Agrawal 					   (void *)dev);
745*c5acbb5eSHemant Agrawal 
746*c5acbb5eSHemant Agrawal 		/* enable vfio intr/eventfd mapping
747*c5acbb5eSHemant Agrawal 		 * Interrupt index 0 is required, so we can not use
748*c5acbb5eSHemant Agrawal 		 * rte_intr_enable.
749*c5acbb5eSHemant Agrawal 		 */
750*c5acbb5eSHemant Agrawal 		rte_dpaa2_intr_enable(intr_handle, DPNI_IRQ_INDEX);
751*c5acbb5eSHemant Agrawal 
752*c5acbb5eSHemant Agrawal 		/* enable dpni_irqs */
753*c5acbb5eSHemant Agrawal 		dpaa2_eth_setup_irqs(dev, 1);
754*c5acbb5eSHemant Agrawal 	}
755*c5acbb5eSHemant Agrawal 
7563e5a335dSHemant Agrawal 	return 0;
7573e5a335dSHemant Agrawal }
7583e5a335dSHemant Agrawal 
7593e5a335dSHemant Agrawal /**
7603e5a335dSHemant Agrawal  *  This routine disables all traffic on the adapter by issuing a
7613e5a335dSHemant Agrawal  *  global reset on the MAC.
7623e5a335dSHemant Agrawal  */
7633e5a335dSHemant Agrawal static void
7643e5a335dSHemant Agrawal dpaa2_dev_stop(struct rte_eth_dev *dev)
7653e5a335dSHemant Agrawal {
7663e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
7673e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
7683e5a335dSHemant Agrawal 	int ret;
769c56c86ffSHemant Agrawal 	struct rte_eth_link link;
770*c5acbb5eSHemant Agrawal 	struct rte_intr_handle *intr_handle = dev->intr_handle;
7713e5a335dSHemant Agrawal 
7723e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
7733e5a335dSHemant Agrawal 
774*c5acbb5eSHemant Agrawal 	/* reset interrupt callback  */
775*c5acbb5eSHemant Agrawal 	if (intr_handle && (intr_handle->fd) &&
776*c5acbb5eSHemant Agrawal 	    (dev->data->dev_conf.intr_conf.lsc != 0)) {
777*c5acbb5eSHemant Agrawal 		/*disable dpni irqs */
778*c5acbb5eSHemant Agrawal 		dpaa2_eth_setup_irqs(dev, 0);
779*c5acbb5eSHemant Agrawal 
780*c5acbb5eSHemant Agrawal 		/* disable vfio intr before callback unregister */
781*c5acbb5eSHemant Agrawal 		rte_dpaa2_intr_disable(intr_handle, DPNI_IRQ_INDEX);
782*c5acbb5eSHemant Agrawal 
783*c5acbb5eSHemant Agrawal 		/* Unregistering LSC interrupt handler */
784*c5acbb5eSHemant Agrawal 		rte_intr_callback_unregister(intr_handle,
785*c5acbb5eSHemant Agrawal 					     dpaa2_interrupt_handler,
786*c5acbb5eSHemant Agrawal 					     (void *)dev);
787*c5acbb5eSHemant Agrawal 	}
788*c5acbb5eSHemant Agrawal 
789a1f3a12cSHemant Agrawal 	dpaa2_dev_set_link_down(dev);
790a1f3a12cSHemant Agrawal 
7913e5a335dSHemant Agrawal 	ret = dpni_disable(dpni, CMD_PRI_LOW, priv->token);
7923e5a335dSHemant Agrawal 	if (ret) {
7933e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Failure (ret %d) in disabling dpni %d dev\n",
7943e5a335dSHemant Agrawal 			     ret, priv->hw_id);
7953e5a335dSHemant Agrawal 		return;
7963e5a335dSHemant Agrawal 	}
797c56c86ffSHemant Agrawal 
798c56c86ffSHemant Agrawal 	/* clear the recorded link status */
799c56c86ffSHemant Agrawal 	memset(&link, 0, sizeof(link));
800c56c86ffSHemant Agrawal 	dpaa2_dev_atomic_write_link_status(dev, &link);
8013e5a335dSHemant Agrawal }
8023e5a335dSHemant Agrawal 
8033e5a335dSHemant Agrawal static void
8043e5a335dSHemant Agrawal dpaa2_dev_close(struct rte_eth_dev *dev)
8053e5a335dSHemant Agrawal {
8067ae777d0SHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
8073e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
8083e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
8097ae777d0SHemant Agrawal 	int i, ret;
810a1f3a12cSHemant Agrawal 	struct rte_eth_link link;
8117ae777d0SHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
8123e5a335dSHemant Agrawal 
8133e5a335dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
8143e5a335dSHemant Agrawal 
8157ae777d0SHemant Agrawal 	for (i = 0; i < data->nb_tx_queues; i++) {
8167ae777d0SHemant Agrawal 		dpaa2_q = (struct dpaa2_queue *)data->tx_queues[i];
8177ae777d0SHemant Agrawal 		if (!dpaa2_q->cscn) {
8187ae777d0SHemant Agrawal 			rte_free(dpaa2_q->cscn);
8197ae777d0SHemant Agrawal 			dpaa2_q->cscn = NULL;
8207ae777d0SHemant Agrawal 		}
8217ae777d0SHemant Agrawal 	}
8227ae777d0SHemant Agrawal 
8233e5a335dSHemant Agrawal 	/* Clean the device first */
8243e5a335dSHemant Agrawal 	ret = dpni_reset(dpni, CMD_PRI_LOW, priv->token);
8253e5a335dSHemant Agrawal 	if (ret) {
8263e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "Failure cleaning dpni device with"
8273e5a335dSHemant Agrawal 			     " error code %d\n", ret);
8283e5a335dSHemant Agrawal 		return;
8293e5a335dSHemant Agrawal 	}
830a1f3a12cSHemant Agrawal 
831a1f3a12cSHemant Agrawal 	memset(&link, 0, sizeof(link));
832a1f3a12cSHemant Agrawal 	dpaa2_dev_atomic_write_link_status(dev, &link);
8333e5a335dSHemant Agrawal }
8343e5a335dSHemant Agrawal 
835c0e5c69aSHemant Agrawal static void
836c0e5c69aSHemant Agrawal dpaa2_dev_promiscuous_enable(
837c0e5c69aSHemant Agrawal 		struct rte_eth_dev *dev)
838c0e5c69aSHemant Agrawal {
839c0e5c69aSHemant Agrawal 	int ret;
840c0e5c69aSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
841c0e5c69aSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
842c0e5c69aSHemant Agrawal 
843c0e5c69aSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
844c0e5c69aSHemant Agrawal 
845c0e5c69aSHemant Agrawal 	if (dpni == NULL) {
846645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
847c0e5c69aSHemant Agrawal 		return;
848c0e5c69aSHemant Agrawal 	}
849c0e5c69aSHemant Agrawal 
850c0e5c69aSHemant Agrawal 	ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
851c0e5c69aSHemant Agrawal 	if (ret < 0)
852645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to enable U promisc mode %d\n", ret);
8535d5aeeedSHemant Agrawal 
8545d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
8555d5aeeedSHemant Agrawal 	if (ret < 0)
856645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to enable M promisc mode %d\n", ret);
857c0e5c69aSHemant Agrawal }
858c0e5c69aSHemant Agrawal 
859c0e5c69aSHemant Agrawal static void
860c0e5c69aSHemant Agrawal dpaa2_dev_promiscuous_disable(
861c0e5c69aSHemant Agrawal 		struct rte_eth_dev *dev)
862c0e5c69aSHemant Agrawal {
863c0e5c69aSHemant Agrawal 	int ret;
864c0e5c69aSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
865c0e5c69aSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
866c0e5c69aSHemant Agrawal 
867c0e5c69aSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
868c0e5c69aSHemant Agrawal 
869c0e5c69aSHemant Agrawal 	if (dpni == NULL) {
870645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
871c0e5c69aSHemant Agrawal 		return;
872c0e5c69aSHemant Agrawal 	}
873c0e5c69aSHemant Agrawal 
874c0e5c69aSHemant Agrawal 	ret = dpni_set_unicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
875c0e5c69aSHemant Agrawal 	if (ret < 0)
876645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to disable U promisc mode %d\n", ret);
8775d5aeeedSHemant Agrawal 
8785d5aeeedSHemant Agrawal 	if (dev->data->all_multicast == 0) {
8795d5aeeedSHemant Agrawal 		ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW,
8805d5aeeedSHemant Agrawal 						 priv->token, false);
8815d5aeeedSHemant Agrawal 		if (ret < 0)
882645bd25aSHemant Agrawal 			RTE_LOG(ERR, PMD,
883645bd25aSHemant Agrawal 				"Unable to disable M promisc mode %d\n",
8845d5aeeedSHemant Agrawal 				ret);
8855d5aeeedSHemant Agrawal 	}
8865d5aeeedSHemant Agrawal }
8875d5aeeedSHemant Agrawal 
8885d5aeeedSHemant Agrawal static void
8895d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_enable(
8905d5aeeedSHemant Agrawal 		struct rte_eth_dev *dev)
8915d5aeeedSHemant Agrawal {
8925d5aeeedSHemant Agrawal 	int ret;
8935d5aeeedSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
8945d5aeeedSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
8955d5aeeedSHemant Agrawal 
8965d5aeeedSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
8975d5aeeedSHemant Agrawal 
8985d5aeeedSHemant Agrawal 	if (dpni == NULL) {
899645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
9005d5aeeedSHemant Agrawal 		return;
9015d5aeeedSHemant Agrawal 	}
9025d5aeeedSHemant Agrawal 
9035d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, true);
9045d5aeeedSHemant Agrawal 	if (ret < 0)
905645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to enable multicast mode %d\n", ret);
9065d5aeeedSHemant Agrawal }
9075d5aeeedSHemant Agrawal 
9085d5aeeedSHemant Agrawal static void
9095d5aeeedSHemant Agrawal dpaa2_dev_allmulticast_disable(struct rte_eth_dev *dev)
9105d5aeeedSHemant Agrawal {
9115d5aeeedSHemant Agrawal 	int ret;
9125d5aeeedSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
9135d5aeeedSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
9145d5aeeedSHemant Agrawal 
9155d5aeeedSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
9165d5aeeedSHemant Agrawal 
9175d5aeeedSHemant Agrawal 	if (dpni == NULL) {
918645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
9195d5aeeedSHemant Agrawal 		return;
9205d5aeeedSHemant Agrawal 	}
9215d5aeeedSHemant Agrawal 
9225d5aeeedSHemant Agrawal 	/* must remain on for all promiscuous */
9235d5aeeedSHemant Agrawal 	if (dev->data->promiscuous == 1)
9245d5aeeedSHemant Agrawal 		return;
9255d5aeeedSHemant Agrawal 
9265d5aeeedSHemant Agrawal 	ret = dpni_set_multicast_promisc(dpni, CMD_PRI_LOW, priv->token, false);
9275d5aeeedSHemant Agrawal 	if (ret < 0)
928645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to disable multicast mode %d\n", ret);
929c0e5c69aSHemant Agrawal }
930e31d4d21SHemant Agrawal 
931e31d4d21SHemant Agrawal static int
932e31d4d21SHemant Agrawal dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
933e31d4d21SHemant Agrawal {
934e31d4d21SHemant Agrawal 	int ret;
935e31d4d21SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
936e31d4d21SHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
937e31d4d21SHemant Agrawal 	uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
938e31d4d21SHemant Agrawal 
939e31d4d21SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
940e31d4d21SHemant Agrawal 
941e31d4d21SHemant Agrawal 	if (dpni == NULL) {
942645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
943e31d4d21SHemant Agrawal 		return -EINVAL;
944e31d4d21SHemant Agrawal 	}
945e31d4d21SHemant Agrawal 
946e31d4d21SHemant Agrawal 	/* check that mtu is within the allowed range */
947e31d4d21SHemant Agrawal 	if ((mtu < ETHER_MIN_MTU) || (frame_size > DPAA2_MAX_RX_PKT_LEN))
948e31d4d21SHemant Agrawal 		return -EINVAL;
949e31d4d21SHemant Agrawal 
950e1640849SHemant Agrawal 	if (frame_size > ETHER_MAX_LEN)
951e1640849SHemant Agrawal 		dev->data->dev_conf.rxmode.jumbo_frame = 1;
952e1640849SHemant Agrawal 	else
953e1640849SHemant Agrawal 		dev->data->dev_conf.rxmode.jumbo_frame = 0;
954e1640849SHemant Agrawal 
955e31d4d21SHemant Agrawal 	/* Set the Max Rx frame length as 'mtu' +
956e31d4d21SHemant Agrawal 	 * Maximum Ethernet header length
957e31d4d21SHemant Agrawal 	 */
958e31d4d21SHemant Agrawal 	ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW, priv->token,
959e31d4d21SHemant Agrawal 					mtu + ETH_VLAN_HLEN);
960e31d4d21SHemant Agrawal 	if (ret) {
961e31d4d21SHemant Agrawal 		PMD_DRV_LOG(ERR, "setting the max frame length failed");
962e31d4d21SHemant Agrawal 		return -1;
963e31d4d21SHemant Agrawal 	}
964e31d4d21SHemant Agrawal 	PMD_DRV_LOG(INFO, "MTU is configured %d for the device\n", mtu);
965e31d4d21SHemant Agrawal 	return 0;
966e31d4d21SHemant Agrawal }
967e31d4d21SHemant Agrawal 
968b4d97b7dSHemant Agrawal static int
969b4d97b7dSHemant Agrawal dpaa2_dev_add_mac_addr(struct rte_eth_dev *dev,
970b4d97b7dSHemant Agrawal 		       struct ether_addr *addr,
971b4d97b7dSHemant Agrawal 		       __rte_unused uint32_t index,
972b4d97b7dSHemant Agrawal 		       __rte_unused uint32_t pool)
973b4d97b7dSHemant Agrawal {
974b4d97b7dSHemant Agrawal 	int ret;
975b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
976b4d97b7dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
977b4d97b7dSHemant Agrawal 
978b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
979b4d97b7dSHemant Agrawal 
980b4d97b7dSHemant Agrawal 	if (dpni == NULL) {
981645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
982b4d97b7dSHemant Agrawal 		return -1;
983b4d97b7dSHemant Agrawal 	}
984b4d97b7dSHemant Agrawal 
985b4d97b7dSHemant Agrawal 	ret = dpni_add_mac_addr(dpni, CMD_PRI_LOW,
986b4d97b7dSHemant Agrawal 				priv->token, addr->addr_bytes);
987b4d97b7dSHemant Agrawal 	if (ret)
988645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD,
989645bd25aSHemant Agrawal 			"error: Adding the MAC ADDR failed: err = %d\n", ret);
990b4d97b7dSHemant Agrawal 	return 0;
991b4d97b7dSHemant Agrawal }
992b4d97b7dSHemant Agrawal 
993b4d97b7dSHemant Agrawal static void
994b4d97b7dSHemant Agrawal dpaa2_dev_remove_mac_addr(struct rte_eth_dev *dev,
995b4d97b7dSHemant Agrawal 			  uint32_t index)
996b4d97b7dSHemant Agrawal {
997b4d97b7dSHemant Agrawal 	int ret;
998b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
999b4d97b7dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1000b4d97b7dSHemant Agrawal 	struct rte_eth_dev_data *data = dev->data;
1001b4d97b7dSHemant Agrawal 	struct ether_addr *macaddr;
1002b4d97b7dSHemant Agrawal 
1003b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1004b4d97b7dSHemant Agrawal 
1005b4d97b7dSHemant Agrawal 	macaddr = &data->mac_addrs[index];
1006b4d97b7dSHemant Agrawal 
1007b4d97b7dSHemant Agrawal 	if (dpni == NULL) {
1008645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1009b4d97b7dSHemant Agrawal 		return;
1010b4d97b7dSHemant Agrawal 	}
1011b4d97b7dSHemant Agrawal 
1012b4d97b7dSHemant Agrawal 	ret = dpni_remove_mac_addr(dpni, CMD_PRI_LOW,
1013b4d97b7dSHemant Agrawal 				   priv->token, macaddr->addr_bytes);
1014b4d97b7dSHemant Agrawal 	if (ret)
1015645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD,
1016645bd25aSHemant Agrawal 			"error: Removing the MAC ADDR failed: err = %d\n", ret);
1017b4d97b7dSHemant Agrawal }
1018b4d97b7dSHemant Agrawal 
1019b4d97b7dSHemant Agrawal static void
1020b4d97b7dSHemant Agrawal dpaa2_dev_set_mac_addr(struct rte_eth_dev *dev,
1021b4d97b7dSHemant Agrawal 		       struct ether_addr *addr)
1022b4d97b7dSHemant Agrawal {
1023b4d97b7dSHemant Agrawal 	int ret;
1024b4d97b7dSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1025b4d97b7dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1026b4d97b7dSHemant Agrawal 
1027b4d97b7dSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
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_set_primary_mac_addr(dpni, CMD_PRI_LOW,
1035b4d97b7dSHemant Agrawal 					priv->token, addr->addr_bytes);
1036b4d97b7dSHemant Agrawal 
1037b4d97b7dSHemant Agrawal 	if (ret)
1038645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD,
1039645bd25aSHemant Agrawal 			"error: Setting the MAC ADDR failed %d\n", ret);
1040b4d97b7dSHemant Agrawal }
1041b0aa5459SHemant Agrawal static
1042b0aa5459SHemant Agrawal void dpaa2_dev_stats_get(struct rte_eth_dev *dev,
1043b0aa5459SHemant Agrawal 			 struct rte_eth_stats *stats)
1044b0aa5459SHemant Agrawal {
1045b0aa5459SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1046b0aa5459SHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1047b0aa5459SHemant Agrawal 	int32_t  retcode;
1048b0aa5459SHemant Agrawal 	uint8_t page0 = 0, page1 = 1, page2 = 2;
1049b0aa5459SHemant Agrawal 	union dpni_statistics value;
1050b0aa5459SHemant Agrawal 
1051b0aa5459SHemant Agrawal 	memset(&value, 0, sizeof(union dpni_statistics));
1052b0aa5459SHemant Agrawal 
1053b0aa5459SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1054b0aa5459SHemant Agrawal 
1055b0aa5459SHemant Agrawal 	if (!dpni) {
1056645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1057b0aa5459SHemant Agrawal 		return;
1058b0aa5459SHemant Agrawal 	}
1059b0aa5459SHemant Agrawal 
1060b0aa5459SHemant Agrawal 	if (!stats) {
1061645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "stats is NULL\n");
1062b0aa5459SHemant Agrawal 		return;
1063b0aa5459SHemant Agrawal 	}
1064b0aa5459SHemant Agrawal 
1065b0aa5459SHemant Agrawal 	/*Get Counters from page_0*/
1066b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
106716bbc98aSShreyansh Jain 				      page0, 0, &value);
1068b0aa5459SHemant Agrawal 	if (retcode)
1069b0aa5459SHemant Agrawal 		goto err;
1070b0aa5459SHemant Agrawal 
1071b0aa5459SHemant Agrawal 	stats->ipackets = value.page_0.ingress_all_frames;
1072b0aa5459SHemant Agrawal 	stats->ibytes = value.page_0.ingress_all_bytes;
1073b0aa5459SHemant Agrawal 
1074b0aa5459SHemant Agrawal 	/*Get Counters from page_1*/
1075b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
107616bbc98aSShreyansh Jain 				      page1, 0, &value);
1077b0aa5459SHemant Agrawal 	if (retcode)
1078b0aa5459SHemant Agrawal 		goto err;
1079b0aa5459SHemant Agrawal 
1080b0aa5459SHemant Agrawal 	stats->opackets = value.page_1.egress_all_frames;
1081b0aa5459SHemant Agrawal 	stats->obytes = value.page_1.egress_all_bytes;
1082b0aa5459SHemant Agrawal 
1083b0aa5459SHemant Agrawal 	/*Get Counters from page_2*/
1084b0aa5459SHemant Agrawal 	retcode = dpni_get_statistics(dpni, CMD_PRI_LOW, priv->token,
108516bbc98aSShreyansh Jain 				      page2, 0, &value);
1086b0aa5459SHemant Agrawal 	if (retcode)
1087b0aa5459SHemant Agrawal 		goto err;
1088b0aa5459SHemant Agrawal 
1089b4d97b7dSHemant Agrawal 	/* Ingress drop frame count due to configured rules */
1090b4d97b7dSHemant Agrawal 	stats->ierrors = value.page_2.ingress_filtered_frames;
1091b4d97b7dSHemant Agrawal 	/* Ingress drop frame count due to error */
1092b4d97b7dSHemant Agrawal 	stats->ierrors += value.page_2.ingress_discarded_frames;
1093b4d97b7dSHemant Agrawal 
1094b0aa5459SHemant Agrawal 	stats->oerrors = value.page_2.egress_discarded_frames;
1095b0aa5459SHemant Agrawal 	stats->imissed = value.page_2.ingress_nobuffer_discards;
1096b0aa5459SHemant Agrawal 
1097b0aa5459SHemant Agrawal 	return;
1098b0aa5459SHemant Agrawal 
1099b0aa5459SHemant Agrawal err:
1100b0aa5459SHemant Agrawal 	RTE_LOG(ERR, PMD, "Operation not completed:Error Code = %d\n", retcode);
1101b0aa5459SHemant Agrawal 	return;
1102b0aa5459SHemant Agrawal };
1103b0aa5459SHemant Agrawal 
1104b0aa5459SHemant Agrawal static
1105b0aa5459SHemant Agrawal void dpaa2_dev_stats_reset(struct rte_eth_dev *dev)
1106b0aa5459SHemant Agrawal {
1107b0aa5459SHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1108b0aa5459SHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1109b0aa5459SHemant Agrawal 	int32_t  retcode;
1110b0aa5459SHemant Agrawal 
1111b0aa5459SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1112b0aa5459SHemant Agrawal 
1113b0aa5459SHemant Agrawal 	if (dpni == NULL) {
1114645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1115b0aa5459SHemant Agrawal 		return;
1116b0aa5459SHemant Agrawal 	}
1117b0aa5459SHemant Agrawal 
1118b0aa5459SHemant Agrawal 	retcode =  dpni_reset_statistics(dpni, CMD_PRI_LOW, priv->token);
1119b0aa5459SHemant Agrawal 	if (retcode)
1120b0aa5459SHemant Agrawal 		goto error;
1121b0aa5459SHemant Agrawal 
1122b0aa5459SHemant Agrawal 	return;
1123b0aa5459SHemant Agrawal 
1124b0aa5459SHemant Agrawal error:
1125b0aa5459SHemant Agrawal 	RTE_LOG(ERR, PMD, "Operation not completed:Error Code = %d\n", retcode);
1126b0aa5459SHemant Agrawal 	return;
1127b0aa5459SHemant Agrawal };
1128b0aa5459SHemant Agrawal 
1129c56c86ffSHemant Agrawal /* return 0 means link status changed, -1 means not changed */
1130c56c86ffSHemant Agrawal static int
1131c56c86ffSHemant Agrawal dpaa2_dev_link_update(struct rte_eth_dev *dev,
1132c56c86ffSHemant Agrawal 			int wait_to_complete __rte_unused)
1133c56c86ffSHemant Agrawal {
1134c56c86ffSHemant Agrawal 	int ret;
1135c56c86ffSHemant Agrawal 	struct dpaa2_dev_priv *priv = dev->data->dev_private;
1136c56c86ffSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
1137c56c86ffSHemant Agrawal 	struct rte_eth_link link, old;
1138c56c86ffSHemant Agrawal 	struct dpni_link_state state = {0};
1139c56c86ffSHemant Agrawal 
1140c56c86ffSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1141c56c86ffSHemant Agrawal 
1142c56c86ffSHemant Agrawal 	if (dpni == NULL) {
1143645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1144c56c86ffSHemant Agrawal 		return 0;
1145c56c86ffSHemant Agrawal 	}
1146c56c86ffSHemant Agrawal 	memset(&old, 0, sizeof(old));
1147c56c86ffSHemant Agrawal 	dpaa2_dev_atomic_read_link_status(dev, &old);
1148c56c86ffSHemant Agrawal 
1149c56c86ffSHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1150c56c86ffSHemant Agrawal 	if (ret < 0) {
1151645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "error: dpni_get_link_state %d\n", ret);
1152c56c86ffSHemant Agrawal 		return -1;
1153c56c86ffSHemant Agrawal 	}
1154c56c86ffSHemant Agrawal 
1155c56c86ffSHemant Agrawal 	if ((old.link_status == state.up) && (old.link_speed == state.rate)) {
1156c56c86ffSHemant Agrawal 		RTE_LOG(DEBUG, PMD, "No change in status\n");
1157c56c86ffSHemant Agrawal 		return -1;
1158c56c86ffSHemant Agrawal 	}
1159c56c86ffSHemant Agrawal 
1160c56c86ffSHemant Agrawal 	memset(&link, 0, sizeof(struct rte_eth_link));
1161c56c86ffSHemant Agrawal 	link.link_status = state.up;
1162c56c86ffSHemant Agrawal 	link.link_speed = state.rate;
1163c56c86ffSHemant Agrawal 
1164c56c86ffSHemant Agrawal 	if (state.options & DPNI_LINK_OPT_HALF_DUPLEX)
1165c56c86ffSHemant Agrawal 		link.link_duplex = ETH_LINK_HALF_DUPLEX;
1166c56c86ffSHemant Agrawal 	else
1167c56c86ffSHemant Agrawal 		link.link_duplex = ETH_LINK_FULL_DUPLEX;
1168c56c86ffSHemant Agrawal 
1169c56c86ffSHemant Agrawal 	dpaa2_dev_atomic_write_link_status(dev, &link);
1170c56c86ffSHemant Agrawal 
1171c56c86ffSHemant Agrawal 	if (link.link_status)
1172c56c86ffSHemant Agrawal 		PMD_DRV_LOG(INFO, "Port %d Link is Up\n", dev->data->port_id);
1173c56c86ffSHemant Agrawal 	else
1174c56c86ffSHemant Agrawal 		PMD_DRV_LOG(INFO, "Port %d Link is Down\n", dev->data->port_id);
1175c56c86ffSHemant Agrawal 	return 0;
1176c56c86ffSHemant Agrawal }
1177c56c86ffSHemant Agrawal 
1178a1f3a12cSHemant Agrawal /**
1179a1f3a12cSHemant Agrawal  * Toggle the DPNI to enable, if not already enabled.
1180a1f3a12cSHemant Agrawal  * This is not strictly PHY up/down - it is more of logical toggling.
1181a1f3a12cSHemant Agrawal  */
1182a1f3a12cSHemant Agrawal static int
1183a1f3a12cSHemant Agrawal dpaa2_dev_set_link_up(struct rte_eth_dev *dev)
1184a1f3a12cSHemant Agrawal {
1185a1f3a12cSHemant Agrawal 	int ret = -EINVAL;
1186a1f3a12cSHemant Agrawal 	struct dpaa2_dev_priv *priv;
1187a1f3a12cSHemant Agrawal 	struct fsl_mc_io *dpni;
1188a1f3a12cSHemant Agrawal 	int en = 0;
1189a1f3a12cSHemant Agrawal 
1190a1f3a12cSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1191a1f3a12cSHemant Agrawal 
1192a1f3a12cSHemant Agrawal 	priv = dev->data->dev_private;
1193a1f3a12cSHemant Agrawal 	dpni = (struct fsl_mc_io *)priv->hw;
1194a1f3a12cSHemant Agrawal 
1195a1f3a12cSHemant Agrawal 	if (dpni == NULL) {
1196645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "DPNI is NULL\n");
1197a1f3a12cSHemant Agrawal 		return ret;
1198a1f3a12cSHemant Agrawal 	}
1199a1f3a12cSHemant Agrawal 
1200a1f3a12cSHemant Agrawal 	/* Check if DPNI is currently enabled */
1201a1f3a12cSHemant Agrawal 	ret = dpni_is_enabled(dpni, CMD_PRI_LOW, priv->token, &en);
1202a1f3a12cSHemant Agrawal 	if (ret) {
1203a1f3a12cSHemant Agrawal 		/* Unable to obtain dpni status; Not continuing */
1204a1f3a12cSHemant Agrawal 		PMD_DRV_LOG(ERR, "Interface Link UP failed (%d)", ret);
1205a1f3a12cSHemant Agrawal 		return -EINVAL;
1206a1f3a12cSHemant Agrawal 	}
1207a1f3a12cSHemant Agrawal 
1208a1f3a12cSHemant Agrawal 	/* Enable link if not already enabled */
1209a1f3a12cSHemant Agrawal 	if (!en) {
1210a1f3a12cSHemant Agrawal 		ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
1211a1f3a12cSHemant Agrawal 		if (ret) {
1212a1f3a12cSHemant Agrawal 			PMD_DRV_LOG(ERR, "Interface Link UP failed (%d)", ret);
1213a1f3a12cSHemant Agrawal 			return -EINVAL;
1214a1f3a12cSHemant Agrawal 		}
1215a1f3a12cSHemant Agrawal 	}
1216a1f3a12cSHemant Agrawal 	/* changing tx burst function to start enqueues */
1217a1f3a12cSHemant Agrawal 	dev->tx_pkt_burst = dpaa2_dev_tx;
1218a1f3a12cSHemant Agrawal 	dev->data->dev_link.link_status = 1;
1219a1f3a12cSHemant Agrawal 
1220a1f3a12cSHemant Agrawal 	PMD_DRV_LOG(INFO, "Port %d Link UP successful", dev->data->port_id);
1221a1f3a12cSHemant Agrawal 	return ret;
1222a1f3a12cSHemant Agrawal }
1223a1f3a12cSHemant Agrawal 
1224a1f3a12cSHemant Agrawal /**
1225a1f3a12cSHemant Agrawal  * Toggle the DPNI to disable, if not already disabled.
1226a1f3a12cSHemant Agrawal  * This is not strictly PHY up/down - it is more of logical toggling.
1227a1f3a12cSHemant Agrawal  */
1228a1f3a12cSHemant Agrawal static int
1229a1f3a12cSHemant Agrawal dpaa2_dev_set_link_down(struct rte_eth_dev *dev)
1230a1f3a12cSHemant Agrawal {
1231a1f3a12cSHemant Agrawal 	int ret = -EINVAL;
1232a1f3a12cSHemant Agrawal 	struct dpaa2_dev_priv *priv;
1233a1f3a12cSHemant Agrawal 	struct fsl_mc_io *dpni;
1234a1f3a12cSHemant Agrawal 	int dpni_enabled = 0;
1235a1f3a12cSHemant Agrawal 	int retries = 10;
1236a1f3a12cSHemant Agrawal 
1237a1f3a12cSHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1238a1f3a12cSHemant Agrawal 
1239a1f3a12cSHemant Agrawal 	priv = dev->data->dev_private;
1240a1f3a12cSHemant Agrawal 	dpni = (struct fsl_mc_io *)priv->hw;
1241a1f3a12cSHemant Agrawal 
1242a1f3a12cSHemant Agrawal 	if (dpni == NULL) {
1243645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Device has not yet been configured\n");
1244a1f3a12cSHemant Agrawal 		return ret;
1245a1f3a12cSHemant Agrawal 	}
1246a1f3a12cSHemant Agrawal 
1247a1f3a12cSHemant Agrawal 	/*changing  tx burst function to avoid any more enqueues */
1248a1f3a12cSHemant Agrawal 	dev->tx_pkt_burst = dummy_dev_tx;
1249a1f3a12cSHemant Agrawal 
1250a1f3a12cSHemant Agrawal 	/* Loop while dpni_disable() attempts to drain the egress FQs
1251a1f3a12cSHemant Agrawal 	 * and confirm them back to us.
1252a1f3a12cSHemant Agrawal 	 */
1253a1f3a12cSHemant Agrawal 	do {
1254a1f3a12cSHemant Agrawal 		ret = dpni_disable(dpni, 0, priv->token);
1255a1f3a12cSHemant Agrawal 		if (ret) {
1256a1f3a12cSHemant Agrawal 			PMD_DRV_LOG(ERR, "dpni disable failed (%d)", ret);
1257a1f3a12cSHemant Agrawal 			return ret;
1258a1f3a12cSHemant Agrawal 		}
1259a1f3a12cSHemant Agrawal 		ret = dpni_is_enabled(dpni, 0, priv->token, &dpni_enabled);
1260a1f3a12cSHemant Agrawal 		if (ret) {
1261a1f3a12cSHemant Agrawal 			PMD_DRV_LOG(ERR, "dpni_is_enabled failed (%d)", ret);
1262a1f3a12cSHemant Agrawal 			return ret;
1263a1f3a12cSHemant Agrawal 		}
1264a1f3a12cSHemant Agrawal 		if (dpni_enabled)
1265a1f3a12cSHemant Agrawal 			/* Allow the MC some slack */
1266a1f3a12cSHemant Agrawal 			rte_delay_us(100 * 1000);
1267a1f3a12cSHemant Agrawal 	} while (dpni_enabled && --retries);
1268a1f3a12cSHemant Agrawal 
1269a1f3a12cSHemant Agrawal 	if (!retries) {
1270a1f3a12cSHemant Agrawal 		PMD_DRV_LOG(WARNING, "Retry count exceeded disabling DPNI\n");
1271a1f3a12cSHemant Agrawal 		/* todo- we may have to manually cleanup queues.
1272a1f3a12cSHemant Agrawal 		 */
1273a1f3a12cSHemant Agrawal 	} else {
1274a1f3a12cSHemant Agrawal 		PMD_DRV_LOG(INFO, "Port %d Link DOWN successful",
1275a1f3a12cSHemant Agrawal 			    dev->data->port_id);
1276a1f3a12cSHemant Agrawal 	}
1277a1f3a12cSHemant Agrawal 
1278a1f3a12cSHemant Agrawal 	dev->data->dev_link.link_status = 0;
1279a1f3a12cSHemant Agrawal 
1280a1f3a12cSHemant Agrawal 	return ret;
1281a1f3a12cSHemant Agrawal }
1282a1f3a12cSHemant Agrawal 
1283977d0006SHemant Agrawal static int
1284977d0006SHemant Agrawal dpaa2_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
1285977d0006SHemant Agrawal {
1286977d0006SHemant Agrawal 	int ret = -EINVAL;
1287977d0006SHemant Agrawal 	struct dpaa2_dev_priv *priv;
1288977d0006SHemant Agrawal 	struct fsl_mc_io *dpni;
1289977d0006SHemant Agrawal 	struct dpni_link_state state = {0};
1290977d0006SHemant Agrawal 
1291977d0006SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1292977d0006SHemant Agrawal 
1293977d0006SHemant Agrawal 	priv = dev->data->dev_private;
1294977d0006SHemant Agrawal 	dpni = (struct fsl_mc_io *)priv->hw;
1295977d0006SHemant Agrawal 
1296977d0006SHemant Agrawal 	if (dpni == NULL || fc_conf == NULL) {
1297645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "device not configured\n");
1298977d0006SHemant Agrawal 		return ret;
1299977d0006SHemant Agrawal 	}
1300977d0006SHemant Agrawal 
1301977d0006SHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1302977d0006SHemant Agrawal 	if (ret) {
1303645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "error: dpni_get_link_state %d\n", ret);
1304977d0006SHemant Agrawal 		return ret;
1305977d0006SHemant Agrawal 	}
1306977d0006SHemant Agrawal 
1307977d0006SHemant Agrawal 	memset(fc_conf, 0, sizeof(struct rte_eth_fc_conf));
1308977d0006SHemant Agrawal 	if (state.options & DPNI_LINK_OPT_PAUSE) {
1309977d0006SHemant Agrawal 		/* DPNI_LINK_OPT_PAUSE set
1310977d0006SHemant Agrawal 		 *  if ASYM_PAUSE not set,
1311977d0006SHemant Agrawal 		 *	RX Side flow control (handle received Pause frame)
1312977d0006SHemant Agrawal 		 *	TX side flow control (send Pause frame)
1313977d0006SHemant Agrawal 		 *  if ASYM_PAUSE set,
1314977d0006SHemant Agrawal 		 *	RX Side flow control (handle received Pause frame)
1315977d0006SHemant Agrawal 		 *	No TX side flow control (send Pause frame disabled)
1316977d0006SHemant Agrawal 		 */
1317977d0006SHemant Agrawal 		if (!(state.options & DPNI_LINK_OPT_ASYM_PAUSE))
1318977d0006SHemant Agrawal 			fc_conf->mode = RTE_FC_FULL;
1319977d0006SHemant Agrawal 		else
1320977d0006SHemant Agrawal 			fc_conf->mode = RTE_FC_RX_PAUSE;
1321977d0006SHemant Agrawal 	} else {
1322977d0006SHemant Agrawal 		/* DPNI_LINK_OPT_PAUSE not set
1323977d0006SHemant Agrawal 		 *  if ASYM_PAUSE set,
1324977d0006SHemant Agrawal 		 *	TX side flow control (send Pause frame)
1325977d0006SHemant Agrawal 		 *	No RX side flow control (No action on pause frame rx)
1326977d0006SHemant Agrawal 		 *  if ASYM_PAUSE not set,
1327977d0006SHemant Agrawal 		 *	Flow control disabled
1328977d0006SHemant Agrawal 		 */
1329977d0006SHemant Agrawal 		if (state.options & DPNI_LINK_OPT_ASYM_PAUSE)
1330977d0006SHemant Agrawal 			fc_conf->mode = RTE_FC_TX_PAUSE;
1331977d0006SHemant Agrawal 		else
1332977d0006SHemant Agrawal 			fc_conf->mode = RTE_FC_NONE;
1333977d0006SHemant Agrawal 	}
1334977d0006SHemant Agrawal 
1335977d0006SHemant Agrawal 	return ret;
1336977d0006SHemant Agrawal }
1337977d0006SHemant Agrawal 
1338977d0006SHemant Agrawal static int
1339977d0006SHemant Agrawal dpaa2_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
1340977d0006SHemant Agrawal {
1341977d0006SHemant Agrawal 	int ret = -EINVAL;
1342977d0006SHemant Agrawal 	struct dpaa2_dev_priv *priv;
1343977d0006SHemant Agrawal 	struct fsl_mc_io *dpni;
1344977d0006SHemant Agrawal 	struct dpni_link_state state = {0};
1345977d0006SHemant Agrawal 	struct dpni_link_cfg cfg = {0};
1346977d0006SHemant Agrawal 
1347977d0006SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1348977d0006SHemant Agrawal 
1349977d0006SHemant Agrawal 	priv = dev->data->dev_private;
1350977d0006SHemant Agrawal 	dpni = (struct fsl_mc_io *)priv->hw;
1351977d0006SHemant Agrawal 
1352977d0006SHemant Agrawal 	if (dpni == NULL) {
1353645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "dpni is NULL\n");
1354977d0006SHemant Agrawal 		return ret;
1355977d0006SHemant Agrawal 	}
1356977d0006SHemant Agrawal 
1357977d0006SHemant Agrawal 	/* It is necessary to obtain the current state before setting fc_conf
1358977d0006SHemant Agrawal 	 * as MC would return error in case rate, autoneg or duplex values are
1359977d0006SHemant Agrawal 	 * different.
1360977d0006SHemant Agrawal 	 */
1361977d0006SHemant Agrawal 	ret = dpni_get_link_state(dpni, CMD_PRI_LOW, priv->token, &state);
1362977d0006SHemant Agrawal 	if (ret) {
1363645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Unable to get link state (err=%d)\n", ret);
1364977d0006SHemant Agrawal 		return -1;
1365977d0006SHemant Agrawal 	}
1366977d0006SHemant Agrawal 
1367977d0006SHemant Agrawal 	/* Disable link before setting configuration */
1368977d0006SHemant Agrawal 	dpaa2_dev_set_link_down(dev);
1369977d0006SHemant Agrawal 
1370977d0006SHemant Agrawal 	/* Based on fc_conf, update cfg */
1371977d0006SHemant Agrawal 	cfg.rate = state.rate;
1372977d0006SHemant Agrawal 	cfg.options = state.options;
1373977d0006SHemant Agrawal 
1374977d0006SHemant Agrawal 	/* update cfg with fc_conf */
1375977d0006SHemant Agrawal 	switch (fc_conf->mode) {
1376977d0006SHemant Agrawal 	case RTE_FC_FULL:
1377977d0006SHemant Agrawal 		/* Full flow control;
1378977d0006SHemant Agrawal 		 * OPT_PAUSE set, ASYM_PAUSE not set
1379977d0006SHemant Agrawal 		 */
1380977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_PAUSE;
1381977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;
1382f090a4c3SHemant Agrawal 		break;
1383977d0006SHemant Agrawal 	case RTE_FC_TX_PAUSE:
1384977d0006SHemant Agrawal 		/* Enable RX flow control
1385977d0006SHemant Agrawal 		 * OPT_PAUSE not set;
1386977d0006SHemant Agrawal 		 * ASYM_PAUSE set;
1387977d0006SHemant Agrawal 		 */
1388977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE;
1389977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_PAUSE;
1390977d0006SHemant Agrawal 		break;
1391977d0006SHemant Agrawal 	case RTE_FC_RX_PAUSE:
1392977d0006SHemant Agrawal 		/* Enable TX Flow control
1393977d0006SHemant Agrawal 		 * OPT_PAUSE set
1394977d0006SHemant Agrawal 		 * ASYM_PAUSE set
1395977d0006SHemant Agrawal 		 */
1396977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_PAUSE;
1397977d0006SHemant Agrawal 		cfg.options |= DPNI_LINK_OPT_ASYM_PAUSE;
1398977d0006SHemant Agrawal 		break;
1399977d0006SHemant Agrawal 	case RTE_FC_NONE:
1400977d0006SHemant Agrawal 		/* Disable Flow control
1401977d0006SHemant Agrawal 		 * OPT_PAUSE not set
1402977d0006SHemant Agrawal 		 * ASYM_PAUSE not set
1403977d0006SHemant Agrawal 		 */
1404977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_PAUSE;
1405977d0006SHemant Agrawal 		cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;
1406977d0006SHemant Agrawal 		break;
1407977d0006SHemant Agrawal 	default:
1408645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD, "Incorrect Flow control flag (%d)\n",
1409977d0006SHemant Agrawal 			fc_conf->mode);
1410977d0006SHemant Agrawal 		return -1;
1411977d0006SHemant Agrawal 	}
1412977d0006SHemant Agrawal 
1413977d0006SHemant Agrawal 	ret = dpni_set_link_cfg(dpni, CMD_PRI_LOW, priv->token, &cfg);
1414977d0006SHemant Agrawal 	if (ret)
1415645bd25aSHemant Agrawal 		RTE_LOG(ERR, PMD,
1416645bd25aSHemant Agrawal 			"Unable to set Link configuration (err=%d)\n",
1417977d0006SHemant Agrawal 			ret);
1418977d0006SHemant Agrawal 
1419977d0006SHemant Agrawal 	/* Enable link */
1420977d0006SHemant Agrawal 	dpaa2_dev_set_link_up(dev);
1421977d0006SHemant Agrawal 
1422977d0006SHemant Agrawal 	return ret;
1423977d0006SHemant Agrawal }
1424977d0006SHemant Agrawal 
14253e5a335dSHemant Agrawal static struct eth_dev_ops dpaa2_ethdev_ops = {
14263e5a335dSHemant Agrawal 	.dev_configure	  = dpaa2_eth_dev_configure,
14273e5a335dSHemant Agrawal 	.dev_start	      = dpaa2_dev_start,
14283e5a335dSHemant Agrawal 	.dev_stop	      = dpaa2_dev_stop,
14293e5a335dSHemant Agrawal 	.dev_close	      = dpaa2_dev_close,
1430c0e5c69aSHemant Agrawal 	.promiscuous_enable   = dpaa2_dev_promiscuous_enable,
1431c0e5c69aSHemant Agrawal 	.promiscuous_disable  = dpaa2_dev_promiscuous_disable,
14325d5aeeedSHemant Agrawal 	.allmulticast_enable  = dpaa2_dev_allmulticast_enable,
14335d5aeeedSHemant Agrawal 	.allmulticast_disable = dpaa2_dev_allmulticast_disable,
1434a1f3a12cSHemant Agrawal 	.dev_set_link_up      = dpaa2_dev_set_link_up,
1435a1f3a12cSHemant Agrawal 	.dev_set_link_down    = dpaa2_dev_set_link_down,
1436c56c86ffSHemant Agrawal 	.link_update	   = dpaa2_dev_link_update,
1437b0aa5459SHemant Agrawal 	.stats_get	       = dpaa2_dev_stats_get,
1438b0aa5459SHemant Agrawal 	.stats_reset	   = dpaa2_dev_stats_reset,
1439748eccb9SHemant Agrawal 	.fw_version_get	   = dpaa2_fw_version_get,
14403e5a335dSHemant Agrawal 	.dev_infos_get	   = dpaa2_dev_info_get,
1441a5fc38d4SHemant Agrawal 	.dev_supported_ptypes_get = dpaa2_supported_ptypes_get,
1442e31d4d21SHemant Agrawal 	.mtu_set           = dpaa2_dev_mtu_set,
14433ce294f2SHemant Agrawal 	.vlan_filter_set      = dpaa2_vlan_filter_set,
14443ce294f2SHemant Agrawal 	.vlan_offload_set     = dpaa2_vlan_offload_set,
14453e5a335dSHemant Agrawal 	.rx_queue_setup    = dpaa2_dev_rx_queue_setup,
14463e5a335dSHemant Agrawal 	.rx_queue_release  = dpaa2_dev_rx_queue_release,
14473e5a335dSHemant Agrawal 	.tx_queue_setup    = dpaa2_dev_tx_queue_setup,
14483e5a335dSHemant Agrawal 	.tx_queue_release  = dpaa2_dev_tx_queue_release,
1449977d0006SHemant Agrawal 	.flow_ctrl_get	      = dpaa2_flow_ctrl_get,
1450977d0006SHemant Agrawal 	.flow_ctrl_set	      = dpaa2_flow_ctrl_set,
1451b4d97b7dSHemant Agrawal 	.mac_addr_add         = dpaa2_dev_add_mac_addr,
1452b4d97b7dSHemant Agrawal 	.mac_addr_remove      = dpaa2_dev_remove_mac_addr,
1453b4d97b7dSHemant Agrawal 	.mac_addr_set         = dpaa2_dev_set_mac_addr,
14543e5a335dSHemant Agrawal };
14553e5a335dSHemant Agrawal 
1456c147eae0SHemant Agrawal static int
1457c147eae0SHemant Agrawal dpaa2_dev_init(struct rte_eth_dev *eth_dev)
1458c147eae0SHemant Agrawal {
14593e5a335dSHemant Agrawal 	struct rte_device *dev = eth_dev->device;
14603e5a335dSHemant Agrawal 	struct rte_dpaa2_device *dpaa2_dev;
14613e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni_dev;
14623e5a335dSHemant Agrawal 	struct dpni_attr attr;
14633e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
1464bee61d86SHemant Agrawal 	struct dpni_buffer_layout layout;
1465599017a2SHemant Agrawal 	int ret, hw_id;
14663e5a335dSHemant Agrawal 
1467d401ead1SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1468d401ead1SHemant Agrawal 
1469c147eae0SHemant Agrawal 	/* For secondary processes, the primary has done all the work */
1470c147eae0SHemant Agrawal 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
1471c147eae0SHemant Agrawal 		return 0;
1472c147eae0SHemant Agrawal 
14733e5a335dSHemant Agrawal 	dpaa2_dev = container_of(dev, struct rte_dpaa2_device, device);
14743e5a335dSHemant Agrawal 
14753e5a335dSHemant Agrawal 	hw_id = dpaa2_dev->object_id;
14763e5a335dSHemant Agrawal 
1477d4984046SHemant Agrawal 	dpni_dev = rte_malloc(NULL, sizeof(struct fsl_mc_io), 0);
14783e5a335dSHemant Agrawal 	if (!dpni_dev) {
14793e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "malloc failed for dpni device\n");
14803e5a335dSHemant Agrawal 		return -1;
14813e5a335dSHemant Agrawal 	}
14823e5a335dSHemant Agrawal 
14833e5a335dSHemant Agrawal 	dpni_dev->regs = rte_mcp_ptr_list[0];
14843e5a335dSHemant Agrawal 	ret = dpni_open(dpni_dev, CMD_PRI_LOW, hw_id, &priv->token);
14853e5a335dSHemant Agrawal 	if (ret) {
1486d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1487d4984046SHemant Agrawal 			     "Failure in opening dpni@%d with err code %d\n",
1488d4984046SHemant Agrawal 			     hw_id, ret);
1489d4984046SHemant Agrawal 		rte_free(dpni_dev);
14903e5a335dSHemant Agrawal 		return -1;
14913e5a335dSHemant Agrawal 	}
14923e5a335dSHemant Agrawal 
14933e5a335dSHemant Agrawal 	/* Clean the device first */
14943e5a335dSHemant Agrawal 	ret = dpni_reset(dpni_dev, CMD_PRI_LOW, priv->token);
14953e5a335dSHemant Agrawal 	if (ret) {
1496d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1497d4984046SHemant Agrawal 			     "Failure cleaning dpni@%d with err code %d\n",
1498d4984046SHemant Agrawal 			     hw_id, ret);
1499d4984046SHemant Agrawal 		goto init_err;
15003e5a335dSHemant Agrawal 	}
15013e5a335dSHemant Agrawal 
15023e5a335dSHemant Agrawal 	ret = dpni_get_attributes(dpni_dev, CMD_PRI_LOW, priv->token, &attr);
15033e5a335dSHemant Agrawal 	if (ret) {
1504d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1505d4984046SHemant Agrawal 			     "Failure in get dpni@%d attribute, err code %d\n",
1506d4984046SHemant Agrawal 			     hw_id, ret);
1507d4984046SHemant Agrawal 		goto init_err;
15083e5a335dSHemant Agrawal 	}
15093e5a335dSHemant Agrawal 
151016bbc98aSShreyansh Jain 	priv->num_rx_tc = attr.num_rx_tcs;
151189c2ea8fSHemant Agrawal 
151216bbc98aSShreyansh Jain 	/* Resetting the "num_rx_queues" to equal number of queues in first TC
1513599017a2SHemant Agrawal 	 * as only one TC is supported on Rx Side. Once Multiple TCs will be
1514599017a2SHemant Agrawal 	 * in use for Rx processing then this will be changed or removed.
151589c2ea8fSHemant Agrawal 	 */
1516599017a2SHemant Agrawal 	priv->nb_rx_queues = attr.num_queues;
151789c2ea8fSHemant Agrawal 
151816bbc98aSShreyansh Jain 	/* Using number of TX queues as number of TX TCs */
151916bbc98aSShreyansh Jain 	priv->nb_tx_queues = attr.num_tx_tcs;
1520ef18dafeSHemant Agrawal 
152116bbc98aSShreyansh Jain 	PMD_DRV_LOG(DEBUG, "RX-TC= %d, nb_rx_queues= %d, nb_tx_queues=%d",
152216bbc98aSShreyansh Jain 		    priv->num_tc, priv->nb_rx_queues, priv->nb_tx_queues);
15233e5a335dSHemant Agrawal 
15243e5a335dSHemant Agrawal 	priv->hw = dpni_dev;
15253e5a335dSHemant Agrawal 	priv->hw_id = hw_id;
152633fad432SHemant Agrawal 	priv->options = attr.options;
152733fad432SHemant Agrawal 	priv->max_mac_filters = attr.mac_filter_entries;
152833fad432SHemant Agrawal 	priv->max_vlan_filters = attr.vlan_filter_entries;
15293e5a335dSHemant Agrawal 	priv->flags = 0;
15303e5a335dSHemant Agrawal 
15313e5a335dSHemant Agrawal 	/* Allocate memory for hardware structure for queues */
15323e5a335dSHemant Agrawal 	ret = dpaa2_alloc_rx_tx_queues(eth_dev);
15333e5a335dSHemant Agrawal 	if (ret) {
15343e5a335dSHemant Agrawal 		PMD_INIT_LOG(ERR, "dpaa2_alloc_rx_tx_queuesFailed\n");
1535d4984046SHemant Agrawal 		goto init_err;
15363e5a335dSHemant Agrawal 	}
15373e5a335dSHemant Agrawal 
153833fad432SHemant Agrawal 	/* Allocate memory for storing MAC addresses */
153933fad432SHemant Agrawal 	eth_dev->data->mac_addrs = rte_zmalloc("dpni",
154033fad432SHemant Agrawal 		ETHER_ADDR_LEN * attr.mac_filter_entries, 0);
154133fad432SHemant Agrawal 	if (eth_dev->data->mac_addrs == NULL) {
1542d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1543d4984046SHemant Agrawal 		   "Failed to allocate %d bytes needed to store MAC addresses",
154433fad432SHemant Agrawal 			     ETHER_ADDR_LEN * attr.mac_filter_entries);
1545d4984046SHemant Agrawal 		ret = -ENOMEM;
1546d4984046SHemant Agrawal 		goto init_err;
154733fad432SHemant Agrawal 	}
154833fad432SHemant Agrawal 
154933fad432SHemant Agrawal 	ret = dpni_get_primary_mac_addr(dpni_dev, CMD_PRI_LOW,
155033fad432SHemant Agrawal 					priv->token,
155133fad432SHemant Agrawal 			(uint8_t *)(eth_dev->data->mac_addrs[0].addr_bytes));
155233fad432SHemant Agrawal 	if (ret) {
1553d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR, "DPNI get mac address failed:Err Code = %d\n",
1554d4984046SHemant Agrawal 			     ret);
1555d4984046SHemant Agrawal 		goto init_err;
155633fad432SHemant Agrawal 	}
155733fad432SHemant Agrawal 
1558bee61d86SHemant Agrawal 	/* ... tx buffer layout ... */
1559bee61d86SHemant Agrawal 	memset(&layout, 0, sizeof(struct dpni_buffer_layout));
1560bee61d86SHemant Agrawal 	layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
1561bee61d86SHemant Agrawal 	layout.pass_frame_status = 1;
1562bee61d86SHemant Agrawal 	ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
1563bee61d86SHemant Agrawal 				     DPNI_QUEUE_TX, &layout);
1564bee61d86SHemant Agrawal 	if (ret) {
1565d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR, "Error (%d) in setting tx buffer layout",
1566d4984046SHemant Agrawal 			     ret);
1567d4984046SHemant Agrawal 		goto init_err;
1568bee61d86SHemant Agrawal 	}
1569bee61d86SHemant Agrawal 
1570bee61d86SHemant Agrawal 	/* ... tx-conf and error buffer layout ... */
1571bee61d86SHemant Agrawal 	memset(&layout, 0, sizeof(struct dpni_buffer_layout));
1572bee61d86SHemant Agrawal 	layout.options = DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;
1573bee61d86SHemant Agrawal 	layout.pass_frame_status = 1;
1574bee61d86SHemant Agrawal 	ret = dpni_set_buffer_layout(dpni_dev, CMD_PRI_LOW, priv->token,
1575bee61d86SHemant Agrawal 				     DPNI_QUEUE_TX_CONFIRM, &layout);
1576bee61d86SHemant Agrawal 	if (ret) {
1577d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR, "Error (%d) in setting tx-conf buffer layout",
1578d4984046SHemant Agrawal 			     ret);
1579d4984046SHemant Agrawal 		goto init_err;
1580bee61d86SHemant Agrawal 	}
1581bee61d86SHemant Agrawal 
15823e5a335dSHemant Agrawal 	eth_dev->dev_ops = &dpaa2_ethdev_ops;
1583*c5acbb5eSHemant Agrawal 	eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
1584c147eae0SHemant Agrawal 
15855c6942fdSHemant Agrawal 	eth_dev->rx_pkt_burst = dpaa2_dev_prefetch_rx;
1586cd9935ceSHemant Agrawal 	eth_dev->tx_pkt_burst = dpaa2_dev_tx;
15871261cd68SHemant Agrawal 	rte_fslmc_vfio_dmamap();
15881261cd68SHemant Agrawal 
1589c147eae0SHemant Agrawal 	return 0;
1590d4984046SHemant Agrawal init_err:
1591d4984046SHemant Agrawal 	dpaa2_dev_uninit(eth_dev);
1592d4984046SHemant Agrawal 	return ret;
1593c147eae0SHemant Agrawal }
1594c147eae0SHemant Agrawal 
1595c147eae0SHemant Agrawal static int
15963e5a335dSHemant Agrawal dpaa2_dev_uninit(struct rte_eth_dev *eth_dev)
1597c147eae0SHemant Agrawal {
15983e5a335dSHemant Agrawal 	struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
15993e5a335dSHemant Agrawal 	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
16003e5a335dSHemant Agrawal 	int i, ret;
16013e5a335dSHemant Agrawal 	struct dpaa2_queue *dpaa2_q;
16023e5a335dSHemant Agrawal 
1603d401ead1SHemant Agrawal 	PMD_INIT_FUNC_TRACE();
1604d401ead1SHemant Agrawal 
1605c147eae0SHemant Agrawal 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
1606e729ec76SHemant Agrawal 		return 0;
1607c147eae0SHemant Agrawal 
16083e5a335dSHemant Agrawal 	if (!dpni) {
16093e5a335dSHemant Agrawal 		PMD_INIT_LOG(WARNING, "Already closed or not started");
16103e5a335dSHemant Agrawal 		return -1;
16113e5a335dSHemant Agrawal 	}
16123e5a335dSHemant Agrawal 
16133e5a335dSHemant Agrawal 	dpaa2_dev_close(eth_dev);
16143e5a335dSHemant Agrawal 
16153e5a335dSHemant Agrawal 	if (priv->rx_vq[0]) {
16163e5a335dSHemant Agrawal 		/* cleaning up queue storage */
16173e5a335dSHemant Agrawal 		for (i = 0; i < priv->nb_rx_queues; i++) {
16183e5a335dSHemant Agrawal 			dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
16193e5a335dSHemant Agrawal 			if (dpaa2_q->q_storage)
16203e5a335dSHemant Agrawal 				rte_free(dpaa2_q->q_storage);
16213e5a335dSHemant Agrawal 		}
16223e5a335dSHemant Agrawal 		/*free the all queue memory */
16233e5a335dSHemant Agrawal 		rte_free(priv->rx_vq[0]);
16243e5a335dSHemant Agrawal 		priv->rx_vq[0] = NULL;
16253e5a335dSHemant Agrawal 	}
16263e5a335dSHemant Agrawal 
1627d4984046SHemant Agrawal 	/* free memory for storing MAC addresses */
162833fad432SHemant Agrawal 	if (eth_dev->data->mac_addrs) {
162933fad432SHemant Agrawal 		rte_free(eth_dev->data->mac_addrs);
163033fad432SHemant Agrawal 		eth_dev->data->mac_addrs = NULL;
163133fad432SHemant Agrawal 	}
16323e5a335dSHemant Agrawal 
16333e5a335dSHemant Agrawal 	/* Close the device at underlying layer*/
16343e5a335dSHemant Agrawal 	ret = dpni_close(dpni, CMD_PRI_LOW, priv->token);
16353e5a335dSHemant Agrawal 	if (ret) {
1636d4984046SHemant Agrawal 		PMD_INIT_LOG(ERR,
1637d4984046SHemant Agrawal 			     "Failure closing dpni device with err code %d\n",
1638d4984046SHemant Agrawal 			     ret);
16393e5a335dSHemant Agrawal 	}
16403e5a335dSHemant Agrawal 
16413e5a335dSHemant Agrawal 	/* Free the allocated memory for ethernet private data and dpni*/
16423e5a335dSHemant Agrawal 	priv->hw = NULL;
1643d4984046SHemant Agrawal 	rte_free(dpni);
16443e5a335dSHemant Agrawal 
16453e5a335dSHemant Agrawal 	eth_dev->dev_ops = NULL;
1646cd9935ceSHemant Agrawal 	eth_dev->rx_pkt_burst = NULL;
1647cd9935ceSHemant Agrawal 	eth_dev->tx_pkt_burst = NULL;
16483e5a335dSHemant Agrawal 
1649c147eae0SHemant Agrawal 	return 0;
1650c147eae0SHemant Agrawal }
1651c147eae0SHemant Agrawal 
1652c147eae0SHemant Agrawal static int
165355fd2703SHemant Agrawal rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv,
1654c147eae0SHemant Agrawal 		struct rte_dpaa2_device *dpaa2_dev)
1655c147eae0SHemant Agrawal {
1656c147eae0SHemant Agrawal 	struct rte_eth_dev *eth_dev;
1657c147eae0SHemant Agrawal 	int diag;
1658c147eae0SHemant Agrawal 
1659c147eae0SHemant Agrawal 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
1660e729ec76SHemant Agrawal 		eth_dev = rte_eth_dev_allocate(dpaa2_dev->device.name);
1661e729ec76SHemant Agrawal 		if (!eth_dev)
1662e729ec76SHemant Agrawal 			return -ENODEV;
1663c147eae0SHemant Agrawal 		eth_dev->data->dev_private = rte_zmalloc(
1664c147eae0SHemant Agrawal 						"ethdev private structure",
1665c147eae0SHemant Agrawal 						sizeof(struct dpaa2_dev_priv),
1666c147eae0SHemant Agrawal 						RTE_CACHE_LINE_SIZE);
1667c147eae0SHemant Agrawal 		if (eth_dev->data->dev_private == NULL) {
1668d401ead1SHemant Agrawal 			PMD_INIT_LOG(CRIT, "Cannot allocate memzone for"
1669c147eae0SHemant Agrawal 				     " private port data\n");
1670c147eae0SHemant Agrawal 			rte_eth_dev_release_port(eth_dev);
1671c147eae0SHemant Agrawal 			return -ENOMEM;
1672c147eae0SHemant Agrawal 		}
1673e729ec76SHemant Agrawal 	} else {
1674e729ec76SHemant Agrawal 		eth_dev = rte_eth_dev_attach_secondary(dpaa2_dev->device.name);
1675e729ec76SHemant Agrawal 		if (!eth_dev)
1676e729ec76SHemant Agrawal 			return -ENODEV;
1677c147eae0SHemant Agrawal 	}
1678e729ec76SHemant Agrawal 
1679c147eae0SHemant Agrawal 	eth_dev->device = &dpaa2_dev->device;
168055fd2703SHemant Agrawal 	eth_dev->device->driver = &dpaa2_drv->driver;
168155fd2703SHemant Agrawal 
1682c147eae0SHemant Agrawal 	dpaa2_dev->eth_dev = eth_dev;
1683c147eae0SHemant Agrawal 	eth_dev->data->rx_mbuf_alloc_failed = 0;
1684c147eae0SHemant Agrawal 
1685c147eae0SHemant Agrawal 	/* Invoke PMD device initialization function */
1686c147eae0SHemant Agrawal 	diag = dpaa2_dev_init(eth_dev);
1687c147eae0SHemant Agrawal 	if (diag == 0)
1688c147eae0SHemant Agrawal 		return 0;
1689c147eae0SHemant Agrawal 
1690c147eae0SHemant Agrawal 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
1691c147eae0SHemant Agrawal 		rte_free(eth_dev->data->dev_private);
1692c147eae0SHemant Agrawal 	rte_eth_dev_release_port(eth_dev);
1693c147eae0SHemant Agrawal 	return diag;
1694c147eae0SHemant Agrawal }
1695c147eae0SHemant Agrawal 
1696c147eae0SHemant Agrawal static int
1697c147eae0SHemant Agrawal rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
1698c147eae0SHemant Agrawal {
1699c147eae0SHemant Agrawal 	struct rte_eth_dev *eth_dev;
1700c147eae0SHemant Agrawal 
1701c147eae0SHemant Agrawal 	eth_dev = dpaa2_dev->eth_dev;
1702c147eae0SHemant Agrawal 	dpaa2_dev_uninit(eth_dev);
1703c147eae0SHemant Agrawal 
1704c147eae0SHemant Agrawal 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
1705c147eae0SHemant Agrawal 		rte_free(eth_dev->data->dev_private);
1706c147eae0SHemant Agrawal 	rte_eth_dev_release_port(eth_dev);
1707c147eae0SHemant Agrawal 
1708c147eae0SHemant Agrawal 	return 0;
1709c147eae0SHemant Agrawal }
1710c147eae0SHemant Agrawal 
1711c147eae0SHemant Agrawal static struct rte_dpaa2_driver rte_dpaa2_pmd = {
1712bad555dfSShreyansh Jain 	.drv_type = DPAA2_ETH,
1713c147eae0SHemant Agrawal 	.probe = rte_dpaa2_probe,
1714c147eae0SHemant Agrawal 	.remove = rte_dpaa2_remove,
1715c147eae0SHemant Agrawal };
1716c147eae0SHemant Agrawal 
1717c147eae0SHemant Agrawal RTE_PMD_REGISTER_DPAA2(net_dpaa2, rte_dpaa2_pmd);
1718