From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 7A5B2455F3;
	Thu, 11 Jul 2024 14:08:39 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 3FC1942E83;
	Thu, 11 Jul 2024 14:08:00 +0200 (CEST)
Received: from egress-ip11b.ess.de.barracuda.com
 (egress-ip11b.ess.de.barracuda.com [18.185.115.215])
 by mails.dpdk.org (Postfix) with ESMTP id 9BC7C42E72
 for <dev@dpdk.org>; Thu, 11 Jul 2024 14:07:57 +0200 (CEST)
Received: from EUR05-VI1-obe.outbound.protection.outlook.com
 (mail-vi1eur05lp2169.outbound.protection.outlook.com [104.47.17.169]) by
 mx-outbound17-202.eu-central-1b.ess.aws.cudaops.com (version=TLSv1.2
 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO);
 Thu, 11 Jul 2024 12:07:55 +0000
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=L6EtnKiPR2Kmo8r4qBemOHai09RElGEJbtLiDbX1np4dmRoHCBN6rjVeWYh4SLZDhWZ2S3cfjxoeBXXjUc4fJ8+ELSsBOMSGir4Pnx9vksq8ifsIIv4vqLOG8Ur30Sccm6utThJ3c1adaGndJN1u7FNiXEIYBgdM1roJSqbCpuRiU+HsEVw0W7zYw0ndgld1DtCsITLXW7n+qoiDBbpR6Faq5ln8GFRwWIs2rHA17U0etN2CoYg5q9u6o6ZIpxmq4TLOk3oS9rSphIqhV5e/Hkj3rFPQiIvP+MCKjLal+v+W9eVRPF5KW9M1+HLeFYd5j2I/mS74FoovvcI10QZcMQ==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector10001;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;
 bh=0dVEHveiVKhx9PCIMjMaMNHhvGX9aiIW4NnW5GTMqNA=;
 b=L+nk+yL31NYwLVm3OkI4puKCe7Cv5zVJZYFonB/iJt+vLz3hmC8iQMhAczA0H+23hYI3jC2ADNwJdZixgR6RN6s6i2xx/h9yMwdqqhz+yq1S0R8inKoVlo3QkOXrU77B81LMWLmM2QeM5lGBXOijqRJMcCM07DU2zQ7kAyTEn8HFOWt5i3wBcTEaFigBVzrUl2ErMfNak4ZKkcXTNbeebSSZuxkedPn6P2QyZF7pGlBic1thfJpGVyJFTrciuFMly7cAuXDURAfMRfGe/8RH7GGtIiXjsJ9n6da17VKPcDuIIQrP/oESdMUggHMgleASByz+ZGd7WfRoiWQOsaTCkA==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=fail (sender ip is
 178.72.21.4) smtp.rcpttodomain=dpdk.org smtp.mailfrom=napatech.com;
 dmarc=fail (p=reject sp=reject pct=100) action=oreject
 header.from=napatech.com; dkim=none (message not signed); arc=none (0)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=napatech.com;
 s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=0dVEHveiVKhx9PCIMjMaMNHhvGX9aiIW4NnW5GTMqNA=;
 b=jjrGu+El3iDnbKg91PkGkNWtEQ6uJNebXKlAoZScAGhIqh7TcfkrxkHCRwdsuHdcSVbiMQW/buODGwBGDYGBWmqQRr79t3QCLFjCL0kEl4TP5QDPnqkX1LlWzZizEqEqn7/Wobyd/N62WiHb1rd8i1u3ZptnLx+31CkPa7RBDFs=
Received: from AS9PR04CA0096.eurprd04.prod.outlook.com (2603:10a6:20b:50e::26)
 by DB8P190MB0700.EURP190.PROD.OUTLOOK.COM (2603:10a6:10:123::24) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7762.20; Thu, 11 Jul
 2024 12:07:52 +0000
Received: from AMS0EPF0000019F.eurprd05.prod.outlook.com
 (2603:10a6:20b:50e:cafe::c1) by AS9PR04CA0096.outlook.office365.com
 (2603:10a6:20b:50e::26) with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7762.22 via Frontend
 Transport; Thu, 11 Jul 2024 12:07:52 +0000
X-MS-Exchange-Authentication-Results: spf=fail (sender IP is 178.72.21.4)
 smtp.mailfrom=napatech.com; dkim=none (message not signed)
 header.d=none;dmarc=fail action=oreject header.from=napatech.com;
Received-SPF: Fail (protection.outlook.com: domain of napatech.com does not
 designate 178.72.21.4 as permitted sender) receiver=protection.outlook.com;
 client-ip=178.72.21.4; helo=localhost.localdomain;
Received: from localhost.localdomain (178.72.21.4) by
 AMS0EPF0000019F.mail.protection.outlook.com (10.167.16.251) with Microsoft
 SMTP Server id 15.20.7762.17 via Frontend Transport; Thu, 11 Jul 2024
 12:07:52 +0000
From: Serhii Iliushyk <sil-plv@napatech.com>
To: dev@dpdk.org
Cc: mko-plv@napatech.com, sil-plv@napatech.com, ckm@napatech.com,
 andrew.rybchenko@oktetlabs.ru, ferruh.yigit@amd.com
Subject: [PATCH v6 08/21] net/ntnic: add adapter initialization
Date: Thu, 11 Jul 2024 14:07:19 +0200
Message-ID: <20240711120737.698176-8-sil-plv@napatech.com>
X-Mailer: git-send-email 2.45.0
In-Reply-To: <20240711120737.698176-1-sil-plv@napatech.com>
References: <20240530144929.4127931-1-sil-plv@napatech.com>
 <20240711120737.698176-1-sil-plv@napatech.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-EOPAttributedMessage: 0
X-MS-PublicTrafficType: Email
X-MS-TrafficTypeDiagnostic: AMS0EPF0000019F:EE_|DB8P190MB0700:EE_
Content-Type: text/plain
X-MS-Office365-Filtering-Correlation-Id: 5a790f0e-0a84-423b-31e3-08dca1a216f9
X-MS-Exchange-SenderADCheck: 1
X-MS-Exchange-AntiSpam-Relay: 0
X-Microsoft-Antispam: BCL:0;
 ARA:13230040|82310400026|36860700013|376014|1800799024; 
X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?2idLsLFkyotrAzGOHvjreZthRK2j+Yyy+JWd+R4sZFZHoP0Wivdudo7U1NMo?=
 =?us-ascii?Q?PlZ97efQQqR1IqhY+y7mOzE87/ez+udsJRsyoSbtlnvO0QYD+Qhm7A0agRiG?=
 =?us-ascii?Q?wA0fnv3rlHZmZgzb5y7Xz7QjZ7AwXHjYZKEYm7DiSSnRkKE+aWv8ztOzzCWY?=
 =?us-ascii?Q?yeKByp2DQmGRdqUmYPlOHXrvZWrR9CbcVtHw2uY7/VWb3qk+kngREktXj58w?=
 =?us-ascii?Q?n0Y4hGtV8MIRCxjAJiWWcQxCcA1IZYt/Rc+ECS5ti3/sz+MwV9VRZY86QskH?=
 =?us-ascii?Q?/x8oV66GElekthWLQ8AdRRZVpzKY6fxv0Ig35lqs0ViqiFFaV3WErvv/afHx?=
 =?us-ascii?Q?oBpszyYV3neeVESahqGqrW36API9icMly8kzO8WHSXDIgDCgzxSOJHrNEWdu?=
 =?us-ascii?Q?fnvNhqEhRXWxAhlZ+Ars7SU5tyEunIElxTYGRAWYe9QsdHWn4La/MV7o0zwu?=
 =?us-ascii?Q?CPhDsB58xNMGwhcYsDLcpFNY4uFSC6rx/mYkcg2lItT175uI2zgWcGfQXMkx?=
 =?us-ascii?Q?l3NJntdX/jUxP5351CuAUcBi0Mtvgc+4vbDiwfvHbMGB7vDlr8j8X9K0VfM0?=
 =?us-ascii?Q?0QiT41K2WmNE24p9ZOQk5mD0BPxuzT3TMXMzQgt0EbpbxoeDXQ06+fPMfr9Z?=
 =?us-ascii?Q?/lvmZtURwzJbe7vpWhi8YVX4q3XAJK+rMkuAI0wzT+qbZ15UybiDvlUHsfBV?=
 =?us-ascii?Q?oMH8gcz7ZuJgmX44S1AjAHOr6Fz0qTPIXnzXoLWaKhRgg7UhbtW96zxImXPm?=
 =?us-ascii?Q?0EI21ds1Z3AGTlXgZj+K78mn+1tApHjyidplbUDsz0oo3tWlpOIP8E1WiJ3M?=
 =?us-ascii?Q?dXSQrXZmDHoA94wRojd1s+7maziOnJQSR/wk+ByKlIcvbz6cQZOP4BQMyZFJ?=
 =?us-ascii?Q?XJSvRuu9hIsAml4ueeiZNoPX/Rv7HWzVlQTLPCCqm81i0+FEiefcoqeq/oyU?=
 =?us-ascii?Q?CIeXumMfPEewvFyYj/6xur7baUEnz19qHqx8/oyYTV/ja2XFs4lyQRH9KwcO?=
 =?us-ascii?Q?fANRCjwzz4TqElHG/8xG8hWcPT73b2ITVEIRuFBfXpuWa9HeLunlOhe9Cmi7?=
 =?us-ascii?Q?v8dylGjL37mWgLRfrTXqLA0t4e8d2WjOCu+39X0OYDSKRFyVmXruXKj8NCiC?=
 =?us-ascii?Q?NV10yKlUES1Z1qnWv2dunGD2Dr1393hySP6z0Nbs898TTyalCM8ofi3kGl/p?=
 =?us-ascii?Q?3c9oDq+FoWZJsKNdVW4vnNBBkbtAzay33PuhLyEiDl4eNGYwoGmHsf7Wooso?=
 =?us-ascii?Q?DBmIYc86Oy/BT35DgWwa5luX5NQ5QRczMUaQJ+4OL6qK2nTwcCYjuepyQrkC?=
 =?us-ascii?Q?x4jr2AO9kcrwyH4V11Y8MDwt0ooZ3xsoinsXpotTpl3JO5QzLMQpAFePqLO2?=
 =?us-ascii?Q?u7a30Z+3nuGNzwg+7VXXj4Nd4/jKF7SU/8CTOLhzFnYx21UVl6fDUBHonFCr?=
 =?us-ascii?Q?M2dakI9RTAZSPqXBkbOAG2IiMVH2r4A5?=
X-Forefront-Antispam-Report: CIP:178.72.21.4; CTRY:DK; LANG:en; SCL:1; SRV:;
 IPV:NLI; SFV:NSPM; H:localhost.localdomain; PTR:InfoDomainNonexistent;
 CAT:NONE; SFS:(13230040)(82310400026)(36860700013)(376014)(1800799024);
 DIR:OUT; SFP:1102; 
X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: XXl0dERSjzClQ9pRNawzZsM903qmY3Lske+FbLVkvTM2TIDde80qxrNVND719kbJRuvyZ6JZs2vGDtBLRbaXqcx9vhdKLjw2Zn1hEblWbj0EEUygUw2dXnFy7ecrdQPHjFRKrYNvSQJ21PPiub8DP7Ev0XM2LSb5qGcNkkR/iVKgDAY+2DpeJNRZcu7MVMtQUtMai8Q3a57X4pET0xK3bVPuj2G/KY9nCPsb+SwAhoH+nfRqeJwho2l/TFSqcD1cz/QDwGziJmElo1l2JmT9TyNMxropHzr8+bHp7cdhP1Vd2c7mKqmxKgPfRYzg1uLMyJswDzIR8RYYLZQeQLpBOKt6KDr1VQGznSU/gpRTD6nU99GQN5cdJ2dfdEFBI9DmDmFZUEqsYH22f4SgCrbNMxL5wNJd0isuHOYlHyjkW1g953f5NeO8SLt4Ftze3XCP26MsJv9gQzjH8II3K74IXBg6y3o0igzZWdI75XKF412OLoa8eUPhB2JA5jNPtDosB3/6f1hDndT57cGQsGuxTuXYy8c18Jr508B9fBdQhZMc8A2kIaIbrW9h2Ro++CpLxXj/HjxSAHqo3KI0O0Jslsj8NdwMPvZlEhHIvspOxTTPUaJLtPV/4QZ2lSDTTp0Afa61DMwBh9Ohc9ljKgj7jSfowQfmcUheu/E++BqQEcs=
X-OriginatorOrg: napatech.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jul 2024 12:07:52.0409 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: 5a790f0e-0a84-423b-31e3-08dca1a216f9
X-MS-Exchange-CrossTenant-Id: c4540d0b-728a-4233-9da5-9ea30c7ec3ed
X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=c4540d0b-728a-4233-9da5-9ea30c7ec3ed; Ip=[178.72.21.4];
 Helo=[localhost.localdomain]
X-MS-Exchange-CrossTenant-AuthSource: AMS0EPF0000019F.eurprd05.prod.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Anonymous
X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8P190MB0700
X-BESS-ID: 1720699673-304554-12681-23899-2
X-BESS-VER: 2019.1_20240702.1505
X-BESS-Apparent-Source-IP: 104.47.17.169
X-BESS-Parts: H4sIAAAAAAACA4uuVkqtKFGyUioBkjpK+cVKVoYmRiYmQGYGUNQ4JTnV2DzNJN
 EiydjA1NLCzDLRPCXVItE0KdncwtgiTak2FgDCRGuiQgAAAA==
X-BESS-Outbound-Spam-Score: 0.00
X-BESS-Outbound-Spam-Report: Code version 3.2,
 rules version 3.2.2.257551 [from 
 cloudscan10-69.eu-central-1a.ess.aws.cudaops.com]
 Rule breakdown below
 pts rule name              description
 ---- ---------------------- --------------------------------
 0.00 BSF_BESS_OUTBOUND      META: BESS Outbound 
X-BESS-Outbound-Spam-Status: SCORE=0.00 using account:ESS113687 scores of
 KILL_LEVEL=7.0 tests=BSF_BESS_OUTBOUND
X-BESS-BRTS-Status: 1
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

Add interfaces for initialize the adapter

Signed-off-by: Serhii Iliushyk <sil-plv@napatech.com>
---
v6
* Function for global var clearing was removed
---
 drivers/net/ntnic/adapter/nt4ga_adapter.c | 148 ++++++++++++++++++++++
 drivers/net/ntnic/include/nt4ga_adapter.h |  40 ++++++
 drivers/net/ntnic/include/ntdrv_4ga.h     |   2 +
 drivers/net/ntnic/meson.build             |   2 +
 drivers/net/ntnic/ntnic_ethdev.c          |  89 ++++++++++---
 drivers/net/ntnic/ntnic_mod_reg.c         |  20 +++
 drivers/net/ntnic/ntnic_mod_reg.h         |  27 ++++
 7 files changed, 310 insertions(+), 18 deletions(-)
 create mode 100644 drivers/net/ntnic/adapter/nt4ga_adapter.c
 create mode 100644 drivers/net/ntnic/include/nt4ga_adapter.h
 create mode 100644 drivers/net/ntnic/ntnic_mod_reg.c
 create mode 100644 drivers/net/ntnic/ntnic_mod_reg.h

diff --git a/drivers/net/ntnic/adapter/nt4ga_adapter.c b/drivers/net/ntnic/adapter/nt4ga_adapter.c
new file mode 100644
index 0000000000..7cc3841ecf
--- /dev/null
+++ b/drivers/net/ntnic/adapter/nt4ga_adapter.c
@@ -0,0 +1,148 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2023 Napatech A/S
+ */
+
+#include <rte_thread.h>
+
+#include "ntlog.h"
+#include "nt_util.h"
+#include "ntnic_mod_reg.h"
+
+static int nt4ga_adapter_show_info(struct adapter_info_s *p_adapter_info, FILE *pfh)
+{
+	const char *const p_dev_name = p_adapter_info->p_dev_name;
+	const char *const p_adapter_id_str = p_adapter_info->mp_adapter_id_str;
+	fpga_info_t *p_fpga_info = &p_adapter_info->fpga_info;
+	hw_info_t *p_hw_info = &p_adapter_info->hw_info;
+	char a_pci_ident_str[32];
+
+	snprintf(a_pci_ident_str, sizeof(a_pci_ident_str), PCIIDENT_PRINT_STR,
+		PCIIDENT_TO_DOMAIN(p_fpga_info->pciident),
+		PCIIDENT_TO_BUSNR(p_fpga_info->pciident),
+		PCIIDENT_TO_DEVNR(p_fpga_info->pciident),
+		PCIIDENT_TO_FUNCNR(p_fpga_info->pciident));
+
+	fprintf(pfh, "%s: DeviceName: %s\n", p_adapter_id_str, (p_dev_name ? p_dev_name : "NA"));
+	fprintf(pfh, "%s: PCI Details:\n", p_adapter_id_str);
+	fprintf(pfh, "%s: %s: %08X: %04X:%04X %04X:%04X\n", p_adapter_id_str, a_pci_ident_str,
+		p_fpga_info->pciident, p_hw_info->pci_vendor_id, p_hw_info->pci_device_id,
+		p_hw_info->pci_sub_vendor_id, p_hw_info->pci_sub_device_id);
+	fprintf(pfh, "%s: FPGA Details:\n", p_adapter_id_str);
+	fprintf(pfh, "%s: %03d-%04d-%02d-%02d [%016" PRIX64 "] (%08X)\n", p_adapter_id_str,
+		p_fpga_info->n_fpga_type_id, p_fpga_info->n_fpga_prod_id,
+		p_fpga_info->n_fpga_ver_id, p_fpga_info->n_fpga_rev_id, p_fpga_info->n_fpga_ident,
+		p_fpga_info->n_fpga_build_time);
+	fprintf(pfh, "%s: FpgaDebugMode=0x%x\n", p_adapter_id_str, p_fpga_info->n_fpga_debug_mode);
+	fprintf(pfh, "%s: Hw=0x%02X_rev%d: %s\n", p_adapter_id_str, p_hw_info->hw_platform_id,
+		p_fpga_info->nthw_hw_info.hw_id, p_fpga_info->nthw_hw_info.hw_plat_id_str);
+	fprintf(pfh, "%s: MCU Details:\n", p_adapter_id_str);
+
+
+	return 0;
+}
+
+static int nt4ga_adapter_init(struct adapter_info_s *p_adapter_info)
+{
+	char *const p_dev_name = malloc(24);
+	char *const p_adapter_id_str = malloc(24);
+	fpga_info_t *fpga_info = &p_adapter_info->fpga_info;
+	hw_info_t *p_hw_info = &p_adapter_info->hw_info;
+
+
+	p_hw_info->n_nthw_adapter_id = nthw_platform_get_nthw_adapter_id(p_hw_info->pci_device_id);
+
+	fpga_info->n_nthw_adapter_id = p_hw_info->n_nthw_adapter_id;
+	/* ref: DN-0060 section 9 */
+	p_hw_info->hw_product_type = p_hw_info->pci_device_id & 0x000f;
+	/* ref: DN-0060 section 9 */
+	p_hw_info->hw_platform_id = (p_hw_info->pci_device_id >> 4) & 0x00ff;
+	/* ref: DN-0060 section 9 */
+	p_hw_info->hw_reserved1 = (p_hw_info->pci_device_id >> 12) & 0x000f;
+
+	/* mp_dev_name */
+	p_adapter_info->p_dev_name = p_dev_name;
+
+	if (p_dev_name) {
+		snprintf(p_dev_name, 24, PCIIDENT_PRINT_STR,
+			PCIIDENT_TO_DOMAIN(p_adapter_info->fpga_info.pciident),
+			PCIIDENT_TO_BUSNR(p_adapter_info->fpga_info.pciident),
+			PCIIDENT_TO_DEVNR(p_adapter_info->fpga_info.pciident),
+			PCIIDENT_TO_FUNCNR(p_adapter_info->fpga_info.pciident));
+		NT_LOG(DBG, NTNIC, "%s: (0x%08X)\n", p_dev_name,
+			p_adapter_info->fpga_info.pciident);
+	}
+
+	/* mp_adapter_id_str */
+	p_adapter_info->mp_adapter_id_str = p_adapter_id_str;
+
+	p_adapter_info->fpga_info.mp_adapter_id_str = p_adapter_id_str;
+
+	if (p_adapter_id_str) {
+		snprintf(p_adapter_id_str, 24, "PCI:" PCIIDENT_PRINT_STR,
+			PCIIDENT_TO_DOMAIN(p_adapter_info->fpga_info.pciident),
+			PCIIDENT_TO_BUSNR(p_adapter_info->fpga_info.pciident),
+			PCIIDENT_TO_DEVNR(p_adapter_info->fpga_info.pciident),
+			PCIIDENT_TO_FUNCNR(p_adapter_info->fpga_info.pciident));
+		NT_LOG(DBG, NTNIC, "%s: %s\n", p_adapter_id_str, p_dev_name);
+	}
+
+	{
+		int i;
+
+		for (i = 0; i < (int)ARRAY_SIZE(p_adapter_info->mp_port_id_str); i++) {
+			char *p = malloc(32);
+
+			if (p) {
+				snprintf(p, 32, "%s:intf_%d",
+					(p_adapter_id_str ? p_adapter_id_str : "NA"), i);
+			}
+
+			p_adapter_info->mp_port_id_str[i] = p;
+		}
+	}
+
+	return 0;
+}
+
+static int nt4ga_adapter_deinit(struct adapter_info_s *p_adapter_info)
+{
+	fpga_info_t *fpga_info = &p_adapter_info->fpga_info;
+	int i;
+	int res = -1;
+
+
+	/* Free adapter port ident strings */
+	for (i = 0; i < fpga_info->n_phy_ports; i++) {
+		if (p_adapter_info->mp_port_id_str[i]) {
+			free(p_adapter_info->mp_port_id_str[i]);
+			p_adapter_info->mp_port_id_str[i] = NULL;
+		}
+	}
+
+	/* Free adapter ident string */
+	if (p_adapter_info->mp_adapter_id_str) {
+		free(p_adapter_info->mp_adapter_id_str);
+		p_adapter_info->mp_adapter_id_str = NULL;
+	}
+
+	/* Free devname ident string */
+	if (p_adapter_info->p_dev_name) {
+		free(p_adapter_info->p_dev_name);
+		p_adapter_info->p_dev_name = NULL;
+	}
+
+	return res;
+}
+
+static const struct adapter_ops ops = {
+	.init = nt4ga_adapter_init,
+	.deinit = nt4ga_adapter_deinit,
+
+	.show_info = nt4ga_adapter_show_info,
+};
+
+void adapter_init(void)
+{
+	register_adapter_ops(&ops);
+}
diff --git a/drivers/net/ntnic/include/nt4ga_adapter.h b/drivers/net/ntnic/include/nt4ga_adapter.h
new file mode 100644
index 0000000000..2c72583caf
--- /dev/null
+++ b/drivers/net/ntnic/include/nt4ga_adapter.h
@@ -0,0 +1,40 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2023 Napatech A/S
+ */
+
+#ifndef _NT4GA_ADAPTER_H_
+#define _NT4GA_ADAPTER_H_
+
+#include "ntos_drv.h"
+typedef struct hw_info_s {
+	/* pciids */
+	uint16_t pci_vendor_id;
+	uint16_t pci_device_id;
+	uint16_t pci_sub_vendor_id;
+	uint16_t pci_sub_device_id;
+	uint16_t pci_class_id;
+
+	/* Derived from pciid */
+	nthw_adapter_id_t n_nthw_adapter_id;
+	int hw_platform_id;
+	int hw_product_type;
+	int hw_reserved1;
+} hw_info_t;
+
+typedef struct adapter_info_s {
+	struct hw_info_s hw_info;
+	struct fpga_info_s fpga_info;
+
+	char *mp_port_id_str[NUM_ADAPTER_PORTS_MAX];
+	char *mp_adapter_id_str;
+	char *p_dev_name;
+	volatile bool *pb_shutdown;
+
+	int adapter_no;
+	int n_rx_host_buffers;
+	int n_tx_host_buffers;
+} adapter_info_t;
+
+
+#endif	/* _NT4GA_ADAPTER_H_ */
diff --git a/drivers/net/ntnic/include/ntdrv_4ga.h b/drivers/net/ntnic/include/ntdrv_4ga.h
index bcb7ddc242..8017aa4fc3 100644
--- a/drivers/net/ntnic/include/ntdrv_4ga.h
+++ b/drivers/net/ntnic/include/ntdrv_4ga.h
@@ -6,9 +6,11 @@
 #ifndef __NTDRV_4GA_H__
 #define __NTDRV_4GA_H__
 
+#include "nt4ga_adapter.h"
 
 typedef struct ntdrv_4ga_s {
 	uint32_t pciident;
+	struct adapter_info_s adapter_info;
 	char *p_drv_name;
 
 	volatile bool b_shutdown;
diff --git a/drivers/net/ntnic/meson.build b/drivers/net/ntnic/meson.build
index 73c4188da0..94f24e09e3 100644
--- a/drivers/net/ntnic/meson.build
+++ b/drivers/net/ntnic/meson.build
@@ -18,9 +18,11 @@ includes = [
 
 # all sources
 sources = files(
+    'adapter/nt4ga_adapter.c',
     'nthw/nthw_platform.c',
     'ntlog/ntlog.c',
     'ntutil/nt_util.c',
+    'ntnic_mod_reg.c',
     'ntnic_vfio.c',
     'ntnic_ethdev.c',
 )
diff --git a/drivers/net/ntnic/ntnic_ethdev.c b/drivers/net/ntnic/ntnic_ethdev.c
index 2a73162d6c..c84321ed91 100644
--- a/drivers/net/ntnic/ntnic_ethdev.c
+++ b/drivers/net/ntnic/ntnic_ethdev.c
@@ -19,6 +19,7 @@
 #include "ntos_drv.h"
 #include "ntos_system.h"
 #include "ntnic_vfio.h"
+#include "ntnic_mod_reg.h"
 #include "nt_util.h"
 
 #define EXCEPTION_PATH_HID 0
@@ -66,17 +67,6 @@ store_pdrv(struct drv_s *p_drv)
 	rte_spinlock_unlock(&hwlock);
 }
 
-static void
-clear_pdrv(struct drv_s *p_drv)
-{
-	if (p_drv->adapter_no > NUM_ADAPTER_MAX)
-		return;
-
-	rte_spinlock_lock(&hwlock);
-	_g_p_drv[p_drv->adapter_no] = NULL;
-	rte_spinlock_unlock(&hwlock);
-}
-
 static struct drv_s *
 get_pdrv_from_pci(struct rte_pci_addr addr)
 {
@@ -144,14 +134,20 @@ eth_dev_stop(struct rte_eth_dev *eth_dev)
 static void
 drv_deinit(struct drv_s *p_drv)
 {
+	const struct adapter_ops *adapter_ops = get_adapter_ops();
+
+	if (adapter_ops == NULL) {
+		NT_LOG(ERR, NTNIC, "Adapter module uninitialized\n");
+		return;
+	}
+
 	if (p_drv == NULL)
 		return;
-	/*
-	 * Mark the global pdrv for cleared. Used by some threads to terminate.
-	 * 1 second to give the threads a chance to see the termination.
-	 */
-	clear_pdrv(p_drv);
-	nt_os_wait_usec(1000000);
+
+	ntdrv_4ga_t *p_nt_drv = &p_drv->ntdrv;
+
+	/* stop adapter */
+	adapter_ops->deinit(&p_nt_drv->adapter_info);
 
 	/* clean memory */
 	rte_free(p_drv);
@@ -194,8 +190,17 @@ nthw_pci_dev_init(struct rte_pci_device *pci_dev)
 {
 	nt_vfio_init();
 
+	const struct adapter_ops *adapter_ops = get_adapter_ops();
+
+	if (adapter_ops == NULL) {
+		NT_LOG(ERR, NTNIC, "Adapter module uninitialized\n");
+		return -1;
+	}
+
 	struct drv_s *p_drv;
 	ntdrv_4ga_t *p_nt_drv;
+	hw_info_t *p_hw_info;
+	(void)p_hw_info;
 	uint32_t n_port_mask = -1;	/* All ports enabled by default */
 	uint32_t nb_rx_queues = 1;
 	uint32_t nb_tx_queues = 1;
@@ -227,30 +232,78 @@ nthw_pci_dev_init(struct rte_pci_device *pci_dev)
 
 	/* context */
 	p_nt_drv = &p_drv->ntdrv;
+	p_hw_info = &p_nt_drv->adapter_info.hw_info;
 
 	p_drv->p_dev = pci_dev;
 
 	/* Set context for NtDrv */
 	p_nt_drv->pciident = BDF_TO_PCIIDENT(pci_dev->addr.domain, pci_dev->addr.bus,
 			pci_dev->addr.devid, pci_dev->addr.function);
+	p_nt_drv->adapter_info.n_rx_host_buffers = nb_rx_queues;
+	p_nt_drv->adapter_info.n_tx_host_buffers = nb_tx_queues;
 
 
+	p_nt_drv->adapter_info.hw_info.pci_class_id = pci_dev->id.class_id;
+	p_nt_drv->adapter_info.hw_info.pci_vendor_id = pci_dev->id.vendor_id;
+	p_nt_drv->adapter_info.hw_info.pci_device_id = pci_dev->id.device_id;
+	p_nt_drv->adapter_info.hw_info.pci_sub_vendor_id = pci_dev->id.subsystem_vendor_id;
+	p_nt_drv->adapter_info.hw_info.pci_sub_device_id = pci_dev->id.subsystem_device_id;
+
+	NT_LOG(DBG, NTNIC, "%s: " PCIIDENT_PRINT_STR " %04X:%04X: %04X:%04X:\n",
+		p_nt_drv->adapter_info.mp_adapter_id_str, PCIIDENT_TO_DOMAIN(p_nt_drv->pciident),
+		PCIIDENT_TO_BUSNR(p_nt_drv->pciident), PCIIDENT_TO_DEVNR(p_nt_drv->pciident),
+		PCIIDENT_TO_FUNCNR(p_nt_drv->pciident),
+		p_nt_drv->adapter_info.hw_info.pci_vendor_id,
+		p_nt_drv->adapter_info.hw_info.pci_device_id,
+		p_nt_drv->adapter_info.hw_info.pci_sub_vendor_id,
+		p_nt_drv->adapter_info.hw_info.pci_sub_device_id);
+
 	p_nt_drv->b_shutdown = false;
+	p_nt_drv->adapter_info.pb_shutdown = &p_nt_drv->b_shutdown;
 
 	/* store context */
 	store_pdrv(p_drv);
 
+	/* initialize nt4ga nthw fpga module instance in drv */
+	int err = adapter_ops->init(&p_nt_drv->adapter_info);
+
+	if (err != 0) {
+		NT_LOG(ERR, NTNIC, "%s: Cannot initialize the adapter instance\n",
+			p_nt_drv->adapter_info.mp_adapter_id_str);
+		return -1;
+	}
+
+	/* Start ctrl, monitor, stat thread only for primary process. */
+	if (err == 0) {
+		/* mp_adapter_id_str is initialized after nt4ga_adapter_init(p_nt_drv) */
+		const char *const p_adapter_id_str = p_nt_drv->adapter_info.mp_adapter_id_str;
+		(void)p_adapter_id_str;
+
+	} else {
+		NT_LOG_DBGX(ERR, NTNIC, "%s: error=%d\n",
+			(pci_dev->name[0] ? pci_dev->name : "NA"), err);
+		return -1;
+	}
+
 	n_phy_ports = 0;
 
 	for (int n_intf_no = 0; n_intf_no < n_phy_ports; n_intf_no++) {
+		const char *const p_port_id_str = p_nt_drv->adapter_info.mp_port_id_str[n_intf_no];
+		(void)p_port_id_str;
 		struct pmd_internals *internals = NULL;
 		struct rte_eth_dev *eth_dev = NULL;
 		char name[32];
 
-		if ((1 << n_intf_no) & ~n_port_mask)
+		if ((1 << n_intf_no) & ~n_port_mask) {
+			NT_LOG_DBGX(DEBUG, NTNIC,
+				"%s: interface #%d: skipping due to portmask 0x%02X\n",
+				p_port_id_str, n_intf_no, n_port_mask);
 			continue;
+		}
 
 		snprintf(name, sizeof(name), "ntnic%d", n_intf_no);
+		NT_LOG_DBGX(DEBUG, NTNIC, "%s: interface #%d: %s: '%s'\n", p_port_id_str,
+			n_intf_no, (pci_dev->name[0] ? pci_dev->name : "NA"), name);
 
 		internals = rte_zmalloc_socket(name, sizeof(struct pmd_internals),
 				RTE_CACHE_LINE_SIZE, pci_dev->device.numa_node);
diff --git a/drivers/net/ntnic/ntnic_mod_reg.c b/drivers/net/ntnic/ntnic_mod_reg.c
new file mode 100644
index 0000000000..006221bbe3
--- /dev/null
+++ b/drivers/net/ntnic/ntnic_mod_reg.c
@@ -0,0 +1,20 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2023 Napatech A/S
+ */
+
+#include "ntnic_mod_reg.h"
+
+static const struct adapter_ops *adapter_ops;
+
+void register_adapter_ops(const struct adapter_ops *ops)
+{
+	adapter_ops = ops;
+}
+
+const struct adapter_ops *get_adapter_ops(void)
+{
+	if (adapter_ops == NULL)
+		adapter_init();
+	return adapter_ops;
+}
diff --git a/drivers/net/ntnic/ntnic_mod_reg.h b/drivers/net/ntnic/ntnic_mod_reg.h
new file mode 100644
index 0000000000..48a9f8f7b9
--- /dev/null
+++ b/drivers/net/ntnic/ntnic_mod_reg.h
@@ -0,0 +1,27 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2023 Napatech A/S
+ */
+
+#ifndef __NTNIC_MOD_REG_H__
+#define __NTNIC_MOD_REG_H__
+
+#include <stdint.h>
+#include "nthw_platform_drv.h"
+#include "nthw_drv.h"
+#include "nt4ga_adapter.h"
+#include "ntos_drv.h"
+
+struct adapter_ops {
+	int (*init)(struct adapter_info_s *p_adapter_info);
+	int (*deinit)(struct adapter_info_s *p_adapter_info);
+
+	int (*show_info)(struct adapter_info_s *p_adapter_info, FILE *pfh);
+};
+
+void register_adapter_ops(const struct adapter_ops *ops);
+const struct adapter_ops *get_adapter_ops(void);
+void adapter_init(void);
+
+
+#endif	/* __NTNIC_MOD_REG_H__ */
-- 
2.45.0