Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2165667/?format=api
{ "id": 2165667, "url": "http://patchwork.ozlabs.org/api/patches/2165667/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20251117134912.18566-14-larysa.zaremba@intel.com/", "project": { "id": 46, "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api", "name": "Intel Wired Ethernet development", "link_name": "intel-wired-lan", "list_id": "intel-wired-lan.osuosl.org", "list_email": "intel-wired-lan@osuosl.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20251117134912.18566-14-larysa.zaremba@intel.com>", "list_archive_url": null, "date": "2025-11-17T13:48:53", "name": "[iwl-next,v5,13/15] ixd: add reset checks and initialize the mailbox", "commit_ref": null, "pull_url": null, "state": "under-review", "archived": false, "hash": "10fe973cc0bf0fda9580883407248ff46b91d27d", "submitter": { "id": 84900, "url": "http://patchwork.ozlabs.org/api/people/84900/?format=api", "name": "Larysa Zaremba", "email": "larysa.zaremba@intel.com" }, "delegate": { "id": 109701, "url": "http://patchwork.ozlabs.org/api/users/109701/?format=api", "username": "anguy11", "first_name": "Anthony", "last_name": "Nguyen", "email": "anthony.l.nguyen@intel.com" }, "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20251117134912.18566-14-larysa.zaremba@intel.com/mbox/", "series": [ { "id": 482391, "url": "http://patchwork.ozlabs.org/api/series/482391/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/list/?series=482391", "date": "2025-11-17T13:48:40", "name": "Introduce iXD driver", "version": 5, "mbox": "http://patchwork.ozlabs.org/series/482391/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2165667/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2165667/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<intel-wired-lan-bounces@osuosl.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "intel-wired-lan@lists.osuosl.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=osuosl.org header.i=@osuosl.org header.a=rsa-sha256\n header.s=default header.b=kIsUsCo5;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=osuosl.org\n (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org;\n envelope-from=intel-wired-lan-bounces@osuosl.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4d98Hx6k79z1yDb\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 18 Nov 2025 00:49:49 +1100 (AEDT)", "from localhost (localhost [127.0.0.1])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id 7B9F081175;\n\tMon, 17 Nov 2025 13:49:48 +0000 (UTC)", "from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id fDmrxANFALTw; Mon, 17 Nov 2025 13:49:47 +0000 (UTC)", "from lists1.osuosl.org (lists1.osuosl.org [140.211.166.142])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id 7E478811A4;\n\tMon, 17 Nov 2025 13:49:47 +0000 (UTC)", "from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n by lists1.osuosl.org (Postfix) with ESMTP id 3C9C9D5\n for <intel-wired-lan@lists.osuosl.org>; Mon, 17 Nov 2025 13:49:46 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n by smtp3.osuosl.org (Postfix) with ESMTP id 22A4E60DD5\n for <intel-wired-lan@lists.osuosl.org>; Mon, 17 Nov 2025 13:49:46 +0000 (UTC)", "from smtp3.osuosl.org ([127.0.0.1])\n by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id LIS4TrmvJkil for <intel-wired-lan@lists.osuosl.org>;\n Mon, 17 Nov 2025 13:49:45 +0000 (UTC)", "from mgamail.intel.com (mgamail.intel.com [198.175.65.12])\n by smtp3.osuosl.org (Postfix) with ESMTPS id 86F5F60DD0\n for <intel-wired-lan@lists.osuosl.org>; Mon, 17 Nov 2025 13:49:44 +0000 (UTC)", "from fmviesa007.fm.intel.com ([10.60.135.147])\n by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 17 Nov 2025 05:49:44 -0800", "from irvmail002.ir.intel.com ([10.43.11.120])\n by fmviesa007.fm.intel.com with ESMTP; 17 Nov 2025 05:49:38 -0800", "from mglak.igk.intel.com (mglak.igk.intel.com [10.237.112.146])\n by irvmail002.ir.intel.com (Postfix) with ESMTP id 4F25337E3A;\n Mon, 17 Nov 2025 13:49:36 +0000 (GMT)" ], "X-Virus-Scanned": [ "amavis at osuosl.org", "amavis at osuosl.org" ], "X-Comment": "SPF check N/A for local connections - client-ip=140.211.166.142;\n helo=lists1.osuosl.org; envelope-from=intel-wired-lan-bounces@osuosl.org;\n receiver=<UNKNOWN> ", "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 smtp1.osuosl.org 7E478811A4", "OpenDKIM Filter v2.11.0 smtp3.osuosl.org 86F5F60DD0" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=osuosl.org;\n\ts=default; t=1763387387;\n\tbh=P5JH7nwmG4GOY+al+72JsQ0Dg+y4nHbLnAGyl0yQh5Y=;\n\th=From:To:Cc:Date:In-Reply-To:References:Subject:List-Id:\n\t List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe:\n\t From;\n\tb=kIsUsCo5v9O17aQq3w2zzOkRkCRxohCf3ttTvz5OttTAk80AJrzWakbEk0/MPhwKe\n\t n/jKpTHoa3Ocgk8QE3yDJ6ClB4fc7MAuJH80zqUmgAAmMlTbIAS/64KgBzSyV5XLGI\n\t Gvq0jJaehCLYld+3p8GyAvHXzuK3St3u9Mo9LTxdTXpxZI4PvBYM+DZJEgy+Mnl2RG\n\t 31wuJ6mXjQlmnGGrd2ogh8vvzlQfje1/6S+29DqGYthxvnjR9tLULWIb3o2Gk74XEf\n\t eGBDtt5bpdI5cAZtknFl4KtCqmXA2x8+i5t1zYt/wgvj6231Snfz0ioKi2zckcEYMe\n\t QSbPpBx6xa8Iw==", "Received-SPF": "Pass (mailfrom) identity=mailfrom; client-ip=198.175.65.12;\n helo=mgamail.intel.com; envelope-from=larysa.zaremba@intel.com;\n receiver=<UNKNOWN>", "DMARC-Filter": "OpenDMARC Filter v1.4.2 smtp3.osuosl.org 86F5F60DD0", "X-CSE-ConnectionGUID": [ "amjqrvPLSn608w4oN5fGFw==", "0TDJOshGS+O7Uc45j0xqgA==" ], "X-CSE-MsgGUID": [ "M0i4BOTiRACJh0sjmevhPw==", "soAGFZ9iROiTaJXF1vBwWQ==" ], "X-IronPort-AV": [ "E=McAfee;i=\"6800,10657,11616\"; a=\"76846198\"", "E=Sophos;i=\"6.19,311,1754982000\"; d=\"scan'208\";a=\"76846198\"", "E=Sophos;i=\"6.19,311,1754982000\"; d=\"scan'208\";a=\"190115774\"" ], "X-ExtLoop1": "1", "From": "Larysa Zaremba <larysa.zaremba@intel.com>", "To": "intel-wired-lan@lists.osuosl.org, Tony Nguyen <anthony.l.nguyen@intel.com>", "Cc": "aleksander.lobakin@intel.com, sridhar.samudrala@intel.com,\n \"Singhai, Anjali\" <anjali.singhai@intel.com>,\n Michal Swiatkowski <michal.swiatkowski@linux.intel.com>,\n Larysa Zaremba <larysa.zaremba@intel.com>,\n \"Fijalkowski, Maciej\" <maciej.fijalkowski@intel.com>,\n Emil Tantilov <emil.s.tantilov@intel.com>,\n Madhu Chittim <madhu.chittim@intel.com>, Josh Hay <joshua.a.hay@intel.com>,\n \"Keller, Jacob E\" <jacob.e.keller@intel.com>,\n jayaprakash.shanmugam@intel.com, natalia.wochtman@intel.com,\n Jiri Pirko <jiri@resnulli.us>, \"David S. Miller\" <davem@davemloft.net>,\n Eric Dumazet <edumazet@google.com>, Jakub Kicinski <kuba@kernel.org>,\n Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,\n Jonathan Corbet <corbet@lwn.net>,\n Richard Cochran <richardcochran@gmail.com>,\n Przemek Kitszel <przemyslaw.kitszel@intel.com>,\n Andrew Lunn <andrew+netdev@lunn.ch>, netdev@vger.kernel.org,\n linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org", "Date": "Mon, 17 Nov 2025 14:48:53 +0100", "Message-ID": "<20251117134912.18566-14-larysa.zaremba@intel.com>", "X-Mailer": "git-send-email 2.47.0", "In-Reply-To": "<20251117134912.18566-1-larysa.zaremba@intel.com>", "References": "<20251117134912.18566-1-larysa.zaremba@intel.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-Mailman-Original-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1763387385; x=1794923385;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=p+H3R478rp2wtJbokh56/OGK8O72WV/GcdULLfeL7AA=;\n b=RmbWwCPkCB4D0/2OG5nmkJ2T4PV9Zd3iWYutpYopTXdGsWUB+EaSlK3p\n 9+m+k7Za4tAh4NqBv899qU2/tuDevPZ5hLY494zgD3WOLyZxzseFNYv2Q\n IRPIIhKPZy757ICMo2SwfRVzJUzZpnWu+EQIg9Kl2lGk3K8d7JqLIgGzi\n Qmp6pdu2bJWt43w9hipC3LPwVU8Ih6qtWLgQGhILrn9CmKqZLYJwqR/KC\n JY5CFbW66EyxBCfGM9fMEtphWHBPNUrcnVH8AU2FPxqeDvx8dqoSodSYY\n XKK/hroaOvow1XbWGij/ADF8Ei7k+aS6Jr45HujDjFGHGzb8e8Canz3uO\n g==;", "X-Mailman-Original-Authentication-Results": [ "smtp3.osuosl.org;\n dmarc=pass (p=none dis=none)\n header.from=intel.com", "smtp3.osuosl.org;\n dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com\n header.a=rsa-sha256 header.s=Intel header.b=RmbWwCPk" ], "Subject": "[Intel-wired-lan] [PATCH iwl-next v5 13/15] ixd: add reset checks\n and initialize the mailbox", "X-BeenThere": "intel-wired-lan@osuosl.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n <intel-wired-lan.osuosl.org>", "List-Unsubscribe": "<https://lists.osuosl.org/mailman/options/intel-wired-lan>,\n <mailto:intel-wired-lan-request@osuosl.org?subject=unsubscribe>", "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>", "List-Post": "<mailto:intel-wired-lan@osuosl.org>", "List-Help": "<mailto:intel-wired-lan-request@osuosl.org?subject=help>", "List-Subscribe": "<https://lists.osuosl.org/mailman/listinfo/intel-wired-lan>,\n <mailto:intel-wired-lan-request@osuosl.org?subject=subscribe>", "Errors-To": "intel-wired-lan-bounces@osuosl.org", "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@osuosl.org>" }, "content": "At the end of the probe, trigger hard reset, initialize and schedule the\nafter-reset task. If the reset is complete in a pre-determined time,\ninitialize the default mailbox, through which other resources will be\nnegotiated.\n\nCo-developed-by: Amritha Nambiar <amritha.nambiar@intel.com>\nSigned-off-by: Amritha Nambiar <amritha.nambiar@intel.com>\nReviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>\nSigned-off-by: Larysa Zaremba <larysa.zaremba@intel.com>\n---\n drivers/net/ethernet/intel/ixd/Kconfig | 1 +\n drivers/net/ethernet/intel/ixd/Makefile | 2 +\n drivers/net/ethernet/intel/ixd/ixd.h | 28 +++-\n drivers/net/ethernet/intel/ixd/ixd_dev.c | 89 +++++++++++\n drivers/net/ethernet/intel/ixd/ixd_lan_regs.h | 40 +++++\n drivers/net/ethernet/intel/ixd/ixd_lib.c | 143 ++++++++++++++++++\n drivers/net/ethernet/intel/ixd/ixd_main.c | 32 +++-\n 7 files changed, 326 insertions(+), 9 deletions(-)\n create mode 100644 drivers/net/ethernet/intel/ixd/ixd_dev.c\n create mode 100644 drivers/net/ethernet/intel/ixd/ixd_lib.c", "diff": "diff --git a/drivers/net/ethernet/intel/ixd/Kconfig b/drivers/net/ethernet/intel/ixd/Kconfig\nindex f5594efe292c..24510c50070e 100644\n--- a/drivers/net/ethernet/intel/ixd/Kconfig\n+++ b/drivers/net/ethernet/intel/ixd/Kconfig\n@@ -5,6 +5,7 @@ config IXD\n \ttristate \"Intel(R) Control Plane Function Support\"\n \tdepends on PCI_MSI\n \tselect LIBETH\n+\tselect LIBIE_CP\n \tselect LIBIE_PCI\n \thelp\n \t This driver supports Intel(R) Control Plane PCI Function\ndiff --git a/drivers/net/ethernet/intel/ixd/Makefile b/drivers/net/ethernet/intel/ixd/Makefile\nindex 3849bc240600..164b2c86952f 100644\n--- a/drivers/net/ethernet/intel/ixd/Makefile\n+++ b/drivers/net/ethernet/intel/ixd/Makefile\n@@ -6,3 +6,5 @@\n obj-$(CONFIG_IXD) += ixd.o\n \n ixd-y := ixd_main.o\n+ixd-y += ixd_dev.o\n+ixd-y += ixd_lib.o\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd.h b/drivers/net/ethernet/intel/ixd/ixd.h\nindex d813c27941a5..99c44f2aa659 100644\n--- a/drivers/net/ethernet/intel/ixd/ixd.h\n+++ b/drivers/net/ethernet/intel/ixd/ixd.h\n@@ -4,14 +4,25 @@\n #ifndef _IXD_H_\n #define _IXD_H_\n \n-#include <linux/intel/libie/pci.h>\n+#include <linux/intel/libie/controlq.h>\n \n /**\n * struct ixd_adapter - Data structure representing a CPF\n- * @hw: Device access data\n+ * @cp_ctx: Control plane communication context\n+ * @init_task: Delayed initialization after reset\n+ * @xnm: virtchnl transaction manager\n+ * @asq: Send control queue info\n+ * @arq: Receive control queue info\n */\n struct ixd_adapter {\n-\tstruct libie_mmio_info hw;\n+\tstruct libie_ctlq_ctx cp_ctx;\n+\tstruct {\n+\t\tstruct delayed_work init_work;\n+\t\tu8 reset_retries;\n+\t} init_task;\n+\tstruct libie_ctlq_xn_manager *xnm;\n+\tstruct libie_ctlq_info *asq;\n+\tstruct libie_ctlq_info *arq;\n };\n \n /**\n@@ -22,7 +33,16 @@ struct ixd_adapter {\n */\n static inline struct device *ixd_to_dev(struct ixd_adapter *adapter)\n {\n-\treturn &adapter->hw.pdev->dev;\n+\treturn &adapter->cp_ctx.mmio_info.pdev->dev;\n }\n \n+void ixd_ctlq_reg_init(struct ixd_adapter *adapter,\n+\t\t struct libie_ctlq_reg *ctlq_reg_tx,\n+\t\t struct libie_ctlq_reg *ctlq_reg_rx);\n+void ixd_trigger_reset(struct ixd_adapter *adapter);\n+bool ixd_check_reset_complete(struct ixd_adapter *adapter);\n+void ixd_init_task(struct work_struct *work);\n+int ixd_init_dflt_mbx(struct ixd_adapter *adapter);\n+void ixd_deinit_dflt_mbx(struct ixd_adapter *adapter);\n+\n #endif /* _IXD_H_ */\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_dev.c b/drivers/net/ethernet/intel/ixd/ixd_dev.c\nnew file mode 100644\nindex 000000000000..6c41a820eecc\n--- /dev/null\n+++ b/drivers/net/ethernet/intel/ixd/ixd_dev.c\n@@ -0,0 +1,89 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/* Copyright (C) 2025 Intel Corporation */\n+\n+#include \"ixd.h\"\n+#include \"ixd_lan_regs.h\"\n+\n+/**\n+ * ixd_ctlq_reg_init - Initialize default mailbox registers\n+ * @adapter: PCI device driver-specific private data\n+ * @ctlq_reg_tx: Transmit queue registers info to be filled\n+ * @ctlq_reg_rx: Receive queue registers info to be filled\n+ */\n+void ixd_ctlq_reg_init(struct ixd_adapter *adapter,\n+\t\t struct libie_ctlq_reg *ctlq_reg_tx,\n+\t\t struct libie_ctlq_reg *ctlq_reg_rx)\n+{\n+\tstruct libie_mmio_info *mmio_info = &adapter->cp_ctx.mmio_info;\n+\t*ctlq_reg_tx = (struct libie_ctlq_reg) {\n+\t\t.head = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQH),\n+\t\t.tail = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQT),\n+\t\t.len = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQLEN),\n+\t\t.addr_high = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQBAH),\n+\t\t.addr_low = libie_pci_get_mmio_addr(mmio_info, PF_FW_ATQBAL),\n+\t\t.len_mask = PF_FW_ATQLEN_ATQLEN_M,\n+\t\t.len_ena_mask = PF_FW_ATQLEN_ATQENABLE_M,\n+\t\t.head_mask = PF_FW_ATQH_ATQH_M,\n+\t};\n+\n+\t*ctlq_reg_rx = (struct libie_ctlq_reg) {\n+\t\t.head = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQH),\n+\t\t.tail = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQT),\n+\t\t.len = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQLEN),\n+\t\t.addr_high = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQBAH),\n+\t\t.addr_low = libie_pci_get_mmio_addr(mmio_info, PF_FW_ARQBAL),\n+\t\t.len_mask = PF_FW_ARQLEN_ARQLEN_M,\n+\t\t.len_ena_mask = PF_FW_ARQLEN_ARQENABLE_M,\n+\t\t.head_mask = PF_FW_ARQH_ARQH_M,\n+\t};\n+}\n+\n+static const struct ixd_reset_reg ixd_reset_reg = {\n+\t.rstat = PFGEN_RSTAT,\n+\t.rstat_m = PFGEN_RSTAT_PFR_STATE_M,\n+\t.rstat_ok_v = 0b01,\n+\t.rtrigger = PFGEN_CTRL,\n+\t.rtrigger_m = PFGEN_CTRL_PFSWR,\n+};\n+\n+/**\n+ * ixd_trigger_reset - Trigger PFR reset\n+ * @adapter: the device with mapped reset register\n+ */\n+void ixd_trigger_reset(struct ixd_adapter *adapter)\n+{\n+\tvoid __iomem *addr;\n+\tu32 reg_val;\n+\n+\taddr = libie_pci_get_mmio_addr(&adapter->cp_ctx.mmio_info,\n+\t\t\t\t ixd_reset_reg.rtrigger);\n+\treg_val = readl(addr);\n+\twritel(reg_val | ixd_reset_reg.rtrigger_m, addr);\n+}\n+\n+/**\n+ * ixd_check_reset_complete - Check if the PFR reset is completed\n+ * @adapter: CPF being reset\n+ *\n+ * Return: %true if the register read indicates reset has been finished,\n+ *\t %false otherwise\n+ */\n+bool ixd_check_reset_complete(struct ixd_adapter *adapter)\n+{\n+\tu32 reg_val, reset_status;\n+\tvoid __iomem *addr;\n+\n+\taddr = libie_pci_get_mmio_addr(&adapter->cp_ctx.mmio_info,\n+\t\t\t\t ixd_reset_reg.rstat);\n+\treg_val = readl(addr);\n+\treset_status = reg_val & ixd_reset_reg.rstat_m;\n+\n+\t/* 0xFFFFFFFF might be read if the other side hasn't cleared\n+\t * the register for us yet.\n+\t */\n+\tif (reg_val != 0xFFFFFFFF &&\n+\t reset_status == ixd_reset_reg.rstat_ok_v)\n+\t\treturn true;\n+\n+\treturn false;\n+}\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_lan_regs.h b/drivers/net/ethernet/intel/ixd/ixd_lan_regs.h\nindex a991eaa8a2aa..26b1e3cfcf20 100644\n--- a/drivers/net/ethernet/intel/ixd/ixd_lan_regs.h\n+++ b/drivers/net/ethernet/intel/ixd/ixd_lan_regs.h\n@@ -11,9 +11,33 @@\n #define PF_FW_MBX_REG_LEN\t\t4096\n #define PF_FW_MBX\t\t\t0x08400000\n \n+#define PF_FW_ARQBAL\t\t\t(PF_FW_MBX)\n+#define PF_FW_ARQBAH\t\t\t(PF_FW_MBX + 0x4)\n+#define PF_FW_ARQLEN\t\t\t(PF_FW_MBX + 0x8)\n+#define PF_FW_ARQLEN_ARQLEN_M\t\tGENMASK(12, 0)\n+#define PF_FW_ARQLEN_ARQENABLE_S\t31\n+#define PF_FW_ARQLEN_ARQENABLE_M\tBIT(PF_FW_ARQLEN_ARQENABLE_S)\n+#define PF_FW_ARQH_ARQH_M\t\tGENMASK(12, 0)\n+#define PF_FW_ARQH\t\t\t(PF_FW_MBX + 0xC)\n+#define PF_FW_ARQT\t\t\t(PF_FW_MBX + 0x10)\n+\n+#define PF_FW_ATQBAL\t\t\t(PF_FW_MBX + 0x14)\n+#define PF_FW_ATQBAH\t\t\t(PF_FW_MBX + 0x18)\n+#define PF_FW_ATQLEN\t\t\t(PF_FW_MBX + 0x1C)\n+#define PF_FW_ATQLEN_ATQLEN_M\t\tGENMASK(9, 0)\n+#define PF_FW_ATQLEN_ATQENABLE_S\t31\n+#define PF_FW_ATQLEN_ATQENABLE_M\tBIT(PF_FW_ATQLEN_ATQENABLE_S)\n+#define PF_FW_ATQH_ATQH_M\t\tGENMASK(9, 0)\n+#define PF_FW_ATQH\t\t\t(PF_FW_MBX + 0x20)\n+#define PF_FW_ATQT\t\t\t(PF_FW_MBX + 0x24)\n+\n /* Reset registers */\n #define PFGEN_RTRIG_REG_LEN\t\t2048\n #define PFGEN_RTRIG\t\t\t0x08407000\t/* Device resets */\n+#define PFGEN_RSTAT\t\t\t0x08407008\t/* PFR status */\n+#define PFGEN_RSTAT_PFR_STATE_M\t\tGENMASK(1, 0)\n+#define PFGEN_CTRL\t\t\t0x0840700C\t/* PFR trigger */\n+#define PFGEN_CTRL_PFSWR\t\tBIT(0)\n \n /**\n * struct ixd_bar_region - BAR region description\n@@ -25,4 +49,20 @@ struct ixd_bar_region {\n \tresource_size_t size;\n };\n \n+/**\n+ * struct ixd_reset_reg - structure for reset registers\n+ * @rstat: offset of status in register\n+ * @rstat_m: status mask\n+ * @rstat_ok_v: value that indicates PFR completed status\n+ * @rtrigger: offset of reset trigger in register\n+ * @rtrigger_m: reset trigger mask\n+ */\n+struct ixd_reset_reg {\n+\tu32\trstat;\n+\tu32\trstat_m;\n+\tu32\trstat_ok_v;\n+\tu32\trtrigger;\n+\tu32\trtrigger_m;\n+};\n+\n #endif /* _IXD_LAN_REGS_H_ */\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_lib.c b/drivers/net/ethernet/intel/ixd/ixd_lib.c\nnew file mode 100644\nindex 000000000000..b8dd5c4de7b2\n--- /dev/null\n+++ b/drivers/net/ethernet/intel/ixd/ixd_lib.c\n@@ -0,0 +1,143 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/* Copyright (C) 2025 Intel Corporation */\n+\n+#include \"ixd.h\"\n+\n+#define IXD_DFLT_MBX_Q_LEN 64\n+\n+/**\n+ * ixd_init_ctlq_create_info - Initialize control queue info for creation\n+ * @info: destination\n+ * @type: type of the queue to create\n+ * @ctlq_reg: register assigned to the control queue\n+ */\n+static void ixd_init_ctlq_create_info(struct libie_ctlq_create_info *info,\n+\t\t\t\t enum virtchnl2_queue_type type,\n+\t\t\t\t const struct libie_ctlq_reg *ctlq_reg)\n+{\n+\t*info = (struct libie_ctlq_create_info) {\n+\t\t.type = type,\n+\t\t.id = -1,\n+\t\t.reg = *ctlq_reg,\n+\t\t.len = IXD_DFLT_MBX_Q_LEN,\n+\t};\n+}\n+\n+/**\n+ * ixd_init_libie_xn_params - Initialize xn transaction manager creation info\n+ * @params: destination\n+ * @adapter: adapter info struct\n+ * @ctlqs: list of the managed queues to create\n+ * @num_queues: length of the queue list\n+ */\n+static void ixd_init_libie_xn_params(struct libie_ctlq_xn_init_params *params,\n+\t\t\t\t struct ixd_adapter *adapter,\n+\t\t\t\t struct libie_ctlq_create_info *ctlqs,\n+\t\t\t\t uint num_queues)\n+{\n+\t*params = (struct libie_ctlq_xn_init_params){\n+\t\t.cctlq_info = ctlqs,\n+\t\t.ctx = &adapter->cp_ctx,\n+\t\t.num_qs = num_queues,\n+\t};\n+}\n+\n+/**\n+ * ixd_adapter_fill_dflt_ctlqs - Find default control queues and store them\n+ * @adapter: adapter info struct\n+ */\n+static void ixd_adapter_fill_dflt_ctlqs(struct ixd_adapter *adapter)\n+{\n+\tguard(spinlock)(&adapter->cp_ctx.ctlqs_lock);\n+\tstruct libie_ctlq_info *cq;\n+\n+\tlist_for_each_entry(cq, &adapter->cp_ctx.ctlqs, list) {\n+\t\tif (cq->qid != -1)\n+\t\t\tcontinue;\n+\t\tif (cq->type == VIRTCHNL2_QUEUE_TYPE_RX)\n+\t\t\tadapter->arq = cq;\n+\t\telse if (cq->type == VIRTCHNL2_QUEUE_TYPE_TX)\n+\t\t\tadapter->asq = cq;\n+\t}\n+}\n+\n+/**\n+ * ixd_init_dflt_mbx - Setup default mailbox parameters and make request\n+ * @adapter: adapter info struct\n+ *\n+ * Return: %0 on success, negative errno code on failure\n+ */\n+int ixd_init_dflt_mbx(struct ixd_adapter *adapter)\n+{\n+\tstruct libie_ctlq_create_info ctlqs_info[2];\n+\tstruct libie_ctlq_xn_init_params xn_params;\n+\tstruct libie_ctlq_reg ctlq_reg_tx;\n+\tstruct libie_ctlq_reg ctlq_reg_rx;\n+\tint err;\n+\n+\tixd_ctlq_reg_init(adapter, &ctlq_reg_tx, &ctlq_reg_rx);\n+\tixd_init_ctlq_create_info(&ctlqs_info[0], VIRTCHNL2_QUEUE_TYPE_TX,\n+\t\t\t\t &ctlq_reg_tx);\n+\tixd_init_ctlq_create_info(&ctlqs_info[1], VIRTCHNL2_QUEUE_TYPE_RX,\n+\t\t\t\t &ctlq_reg_rx);\n+\tixd_init_libie_xn_params(&xn_params, adapter, ctlqs_info,\n+\t\t\t\t ARRAY_SIZE(ctlqs_info));\n+\terr = libie_ctlq_xn_init(&xn_params);\n+\tif (err)\n+\t\treturn err;\n+\tadapter->xnm = xn_params.xnm;\n+\n+\tixd_adapter_fill_dflt_ctlqs(adapter);\n+\n+\tif (!adapter->asq || !adapter->arq) {\n+\t\tlibie_ctlq_xn_deinit(adapter->xnm, &adapter->cp_ctx);\n+\t\treturn -ENOENT;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * ixd_deinit_dflt_mbx - Deinitialize default mailbox\n+ * @adapter: adapter info struct\n+ */\n+void ixd_deinit_dflt_mbx(struct ixd_adapter *adapter)\n+{\n+\tif (adapter->arq || adapter->asq)\n+\t\tlibie_ctlq_xn_deinit(adapter->xnm, &adapter->cp_ctx);\n+\n+\tadapter->arq = NULL;\n+\tadapter->asq = NULL;\n+\tadapter->xnm = NULL;\n+}\n+\n+/**\n+ * ixd_init_task - Initialize after reset\n+ * @work: init work struct\n+ */\n+void ixd_init_task(struct work_struct *work)\n+{\n+\tstruct ixd_adapter *adapter;\n+\tint err;\n+\n+\tadapter = container_of(work, struct ixd_adapter,\n+\t\t\t init_task.init_work.work);\n+\n+\tif (!ixd_check_reset_complete(adapter)) {\n+\t\tif (++adapter->init_task.reset_retries < 10)\n+\t\t\tqueue_delayed_work(system_unbound_wq,\n+\t\t\t\t\t &adapter->init_task.init_work,\n+\t\t\t\t\t msecs_to_jiffies(500));\n+\t\telse\n+\t\t\tdev_err(ixd_to_dev(adapter),\n+\t\t\t\t\"Device reset failed. The driver was unable to contact the device's firmware. Check that the FW is running.\\n\");\n+\t\treturn;\n+\t}\n+\n+\tadapter->init_task.reset_retries = 0;\n+\terr = ixd_init_dflt_mbx(adapter);\n+\tif (err)\n+\t\tdev_err(ixd_to_dev(adapter),\n+\t\t\t\"Failed to initialize the default mailbox: %pe\\n\",\n+\t\t\tERR_PTR(err));\n+}\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_main.c b/drivers/net/ethernet/intel/ixd/ixd_main.c\nindex 75ee53152e61..b4d4000b63ed 100644\n--- a/drivers/net/ethernet/intel/ixd/ixd_main.c\n+++ b/drivers/net/ethernet/intel/ixd/ixd_main.c\n@@ -5,6 +5,7 @@\n #include \"ixd_lan_regs.h\"\n \n MODULE_DESCRIPTION(\"Intel(R) Control Plane Function Device Driver\");\n+MODULE_IMPORT_NS(\"LIBIE_CP\");\n MODULE_IMPORT_NS(\"LIBIE_PCI\");\n MODULE_LICENSE(\"GPL\");\n \n@@ -16,7 +17,13 @@ static void ixd_remove(struct pci_dev *pdev)\n {\n \tstruct ixd_adapter *adapter = pci_get_drvdata(pdev);\n \n-\tlibie_pci_unmap_all_mmio_regions(&adapter->hw);\n+\t/* Do not mix removal with (re)initialization */\n+\tcancel_delayed_work_sync(&adapter->init_task.init_work);\n+\t/* Leave the device clean on exit */\n+\tixd_trigger_reset(adapter);\n+\tixd_deinit_dflt_mbx(adapter);\n+\n+\tlibie_pci_unmap_all_mmio_regions(&adapter->cp_ctx.mmio_info);\n }\n \n /**\n@@ -51,7 +58,7 @@ static int ixd_iomap_regions(struct ixd_adapter *adapter)\n \t};\n \n \tfor (int i = 0; i < ARRAY_SIZE(regions); i++) {\n-\t\tstruct libie_mmio_info *mmio_info = &adapter->hw;\n+\t\tstruct libie_mmio_info *mmio_info = &adapter->cp_ctx.mmio_info;\n \t\tbool map_ok;\n \n \t\tmap_ok = libie_pci_map_mmio_region(mmio_info,\n@@ -81,11 +88,15 @@ static int ixd_probe(struct pci_dev *pdev, const struct pci_device_id *ent)\n \tstruct ixd_adapter *adapter;\n \tint err;\n \n+\tif (WARN_ON(ent->device != IXD_DEV_ID_CPF))\n+\t\treturn -EINVAL;\n+\n \tadapter = devm_kzalloc(&pdev->dev, sizeof(*adapter), GFP_KERNEL);\n \tif (!adapter)\n \t\treturn -ENOMEM;\n-\tadapter->hw.pdev = pdev;\n-\tINIT_LIST_HEAD(&adapter->hw.mmio_list);\n+\n+\tadapter->cp_ctx.mmio_info.pdev = pdev;\n+\tINIT_LIST_HEAD(&adapter->cp_ctx.mmio_info.mmio_list);\n \n \terr = libie_pci_init_dev(pdev);\n \tif (err)\n@@ -93,7 +104,18 @@ static int ixd_probe(struct pci_dev *pdev, const struct pci_device_id *ent)\n \n \tpci_set_drvdata(pdev, adapter);\n \n-\treturn ixd_iomap_regions(adapter);\n+\terr = ixd_iomap_regions(adapter);\n+\tif (err)\n+\t\treturn err;\n+\n+\tINIT_DELAYED_WORK(&adapter->init_task.init_work,\n+\t\t\t ixd_init_task);\n+\n+\tixd_trigger_reset(adapter);\n+\tqueue_delayed_work(system_unbound_wq, &adapter->init_task.init_work,\n+\t\t\t msecs_to_jiffies(500));\n+\n+\treturn 0;\n }\n \n static const struct pci_device_id ixd_pci_tbl[] = {\n", "prefixes": [ "iwl-next", "v5", "13/15" ] }