From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <hemant.agrawal@nxp.com>
Received: from NAM02-SN1-obe.outbound.protection.outlook.com
 (mail-sn1nam02on0082.outbound.protection.outlook.com [104.47.36.82])
 by dpdk.org (Postfix) with ESMTP id CDE07F958
 for <dev@dpdk.org>; Wed, 15 Feb 2017 20:06:55 +0100 (CET)
Received: from DM2PR03CA0042.namprd03.prod.outlook.com (10.141.96.41) by
 MWHPR03MB2957.namprd03.prod.outlook.com (10.175.136.138) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id
 15.1.888.16; Wed, 15 Feb 2017 19:06:53 +0000
Received: from BN1AFFO11FD047.protection.gbl (2a01:111:f400:7c10::135) by
 DM2PR03CA0042.outlook.office365.com (2a01:111:e400:2428::41) with Microsoft
 SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.888.16 via
 Frontend Transport; Wed, 15 Feb 2017 19:06:54 +0000
Authentication-Results: spf=fail (sender IP is 192.88.168.50)
 smtp.mailfrom=nxp.com; caviumnetworks.com; dkim=none (message not signed)
 header.d=none;caviumnetworks.com; dmarc=fail action=none
 header.from=nxp.com;caviumnetworks.com; dkim=none (message not signed)
 header.d=none;
Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not
 designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; 
 client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net;
Received: from tx30smr01.am.freescale.net (192.88.168.50) by
 BN1AFFO11FD047.mail.protection.outlook.com (10.58.53.62) with Microsoft SMTP
 Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.904.16
 via Frontend Transport; Wed, 15 Feb 2017 19:06:53 +0000
Received: from bf-netperf1.idc ([10.232.134.28])
 by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v1FJ5fLr020023;
 Wed, 15 Feb 2017 12:06:50 -0700
From: Hemant Agrawal <hemant.agrawal@nxp.com>
To: <dev@dpdk.org>
CC: <thomas.monjalon@6wind.com>, <bruce.richardson@intel.com>,
 <shreyansh.jain@nxp.com>, <john.mcnamara@intel.com>,
 <ferruh.yigit@intel.com>, <jerin.jacob@caviumnetworks.com>
Date: Thu, 16 Feb 2017 06:09:22 +0530
Message-ID: <1487205586-6785-24-git-send-email-hemant.agrawal@nxp.com>
X-Mailer: git-send-email 1.9.1
In-Reply-To: <1487205586-6785-1-git-send-email-hemant.agrawal@nxp.com>
References: <1485172803-17288-1-git-send-email-hemant.agrawal@nxp.com>
 <1487205586-6785-1-git-send-email-hemant.agrawal@nxp.com>
X-EOPAttributedMessage: 0
X-Matching-Connectors: 131316592136028132;
 (91ab9b29-cfa4-454e-5278-08d120cd25b8); ()
X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI;
 SFV:NSPM;
 SFS:(10009020)(6009001)(336005)(7916002)(39380400002)(39840400002)(39450400003)(39850400002)(39400400002)(39410400002)(39860400002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(2351001)(105606002)(76176999)(50986999)(33646002)(92566002)(50226002)(5003940100001)(47776003)(86362001)(575784001)(389900002)(68736007)(356003)(305945005)(110136004)(38730400002)(85426001)(8936002)(97736004)(36756003)(626004)(2906002)(6666003)(6916009)(2950100002)(189998001)(5660300001)(4326007)(48376002)(106466001)(104016004)(8676002)(81166006)(81156014)(54906002)(53936002)(8656002)(50466002)(77096006);
 DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR03MB2957; H:tx30smr01.am.freescale.net;
 FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; 
X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD047;
 1:5CP69DK7ZglmAsDlixYkvMK1T9T9hH5gckj71mVzcJDaLUfOmL6KTglzwDifP8FZf9BBtu6jgO6N4s6xh0w98vJkd9U/IQTC9u+l9yhgNKeQ5NljoJPorzQWBopiFjYPPd2DYXrKNz74k3l6aJ5oRkyybtDMfnIstTgTULFCZ/p65gXzEraPuKAsbCZp8mdsQSQTn5d4EbZ47pT5UpeBCermxiN1H9B9p0b996AhsQEt6vfSMOiHnHb4vvSpvm3CAFyZeh4Xz8N/23XXXgrvmbOdHoZaqbJWxYIoE5sUdIs+euld483CKbCQqSCzX1bMCE7hMu9icsEzvcUAP2vQnfQIlh4mYeLiJ8pqYtbfrVLLGJ50WahfrV3GVIwPf+taCv2PMO8Nfy6InIk/wJiOJAqrqbq80hqADW4dmXsFIBvrd0S+fTO/zCVVzaVMhnLc+ER0nLTBQS5axOJ1yRG2f6OY7a/vx53zPhSF5kB9Ry5oB90Fp75S1VDvx/n9h5QqeiW96Fk2ki/4aeOs2mUBFkL5l/aI2BBVerQ5AdDK1bR22IxWPBpFpXYL2l2tzuSwubRZcgI/UZQYgt1U1ZrSlgQteYw/2csUsNzyCQCkUSGBtx8hGVzn+eAQfKr1N7ezvmokkRtNKl3I+WEAwSAVIQ==
MIME-Version: 1.0
Content-Type: text/plain
X-MS-Office365-Filtering-Correlation-Id: 4fd5850f-0c11-40af-9e85-08d455d5cdd6
X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:MWHPR03MB2957;
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2957;
 3:67pMJCOWwOAHA0svSuqLTkt2JnZBiyVylOT7grLTohZZSuWrB1p6+U2wu8/Hbx/vF7g6JkbFEsbYqp+oO6qjKgOsK+s9jKV97aycmK33u1uZIpQSrPF+B2jnA+MtBNgFQt6xPRuW9VqcuqRzpJ6luSN+F/f8FR08mcJhhgBjdo/bYBdAiJSDaeNl9lfydvtR1S7BnJOmXzQwhhqrMNJJA5gxS8xtJAN3IfFwuUrIiogQiYMUyrtoBYaborkoBz08sTndpQyod6Sa6PhdPjNXSyZ9mD8FgptK03ZFyhEt+UM8+VY7xcPvKXiAp0FDhmZk1e61l8DgHclt1/vH0Hv6/0Qtrpd5jT7ImoryCcs1di56nrjyErfmClgmxInmVMOt;
 25:zlyeZlspL6TTe9HNrSokEL9Q53zZIF3n1ShH0vrkILmUzC75TMrosu/MW77YYtqyCeWd+XBpBLgdpsQcj684MQnFBnt825uRnygOwE6WVlx0nYgLYYF8ezFQJlGzgNIUR9LQRNf0PqZrkxutNAhFgRLAYLy3+PyGIAxQYJJNu5/OOmBiaviw+g7vEYE9cL8xFC2U00irTQmyspJgqmx3GUl5sZ7DHoScZnf9Li5qXwt9L1kbqk8ZVwUymmHV4Hl1RDo4C0w5zYqy/big0xerJbX0OWLeH8NXcXDEEMeUPfPtJDJvJjz/5uYQJN22T5Ig7Z4OD00pCo9ghdCzP0QoQuxgB4iFVTToIg+Dx2GpytdJ1CWbvNvhRchsElZaDHmmPT6OllKhI+oKfxhDJvpKkDW3LIy5rflt6eUpX93tie/QJnakI9GI/YTxPHtyQD2EWAHN0mWn+mKjbXDEy9Qt3w==
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2957;
 31:rkYgSOYTf0VHpXK4V75QT7+6sKwzjcPEm5GkAcp+JdRwRov+tDXX0jN5Yg7CdhJjPKBBvSoGGgJcTTMRmOD+lOn2KB/O0Dlq2vf97T+kvuTETYboZSkNkWkZD6QU03Nmh1qsMbJHPQiSiWEJWgcWy56llWvQGoNPV1/Vm01PYoKX1g3gLpg9qWhsi3vT872Hl3wuJt0rVYfOW0XbfXAagAhZITFgsNZlWH/eansv4tfRyGiq9emFCq8CblL4+TC1pMnBVW1usCAYLTsFpTeXUmN2OZvSDTWEuuioNsceTcs=
X-Microsoft-Antispam-PRVS: <MWHPR03MB2957EFE6738DBBE71B50B81E895B0@MWHPR03MB2957.namprd03.prod.outlook.com>
X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(275809806118684);
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(6095060)(601004)(2401047)(5005006)(8121501046)(13017025)(13015025)(13023025)(13018025)(13024025)(10201501046)(3002001)(6055026)(6096035)(20161123563025)(20161123559025)(20161123561025)(20161123556025)(20161123565025);
 SRVR:MWHPR03MB2957; BCL:0; PCL:0; RULEID:(400006); SRVR:MWHPR03MB2957; 
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2957;
 4:aQ9+Q639/Un9bep51h/7sgiKsLoULlcmTzKiMX+Pqtn7Jw3CKUPT1lnDK9ltCbiZy4eSucE8Bj5vtQR7Cd447dZ5N7XUS2xDcKellt46V5jom9ay06b7Rffbcr6tFTwUJu8DxGYENs3RP3/R0Q29DNBc9cHgRotVhLEU/wuCvEfEU/lnW+/Ysa0B8ZKENcD7UJ+9EqDl4MC8ViBthWnggWVWRxDW3q2FBX9V8VYe0TEEEUQtwn7yjKr1oxCqyixjbqxs1bHMJiSZfw2IEFq7i5YT6sNQyA7R2Z/UHwixBV055Nc3uH6ULDOqeSE2Kgl0XyQPMDBKLchz0V5+41IrsftqjADCbkPyjtHAHUmZIvaUgNWYOek3BMwQcEENPiDvDejhpepJ/+Tl4CHrFxGMPPlApeeinKipGzcTB+9Z+P3Wv/xm1pwRS32kmGTLBNe6bjQqRgLRutmmab9//VsWEFXNTBzq/a1fr/Nh+Hmo45hj+FhK9flVLU+VBcZKNJkfiwl8aVnk8/KJ16BkrrQGJmzNJkNzzP+sHRKTSgyaXdt6Vc0TJBgV64o0H/8t8G65n1OChMudaM8/+P7agmlE6SCUZ+g8gfGt2f+r89YJwUcy/gUh+VgrKbPYh5gwRyqlJxlQh4JsAajt1/uQ63jOhTRWSW4l/N+CTTMLhn4kaPMQDdwFGgjECFIEEhNhk7oJxmfShMmpNIKqKYqDyKQDp5RZiK7keaWmJ8dnqy8VlGxs41eiyt82WLOcbsH1FP/qNC43EezIfC0+okq2hycXlQ==
X-Forefront-PRVS: 021975AE46
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR03MB2957;
 23:oWXiJD2LPAmlzCtbdu4YELOiAmv6WboDVraT1UmJN?=
 =?us-ascii?Q?5P7wj/VoX3MIoQCfwTwKpuZBWubFNCRS2Vq160gL29/4i9ZWUDjzTSqy1Ez6?=
 =?us-ascii?Q?ahs2BnzHfr6wRmKWN9TuJMpR6GfuhwsTHqu8jMnhJfUr+0QWQeS5fgvKaQsh?=
 =?us-ascii?Q?iIsDhMoKTZ0g+L7K8uSPZD4qRILJVZRYh7bP5L7qzuQum4ed+teVv/MLoI3e?=
 =?us-ascii?Q?CKYmflpKpPnaMJYLK55w2hTCe1ucNBS/cG5pyougkLpXHZbY74aNLoYyqayo?=
 =?us-ascii?Q?P9Td+K5Kc14kb0JKpY+zFqx1JN4Eu3Kvjj8S/REkBaEHB76r+ZyEaqgenYtD?=
 =?us-ascii?Q?gvrqTVmZPp3o6/a1uBIT/PhpLMWOyMdiko8+c9Q4MFBTPT7R5jYSE6TexwXP?=
 =?us-ascii?Q?nZ7EOZVzdggKJlc+VTRh3HeX6A6IsZoWOICceCisxkVurQlr04iUrRg7zrA0?=
 =?us-ascii?Q?ahH6UAQzeaFfHDOCCpB5GrWt2JsD41lTgQETpnS+nj0aaTBTGJSEiUOXSv12?=
 =?us-ascii?Q?O6Mkf8oE86gDcdUBWwfVxjIoxWSRyHZURKAXovwSExHwcWIfJOtC18R7BoOV?=
 =?us-ascii?Q?stlvD0Syvd5U7x32eyCysfPB7zsbE+Pm0R8VCUVDzglvxfmnAwSh+ru/eY/l?=
 =?us-ascii?Q?vdQOl57NMjhMDFx3gbJZZlU9WbtbCILyZXThwIJ7+pvtbaNrQIlf31xcVm1g?=
 =?us-ascii?Q?+ghiSi3qM92EzaZSv47S8A9CtxxGwJHjv9lsVs8aMA4ORn6HNjV4CfLjVPhs?=
 =?us-ascii?Q?56OBcr9gqoBleJjXgpwTC6ImCSEMFnoBl/8JYy4/ahsx9HZNICL1lnowBKRs?=
 =?us-ascii?Q?d2xoSuHC9CSh7lnZWrByrDJsFbkieFUVjCFiD77PRtrxFIdTY6UgGA6Nh0/T?=
 =?us-ascii?Q?Z/+yd2Of/np1CiAWnjIBEMYDnBs63q7angsZv56Ny7AId6iRhSIsProj0HMu?=
 =?us-ascii?Q?ZILyKmZW1rwhxrtgDzyV4HP4LQKHiAA4yS0wUaHFRi0lqeduDcXaq2weZ88V?=
 =?us-ascii?Q?UssjzCEyS0RfpV11lMrhqB1aeiAnFWZ2cCPsAb2ZEeSiE6aVAStY4hs07YGa?=
 =?us-ascii?Q?IAI1Ot1ibutYzeaFADKKQr+Zr6/pFo+83H3MRxbO22Bfl+0+mgpTdGQNvA01?=
 =?us-ascii?Q?enqsTHgnKc1cPVSR/330H5xkUWvGO1oe7wo86L8BMj5+zohrLEpuFoOQK6vO?=
 =?us-ascii?Q?1nAQP2cqNXmZQmQC4+/HxejG37MKQ6YSkgjbIS25Xwd5Z/BTUBZnJsrK1yPR?=
 =?us-ascii?Q?GVmOjKP6BDPYwKVCdVJZY5h8lJhykA7+DUPGn2GuaUwublXXXhT2b9kKde8o?=
 =?us-ascii?Q?hvxIoFeVrJolXgaJHr+b9bSaK42idkwGQ+wACSHIi8tD7JbgZwBZQXOEQ7Db?=
 =?us-ascii?Q?w50zg=3D=3D?=
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2957;
 6:qEcECH6LWGC+kZk8g++RVmV6Veo4qUrtLYhkSSnmGvV7I3Nnuu86K58ZKsp2vHdo+9Am6Di0jxQmlWofuU1Bqb1dAb/F/PLH8pcOmyu6VlJYYOVLw9o58sHqc1v54YointGv/LmIlN+F+TOn6nq7q812JGBo1y1SeVvcT1UYr39Swp98bQR90rH4b08Saa+LxUrVKHoWj9lhHq3fAP+uukPyL9GhY/q3qAhSjEfj7Dmz6ayuLDkMn0ANDL8vruu9vcPsb0IwEsYUPmXWEhZv28Kq24DgyBt/M85Y31Dza96WsPND7ZYPLj4QuFXVmbw9KQ8jreCCHf3ASXPvR2jeq4Od3zXGJwmXEU3bBG+UHZQluwJNdozv8WdB/LpULhbu2MeK0JXYrHVi52SLiEhOn9xtZuW720NwdrvBMY85jz4=;
 5:Qq1PKnMd6jVDKTBiNmVqS1xbxQ2DfJmibMpzB7FR2qEw5FF4iCHSdVNeb0Ea/wfUYl2q+ssc4bI/Ug1JhPFb9Wx7q2VcR4V3VRzH5pdHUKOctRKZOYiIy786Oo7+BGM7gPdm6Q5FOk+mZHxRzt1diNrzSDnLqx3g10EqE2oySYZ6y4EqOUQ7yuFuMvHhQspb;
 24:pkPOrFlT+9+vpStN/X2By+mREQMJFKMwtY+Lr6dF2pkioXEDwau6mYjtLgKsd/hER2A7uv4rjPNhpOX9mKrZCHv8H0/KZb/WiZ7VVdS0bTo=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2957;
 7:tZBuqER+KKKtW9VDUDlaT2JB8685z0KpgNhCxVfZ04lW9I3HZYxPnrOJZ3sRkasaF67K/EFd7x7KMRz6yimoawSV1txoI/7xYzk2orbYj7pQ95fcxje6+gsCipTxqVpXO1fCYpi2T9aE4/58/BLShWq5LLBabXN1VP50HUecA1vvqesaFnlabqSK6El4BGZh3BFn+uw6F/njUehrUV7mTvPx2ajJ+QYnQ/2lPr0hi8aueTJGiORPBN51AQ+F8KePw2+weLUHpJtwF7rYvvCEGqt1hPHPUWRhlWcx0GLJlyXQGz7IVEGCambq3CF3yZDBBPmFpiYYbO10wgYlDA7eWg==
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2017 19:06:53.4156 (UTC)
X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e
X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50];
 Helo=[tx30smr01.am.freescale.net]
X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem
X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB2957
Subject: [dpdk-dev] [PATCHv7 23/47] net/dpaa2: adding eth ops to dpaa2
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Wed, 15 Feb 2017 19:06:56 -0000

Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 doc/guides/nics/features/dpaa2.ini |   1 +
 drivers/net/dpaa2/Makefile         |   4 +
 drivers/net/dpaa2/dpaa2_ethdev.c   | 410 ++++++++++++++++++++++++++++++++++++-
 drivers/net/dpaa2/dpaa2_ethdev.h   |  15 ++
 4 files changed, 429 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/features/dpaa2.ini b/doc/guides/nics/features/dpaa2.ini
index b176208..0b59725 100644
--- a/doc/guides/nics/features/dpaa2.ini
+++ b/doc/guides/nics/features/dpaa2.ini
@@ -4,6 +4,7 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Queue start/stop     = Y
 Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/net/dpaa2/Makefile b/drivers/net/dpaa2/Makefile
index 966377a..6eb1e0b 100644
--- a/drivers/net/dpaa2/Makefile
+++ b/drivers/net/dpaa2/Makefile
@@ -46,6 +46,8 @@ endif
 
 CFLAGS += -I$(RTE_SDK)/drivers/net/dpaa2
 CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc
+CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/mc
+CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/portal
 CFLAGS += -I$(RTE_SDK)/drivers/common/dpaa2/qbman/include
 CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal
 
@@ -59,8 +61,10 @@ SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += dpaa2_ethdev.c
 
 # library dependencies
 DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += lib/librte_eal lib/librte_ether
+DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/common/dpaa2
 DEPDIRS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += drivers/bus/fslmc
 
+LDLIBS += -lrte_common_dpaa2_qbman
 LDLIBS += -lrte_bus_fslmc
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index ead6a2c..934755a 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -47,32 +47,440 @@
 
 #include <fslmc_logs.h>
 #include <fslmc_vfio.h>
+#include <dpaa2_hw_pvt.h>
+
 #include "dpaa2_ethdev.h"
 
 static struct rte_dpaa2_driver rte_dpaa2_pmd;
 
+static void
+dpaa2_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
+{
+	struct dpaa2_dev_priv *priv = dev->data->dev_private;
+
+	PMD_INIT_FUNC_TRACE();
+
+	dev_info->if_index = priv->hw_id;
+
+	dev_info->max_rx_queues = (uint16_t)priv->nb_rx_queues;
+	dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues;
+
+	dev_info->speed_capa = ETH_LINK_SPEED_1G |
+			ETH_LINK_SPEED_2_5G |
+			ETH_LINK_SPEED_10G;
+}
+
+static int
+dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev)
+{
+	struct dpaa2_dev_priv *priv = dev->data->dev_private;
+	uint16_t dist_idx;
+	uint32_t vq_id;
+	struct dpaa2_queue *mc_q, *mcq;
+	uint32_t tot_queues;
+	int i;
+	struct dpaa2_queue *dpaa2_q;
+
+	PMD_INIT_FUNC_TRACE();
+
+	tot_queues = priv->nb_rx_queues + priv->nb_tx_queues;
+	mc_q = rte_malloc(NULL, sizeof(struct dpaa2_queue) * tot_queues,
+			  RTE_CACHE_LINE_SIZE);
+	if (!mc_q) {
+		PMD_INIT_LOG(ERR, "malloc failed for rx/tx queues\n");
+		return -1;
+	}
+
+	for (i = 0; i < priv->nb_rx_queues; i++) {
+		mc_q->dev = dev;
+		priv->rx_vq[i] = mc_q++;
+		dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
+		dpaa2_q->q_storage = rte_malloc("dq_storage",
+					sizeof(struct queue_storage_info_t),
+					RTE_CACHE_LINE_SIZE);
+		if (!dpaa2_q->q_storage)
+			goto fail;
+
+		memset(dpaa2_q->q_storage, 0,
+		       sizeof(struct queue_storage_info_t));
+		dpaa2_q->q_storage->dq_storage[0] = rte_malloc(NULL,
+			DPAA2_DQRR_RING_SIZE * sizeof(struct qbman_result),
+			RTE_CACHE_LINE_SIZE);
+	}
+
+	for (i = 0; i < priv->nb_tx_queues; i++) {
+		mc_q->dev = dev;
+		mc_q->flow_id = DPNI_NEW_FLOW_ID;
+		priv->tx_vq[i] = mc_q++;
+	}
+
+	vq_id = 0;
+	for (dist_idx = 0; dist_idx < priv->nb_rx_queues; dist_idx++) {
+		mcq = (struct dpaa2_queue *)priv->rx_vq[vq_id];
+		mcq->tc_index = DPAA2_DEF_TC;
+		mcq->flow_id = dist_idx;
+		vq_id++;
+	}
+
+	return 0;
+fail:
+	i -= 1;
+	mc_q = priv->rx_vq[0];
+	while (i >= 0) {
+		dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
+		rte_free(dpaa2_q->q_storage->dq_storage[0]);
+		rte_free(dpaa2_q->q_storage);
+		priv->rx_vq[i--] = NULL;
+	}
+	rte_free(mc_q);
+	return -1;
+}
+
+static int
+dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
+{
+	struct rte_eth_dev_data *data = dev->data;
+	struct rte_eth_conf *eth_conf = &data->dev_conf;
+
+	PMD_INIT_FUNC_TRACE();
+
+	/* Check for correct configuration */
+	if (eth_conf->rxmode.mq_mode != ETH_MQ_RX_RSS &&
+	    data->nb_rx_queues > 1) {
+		PMD_INIT_LOG(ERR, "Distribution is not enabled, "
+			    "but Rx queues more than 1\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+/* Function to setup RX flow information. It contains traffic class ID,
+ * flow ID, destination configuration etc.
+ */
+static int
+dpaa2_dev_rx_queue_setup(struct rte_eth_dev *dev,
+			 uint16_t rx_queue_id,
+			 uint16_t nb_rx_desc __rte_unused,
+			 unsigned int socket_id __rte_unused,
+			 const struct rte_eth_rxconf *rx_conf __rte_unused,
+			 struct rte_mempool *mb_pool)
+{
+	struct dpaa2_dev_priv *priv = dev->data->dev_private;
+	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
+	struct dpaa2_queue *dpaa2_q;
+	struct dpni_queue cfg;
+	uint8_t options = 0;
+	uint8_t flow_id;
+	int ret;
+
+	PMD_INIT_FUNC_TRACE();
+
+	PMD_INIT_LOG(DEBUG, "dev =%p, queue =%d, pool = %p, conf =%p",
+		     dev, rx_queue_id, mb_pool, rx_conf);
+
+	dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[rx_queue_id];
+	dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */
+
+	/*Get the tc id and flow id from given VQ id*/
+	flow_id = rx_queue_id;
+	memset(&cfg, 0, sizeof(struct dpni_queue));
+
+	options = options | DPNI_QUEUE_OPT_USER_CTX;
+	cfg.user_context = (uint64_t)(dpaa2_q);
+
+	ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_RX,
+			     dpaa2_q->tc_index, flow_id, options, &cfg);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Error in setting the rx flow: = %d\n", ret);
+		return -1;
+	}
+
+	dev->data->rx_queues[rx_queue_id] = dpaa2_q;
+	return 0;
+}
+
+static int
+dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev,
+			 uint16_t tx_queue_id,
+			 uint16_t nb_tx_desc __rte_unused,
+			 unsigned int socket_id __rte_unused,
+			 const struct rte_eth_txconf *tx_conf __rte_unused)
+{
+	struct dpaa2_dev_priv *priv = dev->data->dev_private;
+	struct dpaa2_queue *dpaa2_q = (struct dpaa2_queue *)
+		priv->tx_vq[tx_queue_id];
+	struct fsl_mc_io *dpni = priv->hw;
+	struct dpni_queue tx_conf_cfg;
+	struct dpni_queue tx_flow_cfg;
+	uint8_t options = 0, flow_id;
+	uint32_t tc_id;
+	int ret;
+
+	PMD_INIT_FUNC_TRACE();
+
+	/* Return if queue already configured */
+	if (dpaa2_q->flow_id != DPNI_NEW_FLOW_ID)
+		return 0;
+
+	memset(&tx_conf_cfg, 0, sizeof(struct dpni_queue));
+	memset(&tx_flow_cfg, 0, sizeof(struct dpni_queue));
+
+	tc_id = 0;
+	flow_id = tx_queue_id;
+
+	ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_TX,
+			     tc_id, flow_id, options, &tx_flow_cfg);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Error in setting the tx flow: "
+			     "tc_id=%d, flow =%d ErrorCode = %x\n",
+			     tc_id, flow_id, -ret);
+			return -1;
+	}
+
+	dpaa2_q->flow_id = flow_id;
+
+	if (tx_queue_id == 0) {
+		/*Set tx-conf and error configuration*/
+		ret = dpni_set_tx_confirmation_mode(dpni, CMD_PRI_LOW,
+						    priv->token,
+						    DPNI_CONF_DISABLE);
+		if (ret) {
+			PMD_INIT_LOG(ERR, "Error in set tx conf mode settings"
+				     " ErrorCode = %x", ret);
+			return -1;
+		}
+	}
+	dpaa2_q->tc_index = tc_id;
+
+	dev->data->tx_queues[tx_queue_id] = dpaa2_q;
+	return 0;
+}
+
+static void
+dpaa2_dev_rx_queue_release(void *q __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+}
+
+static void
+dpaa2_dev_tx_queue_release(void *q __rte_unused)
+{
+	PMD_INIT_FUNC_TRACE();
+}
+
+static int
+dpaa2_dev_start(struct rte_eth_dev *dev)
+{
+	struct rte_eth_dev_data *data = dev->data;
+	struct dpaa2_dev_priv *priv = data->dev_private;
+	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
+	struct dpni_queue cfg;
+	uint16_t qdid;
+	struct dpni_queue_id qid;
+	struct dpaa2_queue *dpaa2_q;
+	int ret, i;
+
+	PMD_INIT_FUNC_TRACE();
+
+	ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failure %d in enabling dpni %d device\n",
+			     ret, priv->hw_id);
+		return ret;
+	}
+
+	ret = dpni_get_qdid(dpni, CMD_PRI_LOW, priv->token,
+			    DPNI_QUEUE_TX, &qdid);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Error to get qdid:ErrorCode = %d\n", ret);
+		return ret;
+	}
+	priv->qdid = qdid;
+
+	for (i = 0; i < data->nb_rx_queues; i++) {
+		dpaa2_q = (struct dpaa2_queue *)data->rx_queues[i];
+		ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token,
+				     DPNI_QUEUE_RX, dpaa2_q->tc_index,
+				       dpaa2_q->flow_id, &cfg, &qid);
+		if (ret) {
+			PMD_INIT_LOG(ERR, "Error to get flow "
+				     "information Error code = %d\n", ret);
+			return ret;
+		}
+		dpaa2_q->fqid = qid.fqid;
+	}
+
+	return 0;
+}
+
+/**
+ *  This routine disables all traffic on the adapter by issuing a
+ *  global reset on the MAC.
+ */
+static void
+dpaa2_dev_stop(struct rte_eth_dev *dev)
+{
+	struct dpaa2_dev_priv *priv = dev->data->dev_private;
+	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
+	int ret;
+
+	PMD_INIT_FUNC_TRACE();
+
+	ret = dpni_disable(dpni, CMD_PRI_LOW, priv->token);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failure (ret %d) in disabling dpni %d dev\n",
+			     ret, priv->hw_id);
+		return;
+	}
+}
+
+static void
+dpaa2_dev_close(struct rte_eth_dev *dev)
+{
+	struct dpaa2_dev_priv *priv = dev->data->dev_private;
+	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
+	int ret;
+
+	PMD_INIT_FUNC_TRACE();
+
+	/* Clean the device first */
+	ret = dpni_reset(dpni, CMD_PRI_LOW, priv->token);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failure cleaning dpni device with"
+			     " error code %d\n", ret);
+		return;
+	}
+}
+
+static struct eth_dev_ops dpaa2_ethdev_ops = {
+	.dev_configure	  = dpaa2_eth_dev_configure,
+	.dev_start	      = dpaa2_dev_start,
+	.dev_stop	      = dpaa2_dev_stop,
+	.dev_close	      = dpaa2_dev_close,
+	.dev_infos_get	   = dpaa2_dev_info_get,
+	.rx_queue_setup    = dpaa2_dev_rx_queue_setup,
+	.rx_queue_release  = dpaa2_dev_rx_queue_release,
+	.tx_queue_setup    = dpaa2_dev_tx_queue_setup,
+	.tx_queue_release  = dpaa2_dev_tx_queue_release,
+};
+
 static int
 dpaa2_dev_init(struct rte_eth_dev *eth_dev)
 {
+	struct rte_device *dev = eth_dev->device;
+	struct rte_dpaa2_device *dpaa2_dev;
+	struct fsl_mc_io *dpni_dev;
+	struct dpni_attr attr;
+	struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
+	int ret, hw_id;
+
 	PMD_INIT_FUNC_TRACE();
 
 	/* For secondary processes, the primary has done all the work */
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return 0;
 
+	dpaa2_dev = container_of(dev, struct rte_dpaa2_device, device);
+
+	hw_id = dpaa2_dev->object_id;
+
+	dpni_dev = (struct fsl_mc_io *)malloc(sizeof(struct fsl_mc_io));
+	if (!dpni_dev) {
+		PMD_INIT_LOG(ERR, "malloc failed for dpni device\n");
+		return -1;
+	}
+
+	dpni_dev->regs = rte_mcp_ptr_list[0];
+	ret = dpni_open(dpni_dev, CMD_PRI_LOW, hw_id, &priv->token);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failure in opening dpni@%d device with"
+			" error code %d\n", hw_id, ret);
+		return -1;
+	}
+
+	/* Clean the device first */
+	ret = dpni_reset(dpni_dev, CMD_PRI_LOW, priv->token);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failure cleaning dpni@%d device with"
+			" error code %d\n", hw_id, ret);
+		return -1;
+	}
+
+	ret = dpni_get_attributes(dpni_dev, CMD_PRI_LOW, priv->token, &attr);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failure in getting dpni@%d attribute, "
+			" error code %d\n", hw_id, ret);
+		return -1;
+	}
+
+	priv->num_tc = attr.num_tcs;
+	priv->nb_rx_queues = attr.num_queues;
+	priv->nb_tx_queues = attr.num_queues;
+
+	priv->hw = dpni_dev;
+	priv->hw_id = hw_id;
+	priv->flags = 0;
+
+	/* Allocate memory for hardware structure for queues */
+	ret = dpaa2_alloc_rx_tx_queues(eth_dev);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "dpaa2_alloc_rx_tx_queuesFailed\n");
+		return -ret;
+	}
+
+	eth_dev->dev_ops = &dpaa2_ethdev_ops;
 	eth_dev->data->drv_name = rte_dpaa2_pmd.driver.name;
 
 	return 0;
 }
 
 static int
-dpaa2_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused)
+dpaa2_dev_uninit(struct rte_eth_dev *eth_dev)
 {
+	struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
+	struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
+	int i, ret;
+	struct dpaa2_queue *dpaa2_q;
+
 	PMD_INIT_FUNC_TRACE();
 
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return -EPERM;
 
+	if (!dpni) {
+		PMD_INIT_LOG(WARNING, "Already closed or not started");
+		return -1;
+	}
+
+	dpaa2_dev_close(eth_dev);
+
+	if (priv->rx_vq[0]) {
+		/* cleaning up queue storage */
+		for (i = 0; i < priv->nb_rx_queues; i++) {
+			dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i];
+			if (dpaa2_q->q_storage)
+				rte_free(dpaa2_q->q_storage);
+		}
+		/*free the all queue memory */
+		rte_free(priv->rx_vq[0]);
+		priv->rx_vq[0] = NULL;
+	}
+
+
+	/*Close the device at underlying layer*/
+	ret = dpni_close(dpni, CMD_PRI_LOW, priv->token);
+	if (ret) {
+		PMD_INIT_LOG(ERR, "Failure closing dpni device with"
+			" error code %d\n", ret);
+	}
+
+	/*Free the allocated memory for ethernet private data and dpni*/
+	priv->hw = NULL;
+	free(dpni);
+
+	eth_dev->dev_ops = NULL;
+
 	return 0;
 }
 
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h
index 5778780..5f599a7 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.h
+++ b/drivers/net/dpaa2/dpaa2_ethdev.h
@@ -34,11 +34,26 @@
 #ifndef _DPAA2_ETHDEV_H
 #define _DPAA2_ETHDEV_H
 
+#include <mc/fsl_dpni.h>
+#include <mc/fsl_mc_sys.h>
+
+#define MAX_RX_QUEUES		16
+#define MAX_TX_QUEUES		16
+
+/*default tc to be used for ,congestion, distribution etc configuration. */
+#define DPAA2_DEF_TC		0
+
 struct dpaa2_dev_priv {
 	void *hw;
 	int32_t hw_id;
+	int32_t qdid;
 	uint16_t token;
+	uint8_t nb_tx_queues;
+	uint8_t nb_rx_queues;
+	void *rx_vq[MAX_RX_QUEUES];
+	void *tx_vq[MAX_TX_QUEUES];
 
+	uint8_t num_tc;
 	uint8_t flags; /*dpaa2 config flags */
 };
 #endif /* _DPAA2_ETHDEV_H */
-- 
1.9.1