Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2165668/?format=api
{ "id": 2165668, "url": "http://patchwork.ozlabs.org/api/patches/2165668/?format=api", "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20251117134912.18566-15-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-15-larysa.zaremba@intel.com>", "list_archive_url": null, "date": "2025-11-17T13:48:54", "name": "[iwl-next,v5,14/15] ixd: add the core initialization", "commit_ref": null, "pull_url": null, "state": "under-review", "archived": false, "hash": "9e42ce5f1c6102e9c45c1515177b7f43def5ad67", "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-15-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/2165668/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2165668/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=Q0vuCszc;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=osuosl.org\n (client-ip=2605:bc80:3010::136; helo=smtp3.osuosl.org;\n envelope-from=intel-wired-lan-bounces@osuosl.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136])\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 4d98Hz5Spvz1yDb\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 18 Nov 2025 00:49:51 +1100 (AEDT)", "from localhost (localhost [127.0.0.1])\n\tby smtp3.osuosl.org (Postfix) with ESMTP id 4C04160DD0;\n\tMon, 17 Nov 2025 13:49:50 +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 Ljd8MBu72SAc; Mon, 17 Nov 2025 13:49:49 +0000 (UTC)", "from lists1.osuosl.org (lists1.osuosl.org [140.211.166.142])\n\tby smtp3.osuosl.org (Postfix) with ESMTP id 2D8FF60DC3;\n\tMon, 17 Nov 2025 13:49:49 +0000 (UTC)", "from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n by lists1.osuosl.org (Postfix) with ESMTP id 10329D5\n for <intel-wired-lan@lists.osuosl.org>; Mon, 17 Nov 2025 13:49:48 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n by smtp3.osuosl.org (Postfix) with ESMTP id 2ECFA60DD0\n for <intel-wired-lan@lists.osuosl.org>; Mon, 17 Nov 2025 13:49:47 +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 ZJKITFg7A-l9 for <intel-wired-lan@lists.osuosl.org>;\n Mon, 17 Nov 2025 13:49:46 +0000 (UTC)", "from mgamail.intel.com (mgamail.intel.com [198.175.65.12])\n by smtp3.osuosl.org (Postfix) with ESMTPS id 0E3AD60DC3\n for <intel-wired-lan@lists.osuosl.org>; Mon, 17 Nov 2025 13:49:45 +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:45 -0800", "from irvmail002.ir.intel.com ([10.43.11.120])\n by fmviesa007.fm.intel.com with ESMTP; 17 Nov 2025 05:49:40 -0800", "from mglak.igk.intel.com (mglak.igk.intel.com [10.237.112.146])\n by irvmail002.ir.intel.com (Postfix) with ESMTP id 11B4A37E3F;\n Mon, 17 Nov 2025 13:49:38 +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 smtp3.osuosl.org 2D8FF60DC3", "OpenDKIM Filter v2.11.0 smtp3.osuosl.org 0E3AD60DC3" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=osuosl.org;\n\ts=default; t=1763387389;\n\tbh=2EoKJf3r1lI6JU7TpiRPiz9m8LIjKSgq3QC43LooR1Y=;\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=Q0vuCszcMsrJGJJL3+PsMTpIRO23ZO7Vqdi4E7WR/7Ve8qyEGhq9FzdCo9ba/3QLT\n\t DNsv35YVXgnIIYhbdWvtHZCnj4SiOjKhwuwkGr2RbyKXizjgAMuJRwC8y0S2IlzEpj\n\t h3BftbKlYs1AXqmGt1sIeJaono23qJnBrC/VwwNqrRyHa3zlpEfUDstlT04pAxp1g/\n\t B0VcHDlAjoniMg+wgVHsyFjzzRxVFLl1QhI1a2aXpCFvrRpPsLTjY67NG3JUgz67cn\n\t U1mFMA7xwp5nHhRYFm2mhbUrSxgYf31mc0Olpf2Nthmcp8eX4QGukcRlMRNAtrOe5t\n\t q6WeuOaZX9bkw==", "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 0E3AD60DC3", "X-CSE-ConnectionGUID": [ "uYjdvleQTNeAX6WRrBBljQ==", "lVWd23DZRY2AqxCS16ty+Q==" ], "X-CSE-MsgGUID": [ "BIKo5EtVRhOWr5XVoym+1w==", "8j97wq4ZStizeIuRXrNCbA==" ], "X-IronPort-AV": [ "E=McAfee;i=\"6800,10657,11616\"; a=\"76846208\"", "E=Sophos;i=\"6.19,311,1754982000\"; d=\"scan'208\";a=\"76846208\"", "E=Sophos;i=\"6.19,311,1754982000\"; d=\"scan'208\";a=\"190115777\"" ], "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:54 +0100", "Message-ID": "<20251117134912.18566-15-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=1763387386; x=1794923386;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=S/CIuGp2n8FuNyldmSYozDiT57g8BI4ww87wYEGcNQA=;\n b=m2MvQlnW/VPAb+aAtHwtEhhhgF9Yw1pJTmKjnrDg3nsOKNCYlBxJuDcK\n qnu81toRO3JkkXP7HTUwWxC3wMjvupqmZ16FTRj5xTyqrnFwnTzzXWd65\n 0zSEeQUm7PlWqwNzGv8TCqIpCi/3olG9pcWTnBz8xrUbC8XrAVVyzpVbP\n 9vP+8TubhXbLbh3111blAN/TZgdy4KWnT155ykHdyOPYhg3rop11BJqqn\n +0JptvXa8HddYpPdD2ZtZUTlZpu4buOjNJgXg0BUSmBQ2RG7p8cXRAULr\n ruIFXoEZiETJqK6Oty65WQRfH6BA0fFoKyUk/PvYIy2onnUyCoDuImGcB\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=m2MvQlnW" ], "Subject": "[Intel-wired-lan] [PATCH iwl-next v5 14/15] ixd: add the core\n initialization", "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": "As the mailbox is setup, initialize the core. This makes use of the send\nand receive mailbox message framework for virtchnl communication between\nthe driver and device Control Plane (CP).\n\nTo start with, driver confirms the virtchnl version with the CP. Once that\nis done, it requests and gets the required capabilities and resources\nneeded such as max vectors, queues, vports etc.\n\nUse a unified way of handling the virtchnl messages, where a single\nfunction handles all related memory management and the caller only provides\nthe callbacks to fill the send buffer and to handle the response.\n\nPlace generic control queue message handling separately to facilitate the\naddition of protocols other than virtchannel in the future.\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/Makefile | 2 +\n drivers/net/ethernet/intel/ixd/ixd.h | 10 +\n drivers/net/ethernet/intel/ixd/ixd_ctlq.c | 149 +++++++++++++++\n drivers/net/ethernet/intel/ixd/ixd_ctlq.h | 33 ++++\n drivers/net/ethernet/intel/ixd/ixd_lib.c | 25 ++-\n drivers/net/ethernet/intel/ixd/ixd_main.c | 3 +\n drivers/net/ethernet/intel/ixd/ixd_virtchnl.c | 178 ++++++++++++++++++\n drivers/net/ethernet/intel/ixd/ixd_virtchnl.h | 12 ++\n 8 files changed, 411 insertions(+), 1 deletion(-)\n create mode 100644 drivers/net/ethernet/intel/ixd/ixd_ctlq.c\n create mode 100644 drivers/net/ethernet/intel/ixd/ixd_ctlq.h\n create mode 100644 drivers/net/ethernet/intel/ixd/ixd_virtchnl.c\n create mode 100644 drivers/net/ethernet/intel/ixd/ixd_virtchnl.h", "diff": "diff --git a/drivers/net/ethernet/intel/ixd/Makefile b/drivers/net/ethernet/intel/ixd/Makefile\nindex 164b2c86952f..90abf231fb16 100644\n--- a/drivers/net/ethernet/intel/ixd/Makefile\n+++ b/drivers/net/ethernet/intel/ixd/Makefile\n@@ -6,5 +6,7 @@\n obj-$(CONFIG_IXD) += ixd.o\n \n ixd-y := ixd_main.o\n+ixd-y += ixd_ctlq.o\n ixd-y += ixd_dev.o\n ixd-y += ixd_lib.o\n+ixd-y += ixd_virtchnl.o\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd.h b/drivers/net/ethernet/intel/ixd/ixd.h\nindex 99c44f2aa659..98d1f22534b5 100644\n--- a/drivers/net/ethernet/intel/ixd/ixd.h\n+++ b/drivers/net/ethernet/intel/ixd/ixd.h\n@@ -10,19 +10,29 @@\n * struct ixd_adapter - Data structure representing a CPF\n * @cp_ctx: Control plane communication context\n * @init_task: Delayed initialization after reset\n+ * @mbx_task: Control queue Rx handling\n * @xnm: virtchnl transaction manager\n * @asq: Send control queue info\n * @arq: Receive control queue info\n+ * @vc_ver: Negotiated virtchnl version\n+ * @caps: Negotiated virtchnl capabilities\n */\n struct ixd_adapter {\n \tstruct libie_ctlq_ctx cp_ctx;\n \tstruct {\n \t\tstruct delayed_work init_work;\n \t\tu8 reset_retries;\n+\t\tu8 vc_retries;\n \t} init_task;\n+\tstruct delayed_work mbx_task;\n \tstruct libie_ctlq_xn_manager *xnm;\n \tstruct libie_ctlq_info *asq;\n \tstruct libie_ctlq_info *arq;\n+\tstruct {\n+\t\tu32 major;\n+\t\tu32 minor;\n+\t} vc_ver;\n+\tstruct virtchnl2_get_capabilities caps;\n };\n \n /**\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_ctlq.c b/drivers/net/ethernet/intel/ixd/ixd_ctlq.c\nnew file mode 100644\nindex 000000000000..c6ec5d6c291b\n--- /dev/null\n+++ b/drivers/net/ethernet/intel/ixd/ixd_ctlq.c\n@@ -0,0 +1,149 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/* Copyright (C) 2025 Intel Corporation */\n+\n+#include \"ixd.h\"\n+#include \"ixd_ctlq.h\"\n+#include \"ixd_virtchnl.h\"\n+\n+/**\n+ * ixd_ctlq_clean_sq - Clean the send control queue after sending the message\n+ * @adapter: The adapter that sent the messages\n+ * @num_sent: Number of sent messages to be released\n+ *\n+ * Free the libie send resources after sending the message and handling\n+ * the response.\n+ */\n+static void ixd_ctlq_clean_sq(struct ixd_adapter *adapter, u16 num_sent)\n+{\n+\tif (!num_sent)\n+\t\treturn;\n+\n+\tstruct libie_ctlq_xn_clean_params params = {\n+\t\t.ctlq = adapter->asq,\n+\t\t.ctx = &adapter->cp_ctx,\n+\t\t.num_msgs = num_sent,\n+\t\t.rel_tx_buf = kfree,\n+\t};\n+\n+\tlibie_ctlq_xn_send_clean(¶ms);\n+}\n+\n+/**\n+ * ixd_ctlq_init_sparams - Initialize control queue send parameters\n+ * @adapter: The adapter with initialized mailbox\n+ * @sparams: Parameters to initialize\n+ * @msg_buf: DMA-mappable pointer to the message being sent\n+ * @msg_size: Message size\n+ */\n+static void ixd_ctlq_init_sparams(struct ixd_adapter *adapter,\n+\t\t\t\t struct libie_ctlq_xn_send_params *sparams,\n+\t\t\t\t void *msg_buf, size_t msg_size)\n+{\n+\t*sparams = (struct libie_ctlq_xn_send_params) {\n+\t\t.rel_tx_buf = kfree,\n+\t\t.xnm = adapter->xnm,\n+\t\t.ctlq = adapter->asq,\n+\t\t.timeout_ms = IXD_CTLQ_TIMEOUT,\n+\t\t.send_buf = (struct kvec) {\n+\t\t\t.iov_base = msg_buf,\n+\t\t\t.iov_len = msg_size,\n+\t\t},\n+\t};\n+}\n+\n+/**\n+ * ixd_ctlq_do_req - Perform a standard virtchnl request\n+ * @adapter: The adapter with initialized mailbox\n+ * @req: virtchnl request description\n+ *\n+ * Return: %0 if a message was sent and received a response\n+ * that was successfully handled by the custom callback,\n+ * negative error otherwise.\n+ */\n+int ixd_ctlq_do_req(struct ixd_adapter *adapter, const struct ixd_ctlq_req *req)\n+{\n+\tstruct libie_ctlq_xn_send_params send_params = {};\n+\tu8 onstack_send_buff[LIBIE_CP_TX_COPYBREAK];\n+\tstruct kvec *recv_mem;\n+\tvoid *send_buff;\n+\tint err;\n+\n+\tsend_buff = libie_cp_can_send_onstack(req->send_size) ?\n+\t\t &onstack_send_buff : kzalloc(req->send_size, GFP_KERNEL);\n+\tif (!send_buff)\n+\t\treturn -ENOMEM;\n+\n+\tixd_ctlq_init_sparams(adapter, &send_params, send_buff,\n+\t\t\t req->send_size);\n+\n+\tsend_params.chnl_opcode = req->opcode;\n+\n+\tif (req->send_buff_init)\n+\t\treq->send_buff_init(adapter, send_buff, req->ctx);\n+\n+\terr = libie_ctlq_xn_send(&send_params);\n+\tif (err)\n+\t\treturn err;\n+\n+\trecv_mem = &send_params.recv_mem;\n+\tif (req->recv_process)\n+\t\terr = req->recv_process(adapter, recv_mem->iov_base,\n+\t\t\t\t\trecv_mem->iov_len, req->ctx);\n+\n+\tixd_ctlq_clean_sq(adapter, 1);\n+\tlibie_ctlq_release_rx_buf(recv_mem);\n+\n+\treturn err;\n+}\n+\n+/**\n+ * ixd_ctlq_handle_msg - Default control queue message handler\n+ * @ctx: Control plane communication context\n+ * @msg: Message received\n+ */\n+static void ixd_ctlq_handle_msg(struct libie_ctlq_ctx *ctx,\n+\t\t\t\tstruct libie_ctlq_msg *msg)\n+{\n+\tstruct ixd_adapter *adapter = pci_get_drvdata(ctx->mmio_info.pdev);\n+\n+\tif (ixd_vc_can_handle_msg(msg))\n+\t\tixd_vc_recv_event_msg(adapter, msg);\n+\telse\n+\t\tdev_dbg_ratelimited(ixd_to_dev(adapter),\n+\t\t\t\t \"Received an unsupported opcode 0x%x from the CP\\n\",\n+\t\t\t\t msg->chnl_opcode);\n+\n+\tlibie_ctlq_release_rx_buf(&msg->recv_mem);\n+}\n+\n+/**\n+ * ixd_ctlq_recv_mb_msg - Receive a potential message over mailbox periodically\n+ * @adapter: The adapter with initialized mailbox\n+ */\n+static void ixd_ctlq_recv_mb_msg(struct ixd_adapter *adapter)\n+{\n+\tstruct libie_ctlq_xn_recv_params xn_params = {\n+\t\t.xnm = adapter->xnm,\n+\t\t.ctlq = adapter->arq,\n+\t\t.ctlq_msg_handler = ixd_ctlq_handle_msg,\n+\t\t.budget = LIBIE_CTLQ_MAX_XN_ENTRIES,\n+\t};\n+\n+\tlibie_ctlq_xn_recv(&xn_params);\n+}\n+\n+/**\n+ * ixd_ctlq_rx_task - Periodically check for mailbox responses and events\n+ * @work: work handle\n+ */\n+void ixd_ctlq_rx_task(struct work_struct *work)\n+{\n+\tstruct ixd_adapter *adapter;\n+\n+\tadapter = container_of(work, struct ixd_adapter, mbx_task.work);\n+\n+\tqueue_delayed_work(system_unbound_wq, &adapter->mbx_task,\n+\t\t\t msecs_to_jiffies(300));\n+\n+\tixd_ctlq_recv_mb_msg(adapter);\n+}\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_ctlq.h b/drivers/net/ethernet/intel/ixd/ixd_ctlq.h\nnew file mode 100644\nindex 000000000000..f450a3a0828f\n--- /dev/null\n+++ b/drivers/net/ethernet/intel/ixd/ixd_ctlq.h\n@@ -0,0 +1,33 @@\n+/* SPDX-License-Identifier: GPL-2.0-only */\n+/* Copyright (C) 2025 Intel Corporation */\n+\n+#ifndef _IXD_CTLQ_H_\n+#define _IXD_CTLQ_H_\n+\n+#include \"linux/intel/virtchnl2.h\"\n+\n+#define IXD_CTLQ_TIMEOUT 2000\n+\n+/**\n+ * struct ixd_ctlq_req - Standard virtchnl request description\n+ * @opcode: protocol opcode, only virtchnl2 is needed for now\n+ * @send_size: required length of the send buffer\n+ * @send_buff_init: function to initialize the allocated send buffer\n+ * @recv_process: function to handle the CP response\n+ * @ctx: additional context for callbacks\n+ */\n+struct ixd_ctlq_req {\n+\tenum virtchnl2_op opcode;\n+\tsize_t send_size;\n+\tvoid (*send_buff_init)(struct ixd_adapter *adapter, void *send_buff,\n+\t\t\t void *ctx);\n+\tint (*recv_process)(struct ixd_adapter *adapter, void *recv_buff,\n+\t\t\t size_t recv_size, void *ctx);\n+\tvoid *ctx;\n+};\n+\n+int ixd_ctlq_do_req(struct ixd_adapter *adapter,\n+\t\t const struct ixd_ctlq_req *req);\n+void ixd_ctlq_rx_task(struct work_struct *work);\n+\n+#endif /* _IXD_CTLQ_H_ */\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_lib.c b/drivers/net/ethernet/intel/ixd/ixd_lib.c\nindex b8dd5c4de7b2..34ba987866b1 100644\n--- a/drivers/net/ethernet/intel/ixd/ixd_lib.c\n+++ b/drivers/net/ethernet/intel/ixd/ixd_lib.c\n@@ -2,6 +2,7 @@\n /* Copyright (C) 2025 Intel Corporation */\n \n #include \"ixd.h\"\n+#include \"ixd_virtchnl.h\"\n \n #define IXD_DFLT_MBX_Q_LEN 64\n \n@@ -94,6 +95,8 @@ int ixd_init_dflt_mbx(struct ixd_adapter *adapter)\n \t\treturn -ENOENT;\n \t}\n \n+\tqueue_delayed_work(system_unbound_wq, &adapter->mbx_task, 0);\n+\n \treturn 0;\n }\n \n@@ -103,6 +106,8 @@ int ixd_init_dflt_mbx(struct ixd_adapter *adapter)\n */\n void ixd_deinit_dflt_mbx(struct ixd_adapter *adapter)\n {\n+\tcancel_delayed_work_sync(&adapter->mbx_task);\n+\n \tif (adapter->arq || adapter->asq)\n \t\tlibie_ctlq_xn_deinit(adapter->xnm, &adapter->cp_ctx);\n \n@@ -136,8 +141,26 @@ void ixd_init_task(struct work_struct *work)\n \n \tadapter->init_task.reset_retries = 0;\n \terr = ixd_init_dflt_mbx(adapter);\n-\tif (err)\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+\t\treturn;\n+\t}\n+\n+\tif (!ixd_vc_dev_init(adapter)) {\n+\t\tadapter->init_task.vc_retries = 0;\n+\t\treturn;\n+\t}\n+\n+\tixd_deinit_dflt_mbx(adapter);\n+\tif (++adapter->init_task.vc_retries > 5) {\n+\t\tdev_err(ixd_to_dev(adapter),\n+\t\t\t\"Failed to establish mailbox communications with the hardware\\n\");\n+\t\treturn;\n+\t}\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 }\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_main.c b/drivers/net/ethernet/intel/ixd/ixd_main.c\nindex b4d4000b63ed..6d5e6aca77df 100644\n--- a/drivers/net/ethernet/intel/ixd/ixd_main.c\n+++ b/drivers/net/ethernet/intel/ixd/ixd_main.c\n@@ -2,6 +2,7 @@\n /* Copyright (C) 2025 Intel Corporation */\n \n #include \"ixd.h\"\n+#include \"ixd_ctlq.h\"\n #include \"ixd_lan_regs.h\"\n \n MODULE_DESCRIPTION(\"Intel(R) Control Plane Function Device Driver\");\n@@ -19,6 +20,7 @@ static void ixd_remove(struct pci_dev *pdev)\n \n \t/* Do not mix removal with (re)initialization */\n \tcancel_delayed_work_sync(&adapter->init_task.init_work);\n+\n \t/* Leave the device clean on exit */\n \tixd_trigger_reset(adapter);\n \tixd_deinit_dflt_mbx(adapter);\n@@ -110,6 +112,7 @@ static int ixd_probe(struct pci_dev *pdev, const struct pci_device_id *ent)\n \n \tINIT_DELAYED_WORK(&adapter->init_task.init_work,\n \t\t\t ixd_init_task);\n+\tINIT_DELAYED_WORK(&adapter->mbx_task, ixd_ctlq_rx_task);\n \n \tixd_trigger_reset(adapter);\n \tqueue_delayed_work(system_unbound_wq, &adapter->init_task.init_work,\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_virtchnl.c b/drivers/net/ethernet/intel/ixd/ixd_virtchnl.c\nnew file mode 100644\nindex 000000000000..66049d1b1d15\n--- /dev/null\n+++ b/drivers/net/ethernet/intel/ixd/ixd_virtchnl.c\n@@ -0,0 +1,178 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/* Copyright (C) 2025 Intel Corporation */\n+\n+#include \"ixd.h\"\n+#include \"ixd_ctlq.h\"\n+#include \"ixd_virtchnl.h\"\n+\n+/**\n+ * ixd_vc_recv_event_msg - Handle virtchnl event message\n+ * @adapter: The adapter handling the message\n+ * @ctlq_msg: Message received\n+ */\n+void ixd_vc_recv_event_msg(struct ixd_adapter *adapter,\n+\t\t\t struct libie_ctlq_msg *ctlq_msg)\n+{\n+\tint payload_size = ctlq_msg->data_len;\n+\tstruct virtchnl2_event *v2e;\n+\n+\tif (payload_size < sizeof(*v2e)) {\n+\t\tdev_warn_ratelimited(ixd_to_dev(adapter),\n+\t\t\t\t \"Failed to receive valid payload for event msg (op 0x%X len %u)\\n\",\n+\t\t\t\t ctlq_msg->chnl_opcode,\n+\t\t\t\t payload_size);\n+\t\treturn;\n+\t}\n+\n+\tv2e = (struct virtchnl2_event *)ctlq_msg->recv_mem.iov_base;\n+\n+\tdev_dbg(ixd_to_dev(adapter), \"Got event 0x%X from the CP\\n\",\n+\t\tle32_to_cpu(v2e->event));\n+}\n+\n+/**\n+ * ixd_vc_can_handle_msg - Decide if an event has to be handled by virtchnl code\n+ * @ctlq_msg: Message received\n+ *\n+ * Return: %true if virtchnl code can handle the event, %false otherwise\n+ */\n+bool ixd_vc_can_handle_msg(struct libie_ctlq_msg *ctlq_msg)\n+{\n+\treturn ctlq_msg->chnl_opcode == VIRTCHNL2_OP_EVENT;\n+}\n+\n+/**\n+ * ixd_handle_caps - Handle VIRTCHNL2_OP_GET_CAPS response\n+ * @adapter: The adapter for which the capabilities are being updated\n+ * @recv_buff: Buffer containing the response\n+ * @recv_size: Response buffer size\n+ * @ctx: unused\n+ *\n+ * Return: %0 if the response format is correct and was handled as expected,\n+ * negative error otherwise.\n+ */\n+static int ixd_handle_caps(struct ixd_adapter *adapter, void *recv_buff,\n+\t\t\t size_t recv_size, void *ctx)\n+{\n+\tif (recv_size < sizeof(adapter->caps))\n+\t\treturn -EBADMSG;\n+\n+\tadapter->caps = *(typeof(adapter->caps) *)recv_buff;\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * ixd_req_vc_caps - Request and save device capability\n+ * @adapter: The adapter to get the capabilities for\n+ *\n+ * Return: success or error if sending the get capability message fails\n+ */\n+static int ixd_req_vc_caps(struct ixd_adapter *adapter)\n+{\n+\tconst struct ixd_ctlq_req req = {\n+\t\t.opcode = VIRTCHNL2_OP_GET_CAPS,\n+\t\t.send_size = sizeof(struct virtchnl2_get_capabilities),\n+\t\t.ctx = NULL,\n+\t\t.send_buff_init = NULL,\n+\t\t.recv_process = ixd_handle_caps,\n+\t};\n+\n+\treturn ixd_ctlq_do_req(adapter, &req);\n+}\n+\n+/**\n+ * ixd_get_vc_ver - Get version info from adapter\n+ *\n+ * Return: filled in virtchannel2 version info, ready for sending\n+ */\n+static struct virtchnl2_version_info ixd_get_vc_ver(void)\n+{\n+\treturn (struct virtchnl2_version_info) {\n+\t\t.major = cpu_to_le32(VIRTCHNL2_VERSION_MAJOR_2),\n+\t\t.minor = cpu_to_le32(VIRTCHNL2_VERSION_MINOR_0),\n+\t};\n+}\n+\n+static void ixd_fill_vc_ver(struct ixd_adapter *adapter, void *send_buff,\n+\t\t\t void *ctx)\n+{\n+\t*(struct virtchnl2_version_info *)send_buff = ixd_get_vc_ver();\n+}\n+\n+/**\n+ * ixd_handle_vc_ver - Handle VIRTCHNL2_OP_VERSION response\n+ * @adapter: The adapter for which the version is being updated\n+ * @recv_buff: Buffer containing the response\n+ * @recv_size: Response buffer size\n+ * @ctx: Unused\n+ *\n+ * Return: %0 if the response format is correct and was handled as expected,\n+ * negative error otherwise.\n+ */\n+static int ixd_handle_vc_ver(struct ixd_adapter *adapter, void *recv_buff,\n+\t\t\t size_t recv_size, void *ctx)\n+{\n+\tstruct virtchnl2_version_info need_ver = ixd_get_vc_ver();\n+\tstruct virtchnl2_version_info *recv_ver;\n+\n+\tif (recv_size < sizeof(need_ver))\n+\t\treturn -EBADMSG;\n+\n+\trecv_ver = recv_buff;\n+\tif (le32_to_cpu(need_ver.major) > le32_to_cpu(recv_ver->major))\n+\t\treturn -EOPNOTSUPP;\n+\n+\tadapter->vc_ver.major = le32_to_cpu(recv_ver->major);\n+\tadapter->vc_ver.minor = le32_to_cpu(recv_ver->minor);\n+\n+\treturn 0;\n+}\n+\n+/**\n+ * ixd_req_vc_version - Request and save Virtchannel2 version\n+ * @adapter: The adapter to get the version for\n+ *\n+ * Return: success or error if sending fails or the response was not as expected\n+ */\n+static int ixd_req_vc_version(struct ixd_adapter *adapter)\n+{\n+\tconst struct ixd_ctlq_req req = {\n+\t\t.opcode = VIRTCHNL2_OP_VERSION,\n+\t\t.send_size = sizeof(struct virtchnl2_version_info),\n+\t\t.ctx = NULL,\n+\t\t.send_buff_init = ixd_fill_vc_ver,\n+\t\t.recv_process = ixd_handle_vc_ver,\n+\t};\n+\n+\treturn ixd_ctlq_do_req(adapter, &req);\n+}\n+\n+/**\n+ * ixd_vc_dev_init - virtchnl device core initialization\n+ * @adapter: device information\n+ *\n+ * Return: %0 on success or error if any step of the initialization fails\n+ */\n+int ixd_vc_dev_init(struct ixd_adapter *adapter)\n+{\n+\tint err;\n+\n+\terr = ixd_req_vc_version(adapter);\n+\tif (err) {\n+\t\tdev_warn(ixd_to_dev(adapter),\n+\t\t\t \"Getting virtchnl version failed, error=%pe\\n\",\n+\t\t\t ERR_PTR(err));\n+\t\treturn err;\n+\t}\n+\n+\terr = ixd_req_vc_caps(adapter);\n+\tif (err) {\n+\t\tdev_warn(ixd_to_dev(adapter),\n+\t\t\t \"Getting virtchnl capabilities failed, error=%pe\\n\",\n+\t\t\t ERR_PTR(err));\n+\t\treturn err;\n+\t}\n+\n+\treturn err;\n+}\ndiff --git a/drivers/net/ethernet/intel/ixd/ixd_virtchnl.h b/drivers/net/ethernet/intel/ixd/ixd_virtchnl.h\nnew file mode 100644\nindex 000000000000..1a53da8b545c\n--- /dev/null\n+++ b/drivers/net/ethernet/intel/ixd/ixd_virtchnl.h\n@@ -0,0 +1,12 @@\n+/* SPDX-License-Identifier: GPL-2.0-only */\n+/* Copyright (C) 2025 Intel Corporation */\n+\n+#ifndef _IXD_VIRTCHNL_H_\n+#define _IXD_VIRTCHNL_H_\n+\n+int ixd_vc_dev_init(struct ixd_adapter *adapter);\n+bool ixd_vc_can_handle_msg(struct libie_ctlq_msg *ctlq_msg);\n+void ixd_vc_recv_event_msg(struct ixd_adapter *adapter,\n+\t\t\t struct libie_ctlq_msg *ctlq_msg);\n+\n+#endif /* _IXD_VIRTCHNL_H_ */\n", "prefixes": [ "iwl-next", "v5", "14/15" ] }