{"id":2175302,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2175302/?format=json","project":{"id":28,"url":"http://patchwork.ozlabs.org/api/1.0/projects/28/?format=json","name":"Linux PCI development","link_name":"linux-pci","list_id":"linux-pci.vger.kernel.org","list_email":"linux-pci@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20251217151609.3162665-17-den@valinux.co.jp>","date":"2025-12-17T15:15:50","name":"[RFC,v3,16/35] NTB: ntb_transport: Introduce ntb_transport_backend_ops","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"2f4cb7548799f276f4d96870cc5fe20afa795515","submitter":{"id":91573,"url":"http://patchwork.ozlabs.org/api/1.0/people/91573/?format=json","name":"Koichiro Den","email":"den@valinux.co.jp"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-pci/patch/20251217151609.3162665-17-den@valinux.co.jp/mbox/","series":[{"id":485709,"url":"http://patchwork.ozlabs.org/api/1.0/series/485709/?format=json","date":"2025-12-17T15:15:53","name":"NTB transport backed by endpoint DW eDMA","version":3,"mbox":"http://patchwork.ozlabs.org/series/485709/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2175302/checks/","tags":{},"headers":{"Return-Path":"\n <linux-pci+bounces-43233-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-pci@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=valinux.co.jp header.i=@valinux.co.jp\n header.a=rsa-sha256 header.s=selector1 header.b=Bqa/RWBZ;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-pci+bounces-43233-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp\n header.b=\"Bqa/RWBZ\"","smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=52.101.229.24","smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=valinux.co.jp","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=valinux.co.jp","dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=valinux.co.jp;"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\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 4dWhSG2qjsz1xty\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 18 Dec 2025 05:01:18 +1100 (AEDT)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 0712830B34CF\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 17 Dec 2025 17:50:10 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id DA13A35C1AB;\n\tWed, 17 Dec 2025 17:50:07 +0000 (UTC)","from TY3P286CU002.outbound.protection.outlook.com\n (mail-japaneastazon11010024.outbound.protection.outlook.com [52.101.229.24])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id B4E6035CB73;\n\tWed, 17 Dec 2025 17:49:59 +0000 (UTC)","from TYWP286MB2697.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:24c::11)\n by TYCP286MB2863.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:306::14) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9434.6; Wed, 17 Dec\n 2025 15:16:28 +0000","from TYWP286MB2697.JPNP286.PROD.OUTLOOK.COM\n ([fe80::fb7e:f4ed:a580:9d03]) by TYWP286MB2697.JPNP286.PROD.OUTLOOK.COM\n ([fe80::fb7e:f4ed:a580:9d03%5]) with mapi id 15.20.9434.001; Wed, 17 Dec 2025\n 15:16:27 +0000"],"ARC-Seal":["i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1765993807; cv=fail;\n b=rZMy0nnsMZdEZsnwF/hCwdLYDAckRv4XsBB4eBdqg9+CM8EGr3/3QGvc1QrR/+6xDid9YdMjlVDoxq+h5QllxAq5yMubF1ni30jISpRt2015eY5v7kWdGnAEhS8yKCkiS3h3ygApM52FhW1HsILorghFl82u+elm6zyu+TIsqYw=","i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=me7R1AhE39NAW78zNN+pdNQC5S3gXFD7qvmLtiEbIYBodlOOeQbd6j7M0eqZMRD/vjJCak7xCWDt1U5+DuvCh7nTyXVTG3diC8oxXRRct11nV41u0JerDhDvcFshOIyeJk0zo8ikpbXLYg61Rii7wYR7upCypIfKywLyPiaI1e9XOMeY87HXu4G0cW01F5ZYYcLfILXzO8VG7r4xdGpFdIFE1Mm2km5BrqPiwd7KihGEra6kyWri3uceOyOfVtEQ5TPLyPWrYzgSghgHTCPDzybO7qp6w+aFem5Wna0VKNPlhvi1gcgjeofUAW4OOmyMfMAqltzJsSO2EeK5pS0PlQ=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1765993807; c=relaxed/simple;\n\tbh=69e7PGsuDLmLY11yGAktC4/kimg8JqY4Dkne4IMfPXw=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=njqIDYVxrzvoEl3qIXw6ptN42/gH8OVNTB52XHUh6T9Rkf1mSgpe5nk5pEbjEDDGkEs+DoE2xkdiqHi+3n1bWrd1zlU5TmExvUV26lzVfMDWoPyC2gN2YASuxCfEetrIxQMNre2itl4aHK83kmlGOI2vJnJm2i2HLwp7fj7dklY=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=yHnzD/I+IlEwwC0eTS/j4JzomLQ1b9OSgzbpKWYcbp8=;\n b=csTl0HkHDvHFT9g9iG0ev+IAEcALPAhLXsbUH32asT1IouetLdSCNtr+SHWn2hSh7AjdhMdWIN3bitPMP8BHkbcJQ+F/wPAO6cHrk+l7FnuPP6JE2OElsuMqd07uCpn9VYqvK1n6Y/PajLRWqV4v3TcpxMAkjgy3ww4m58LzDLKZuPHHEv9cE/AhGdPTCGq1AZ/YhvAuKrKCF0KJEXAqWmBF2Kd6zWKH7EpE9BN+0+AqlBe2jqZjbwt5AkWliwbhV65JOTJ3oAhlfq74X6uLO3iEMruhm3wWkK5ZaTqitIyYW/L0EFpLY2SacHvaNXl9okFtC9ABQpR81W6X33VWfg=="],"ARC-Authentication-Results":["i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=valinux.co.jp;\n spf=pass smtp.mailfrom=valinux.co.jp;\n dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp\n header.b=Bqa/RWBZ; arc=fail smtp.client-ip=52.101.229.24","i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=valinux.co.jp; dmarc=pass action=none\n header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=yHnzD/I+IlEwwC0eTS/j4JzomLQ1b9OSgzbpKWYcbp8=;\n b=Bqa/RWBZVWjPL90XcpFk8j4dKnlhPVNw71h7eqHy9AEykLEIrN6bDrQ3FtqmMRvAE/RbRsFRQkhNspRdPqCGZK+/Ztlpy7t0XBu/wJJh8kIjHpPa3C/h7DCgKjjhS/DQjG5lMTdS1R39cb0QVL/lg3DcokyY2Qef4enrOqG399E=","From":"Koichiro Den <den@valinux.co.jp>","To":"Frank.Li@nxp.com,\n\tdave.jiang@intel.com,\n\tntb@lists.linux.dev,\n\tlinux-pci@vger.kernel.org,\n\tdmaengine@vger.kernel.org,\n\tlinux-renesas-soc@vger.kernel.org,\n\tnetdev@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org","Cc":"mani@kernel.org,\n\tkwilczynski@kernel.org,\n\tkishon@kernel.org,\n\tbhelgaas@google.com,\n\tcorbet@lwn.net,\n\tgeert+renesas@glider.be,\n\tmagnus.damm@gmail.com,\n\trobh@kernel.org,\n\tkrzk+dt@kernel.org,\n\tconor+dt@kernel.org,\n\tvkoul@kernel.org,\n\tjoro@8bytes.org,\n\twill@kernel.org,\n\trobin.murphy@arm.com,\n\tjdmason@kudzu.us,\n\tallenbh@gmail.com,\n\tandrew+netdev@lunn.ch,\n\tdavem@davemloft.net,\n\tedumazet@google.com,\n\tkuba@kernel.org,\n\tpabeni@redhat.com,\n\tBasavaraj.Natikar@amd.com,\n\tShyam-sundar.S-k@amd.com,\n\tkurt.schwemmer@microsemi.com,\n\tlogang@deltatee.com,\n\tjingoohan1@gmail.com,\n\tlpieralisi@kernel.org,\n\tutkarsh02t@gmail.com,\n\tjbrunet@baylibre.com,\n\tdlemoal@kernel.org,\n\tarnd@arndb.de,\n\telfring@users.sourceforge.net,\n\tden@valinux.co.jp","Subject":"[RFC PATCH v3 16/35] NTB: ntb_transport: Introduce\n ntb_transport_backend_ops","Date":"Thu, 18 Dec 2025 00:15:50 +0900","Message-ID":"<20251217151609.3162665-17-den@valinux.co.jp>","X-Mailer":"git-send-email 2.51.0","In-Reply-To":"<20251217151609.3162665-1-den@valinux.co.jp>","References":"<20251217151609.3162665-1-den@valinux.co.jp>","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"TY4P286CA0068.JPNP286.PROD.OUTLOOK.COM\n (2603:1096:405:371::9) To TYWP286MB2697.JPNP286.PROD.OUTLOOK.COM\n (2603:1096:400:24c::11)","Precedence":"bulk","X-Mailing-List":"linux-pci@vger.kernel.org","List-Id":"<linux-pci.vger.kernel.org>","List-Subscribe":"<mailto:linux-pci+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-pci+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"TYWP286MB2697:EE_|TYCP286MB2863:EE_","X-MS-Office365-Filtering-Correlation-Id":"60ec74b6-f929-4c0b-b470-08de3d7f4006","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"\n\tBCL:0;ARA:13230040|7416014|376014|10070799003|1800799024|366016;","X-Microsoft-Antispam-Message-Info":"\n 1JmMTZWJn8N3Ap2D1ywxPKvgzUGD4HqzucAu9FAfXAsQ55dqQ6n6HDQah+RdvmhPDb+CTxr8cBFv71Yjp/LoiJQkiTnotDrXP535xKdUDRqAk6eYU1yi6GOlNd82aaVBpXHYnqRJQZieqp9tTVBWW3MgFib5fqEJyh5hQoaVYb4wKtyk/lEfcyLlTaf3xVxUNB0rjjaLx+ekuK2kIfSxKTt9wHrJew587iyz/jsN5HWpPyl3/w8GUPkgAVOE0S2WrH6Yab5eCA5XhwuhCpScCoF8FqETQblPI8vaDh289MUn0buHXFJ7HsCqKkFShYSKjGzhHNtPgkAB8YJOWbmNuYj0jpW8vf7SlB+6cbyspYx7iFgKc0CRcyR06nr0gkE/qm4EzRTNwx97BNFikjlqJyM7uQ4qKGbmI9tQswjiS1CNIuyFl9r/nvMarZk8m3FtJXWT+bQ4+2amUlg0x/m2Dh4xYs7GMO6hqv/rXl8wiWLtGdcoI/unjoYwLBfjb2WoVl+9p2b4A99BmdAovwbd4f2nGNzVCaVx9oNV/IJhnCaruf4irUsPeSRtduN984hoK3YNsnzS8WqLNkT02Ff6MPghMFguvQtEM5HBWbnWKq9hiQNjliFMgikfEDzjVwdkdtYOFJneFYSLYpaoAg7vCUB6YhxQj0f4mHaLt0fG4HLTN8PxvznbYTxxvyw1lo1xy+sW0mJLdfVq2UNmqPvqgfArDGwnobu+OsY9jstFpbui4+NyOzmKih/mPs3tAs76fopIWDXCEz5JX3pEKLZ9MlGJVEzjyRg0KweWC+pyYKHjedpktSZiDfsCS1zvrtR67Y4aAdh0coLb7TafaMtQbb15MWp1bIUSsNZiOUrPi3ZZOk/Qm/R8oGVLcFHTp+7pldGfHNZlXjsNIScYtXU5NymV74JRfPnXPeNMzfE8SWEJbn6Sxvd98ZzxbCe9CE90lvH6zTj3GJqvJgSHR2uXxjyK5pU8Ehsalntefjy7QUtm4vvP5gRiQifE6yrHJbTSWv3OVzQIWmU2ACQRPLEbi89zxm15HV5u9ToxsiSSccLgJQKXFpa/+5xDXoxTKej1O5L2tSODx77INP9KgtMpL9OgeXK/DtOo6fuypJcZawuwfAeop+uMLNBUPactUV2oSbQrF4SyRWNrIreZmmCeoj99H5USNj9B6G9mtHDw0K9gzlbHvUHRNfOe6dM6U9naptBTgZ5lyy2T1lne2Eyo9LEyMVKNyvU3zWZm6dBxjz+3R7mz079Y4sVFWEij6VjDa0NYI81JXxE6ns94UzblGrP7WR74wA+gTtMuBxak5N8VNRzfF9D+J1ZkrtWeXL2G0QvjE2UiYdvZL9YJOOzY1j3ucdNLcalyQ7XJeW5znCqJSju8rSm78wyZ50J9/mBTWkdZsLliumqJE4jSIpz+WOFRS8R87TMJfHIT0a9lvOxrWMpLRsjPRirIoGvvaV8K","X-Forefront-Antispam-Report":"\n\tCIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TYWP286MB2697.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(10070799003)(1800799024)(366016);DIR:OUT;SFP:1101;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n jGo50AHuWssIImMF+YZUQj2cxCLWtTQ9TFabUBw92Vx/nufVl7wHPrgZqJqqjxRdsruke5mZ62Be/5eh6iK9kEEISRDse2MS2Q8zNkNLyGE2hwESNQPP0p0glw7CGWOhTurseuV3ztzQdhSj4R7vIO6fK/818wCer1dZJcvQTzXNkMRmk73t6kJK4xxg0fK9W3rMYKmYiy2TWev3YsnJk4W1BMZYc2TT1Rot+tEQlFGbUP3wo/HJjIcj9WrWG/g0RSB0rLmmdxLu9nNsi31C1M0jUIrvL6VLn75jgtluhgFGUkGtYbs3V+P1vSrmllKJLMyVY/7WUblAeIR72nnTfbIUmkKUHhq6ukErjv3++FxVJRqKWYWHxyDcXf/PynTk3h2S2i8/E9+8MLMNDkWRhO8Htgvbg0qRV1K/tLnXnZ6A5Bhru0wEzjLggYAaZ6+V79W7zEafgQm2ugvbtu2GVetKdSRQ2BQT4UwdI40ofwac6+V3uJ7UGwWX776vpu5Ps87Nd737s4SehnqTKxgBBrwncNihkrFiew3x+w4Hp1Tfwz07ymfVICLLmFLKAu5mzygfMv6644ZhZytTHvnwQtnRLNVd2SWyvCzc4tT25z9QcDAFmItpfoTkqyVkAwc1kzgSBPAhjS/J/vXOSMPLaIxglwhbmFT8RbbwhVLvzCsaq18EWRYyfxvGL2ASGLdJg4ZyWejkVTH+Fh+zPllEQfB+EMxRsP5JbyYGaeIazykpbolSKW1et+L9pwQFEHk22hYFaaS4oIPGw2F3o1dKQgmP9phxkF8WqHV7cwLLfi7nNPVkiWZ5ZF9/HBKN3XhiKnusvvDAYftEZOdmtNvQoFc+Kj7BqxyncrGCAoEW3X4dvCpriCrhvHHLtVMVqff+2MaCs3tnIB0zqU1yQjlgeF7wwq1cC3X5T1SVQmTZ1apayed2fZE9UIAwtVX2xfiyaePBATskA/7gLacLXlUaEwtxJEhu+1NG9meNw8K4Vs8s5KVC1QHVqwLjv/0ve0FGlWmfHmFCHjo039PcyPPnGgueONgFk0QrizM7sBKrpeD4GghkBN/Ze33m5ZQ7mXvyN6aM5jKjkcUOb3I5nJKTNkv8zoVgmlJ4DLwLit5zYI+iME86jSwMf+iQxsy2N7S8W7VQWrXmjXSPFgmzvaE/nQ2TwbbTSmoXMF4YU53kUjl+un+LEcV2yGfw6fF5ZUcD0jgeCzKek9ueBvwbasdQpUwO/eYnp6nd8xS7PR6i5hsFsD1vrjfBA8qZHQtBNy+AJGMaUkTVgh3KFdy0KoAeh15WzAl8LxTDeHQlnFG/+9ktbWpjc2kRScfMXd0LrtC5A8uoBoIxjjGuRTaKEuudolPEoBs21JWe543k6lFk4M5dDB/BRU/TR1urNTT91jewcbXDV4mmlv5vlzRBMnuwlY0ccVcrGpyGrReCDIDcN5Zd7BwaOyFXXXA3yKgIgfybZOIHtwI15eOeb7lTEtDB0HkdQ+hHA6TJPOFcYDsHR56FK0PhDExIgh5xobgvW7qN7SSdONCcxzJjS4x0wlu2eiU3bOWDkmpe1zPeqFBWWPqEkshRlPCIBwLnZiLfhW9WlrNeWhjFm8lYjnUa/+w9Q/bXMVm8fGHFPf/rZXbppUk=","X-OriginatorOrg":"valinux.co.jp","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 60ec74b6-f929-4c0b-b470-08de3d7f4006","X-MS-Exchange-CrossTenant-AuthSource":"TYWP286MB2697.JPNP286.PROD.OUTLOOK.COM","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"17 Dec 2025 15:16:27.8490\n (UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"7a57bee8-f73d-4c5f-a4f7-d72c91c8c111","X-MS-Exchange-CrossTenant-MailboxType":"HOSTED","X-MS-Exchange-CrossTenant-UserPrincipalName":"\n rZCPwkVbfM01GNYgQgawYUpK3R9IPRl5wui5KarEH1NkUKQyW0Hz7Fnwx2aUfm+JJZcvJ4HfOImh77bco1DW2Q==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"TYCP286MB2863"},"content":"Introduce struct ntb_transport_backend_ops to abstract queue setup and\nenqueue/poll operations. The existing implementation is moved behind\nthis interface, and a later patch will introduce an alternative backend\nimplementation.\n\nNo functional changes.\n\nSigned-off-by: Koichiro Den <den@valinux.co.jp>\n---\n drivers/ntb/ntb_transport.c          | 133 ++++++++++++++++++---------\n drivers/ntb/ntb_transport_internal.h |  21 +++++\n 2 files changed, 112 insertions(+), 42 deletions(-)","diff":"diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c\nindex 3969fa29a5b9..bff8b41a0d3e 100644\n--- a/drivers/ntb/ntb_transport.c\n+++ b/drivers/ntb/ntb_transport.c\n@@ -348,15 +348,9 @@ void ntb_transport_unregister_client(struct ntb_transport_client *drv)\n }\n EXPORT_SYMBOL_GPL(ntb_transport_unregister_client);\n \n-static int ntb_qp_debugfs_stats_show(struct seq_file *s, void *v)\n+static void ntb_transport_default_debugfs_stats_show(struct seq_file *s,\n+\t\t\t\t\t\t     struct ntb_transport_qp *qp)\n {\n-\tstruct ntb_transport_qp *qp = s->private;\n-\n-\tif (!qp || !qp->link_is_up)\n-\t\treturn 0;\n-\n-\tseq_puts(s, \"\\nNTB QP stats:\\n\\n\");\n-\n \tseq_printf(s, \"rx_bytes - \\t%llu\\n\", qp->rx_bytes);\n \tseq_printf(s, \"rx_pkts - \\t%llu\\n\", qp->rx_pkts);\n \tseq_printf(s, \"rx_memcpy - \\t%llu\\n\", qp->rx_memcpy);\n@@ -386,6 +380,17 @@ static int ntb_qp_debugfs_stats_show(struct seq_file *s, void *v)\n \tseq_printf(s, \"Using TX DMA - \\t%s\\n\", qp->tx_dma_chan ? \"Yes\" : \"No\");\n \tseq_printf(s, \"Using RX DMA - \\t%s\\n\", qp->rx_dma_chan ? \"Yes\" : \"No\");\n \tseq_printf(s, \"QP Link - \\t%s\\n\", qp->link_is_up ? \"Up\" : \"Down\");\n+}\n+\n+static int ntb_qp_debugfs_stats_show(struct seq_file *s, void *v)\n+{\n+\tstruct ntb_transport_qp *qp = s->private;\n+\n+\tif (!qp || !qp->link_is_up)\n+\t\treturn 0;\n+\n+\tseq_puts(s, \"\\nNTB QP stats:\\n\\n\");\n+\tqp->transport->backend_ops.debugfs_stats_show(s, qp);\n \tseq_putc(s, '\\n');\n \n \treturn 0;\n@@ -440,8 +445,8 @@ struct ntb_queue_entry *ntb_list_mv(spinlock_t *lock, struct list_head *list,\n \treturn entry;\n }\n \n-static int ntb_transport_setup_qp_mw(struct ntb_transport_ctx *nt,\n-\t\t\t\t     unsigned int qp_num)\n+static int ntb_transport_default_setup_qp_mw(struct ntb_transport_ctx *nt,\n+\t\t\t\t\t     unsigned int qp_num)\n {\n \tstruct ntb_transport_qp *qp = &nt->qp_vec[qp_num];\n \tstruct ntb_transport_mw *mw;\n@@ -994,7 +999,7 @@ static void ntb_transport_link_work(struct work_struct *work)\n \tfor (i = 0; i < nt->qp_count; i++) {\n \t\tstruct ntb_transport_qp *qp = &nt->qp_vec[i];\n \n-\t\tntb_transport_setup_qp_mw(nt, i);\n+\t\tnt->backend_ops.setup_qp_mw(nt, i);\n \t\tntb_transport_setup_qp_peer_msi(nt, i);\n \n \t\tif (qp->client_ready)\n@@ -1095,6 +1100,46 @@ int ntb_transport_init_queue(struct ntb_transport_ctx *nt, unsigned int qp_num)\n \treturn 0;\n }\n \n+static unsigned int ntb_transport_default_tx_free_entry(struct ntb_transport_qp *qp)\n+{\n+\tunsigned int head = qp->tx_index;\n+\tunsigned int tail = qp->remote_rx_info->entry;\n+\n+\treturn tail >= head ? tail - head : qp->tx_max_entry + tail - head;\n+}\n+\n+static int ntb_transport_default_rx_enqueue(struct ntb_transport_qp *qp,\n+\t\t\t\t\t    struct ntb_queue_entry *entry)\n+{\n+\tntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, &qp->rx_pend_q);\n+\n+\tif (qp->active)\n+\t\ttasklet_schedule(&qp->rxc_db_work);\n+\n+\treturn 0;\n+}\n+\n+static void ntb_transport_default_rx_poll(struct ntb_transport_qp *qp);\n+static int ntb_transport_default_tx_enqueue(struct ntb_transport_qp *qp,\n+\t\t\t\t\t    struct ntb_queue_entry *entry,\n+\t\t\t\t\t    void *cb, void *data, unsigned int len,\n+\t\t\t\t\t    unsigned int flags);\n+\n+static const struct ntb_transport_backend_ops default_backend_ops = {\n+\t.setup_qp_mw = ntb_transport_default_setup_qp_mw,\n+\t.tx_free_entry = ntb_transport_default_tx_free_entry,\n+\t.tx_enqueue = ntb_transport_default_tx_enqueue,\n+\t.rx_enqueue = ntb_transport_default_rx_enqueue,\n+\t.rx_poll = ntb_transport_default_rx_poll,\n+\t.debugfs_stats_show = ntb_transport_default_debugfs_stats_show,\n+};\n+\n+static int ntb_transport_default_init(struct ntb_transport_ctx *nt)\n+{\n+\tnt->backend_ops = default_backend_ops;\n+\treturn 0;\n+}\n+\n static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)\n {\n \tstruct ntb_transport_ctx *nt;\n@@ -1129,6 +1174,10 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)\n \n \tnt->ndev = ndev;\n \n+\trc = ntb_transport_default_init(nt);\n+\tif (rc)\n+\t\treturn rc;\n+\n \t/*\n \t * If we are using MSI, and have at least one extra memory window,\n \t * we will reserve the last MW for the MSI window.\n@@ -1538,14 +1587,10 @@ static int ntb_process_rxc(struct ntb_transport_qp *qp)\n \treturn 0;\n }\n \n-static void ntb_transport_rxc_db(unsigned long data)\n+static void ntb_transport_default_rx_poll(struct ntb_transport_qp *qp)\n {\n-\tstruct ntb_transport_qp *qp = (void *)data;\n \tint rc, i;\n \n-\tdev_dbg(&qp->ndev->pdev->dev, \"%s: doorbell %d received\\n\",\n-\t\t__func__, qp->qp_num);\n-\n \t/* Limit the number of packets processed in a single interrupt to\n \t * provide fairness to others\n \t */\n@@ -1577,6 +1622,17 @@ static void ntb_transport_rxc_db(unsigned long data)\n \t}\n }\n \n+static void ntb_transport_rxc_db(unsigned long data)\n+{\n+\tstruct ntb_transport_qp *qp = (void *)data;\n+\tstruct ntb_transport_ctx *nt = qp->transport;\n+\n+\tdev_dbg(&qp->ndev->pdev->dev, \"%s: doorbell %d received\\n\",\n+\t\t__func__, qp->qp_num);\n+\n+\tnt->backend_ops.rx_poll(qp);\n+}\n+\n static void ntb_tx_copy_callback(void *data,\n \t\t\t\t const struct dmaengine_result *res)\n {\n@@ -1746,9 +1802,18 @@ static void ntb_async_tx(struct ntb_transport_qp *qp,\n \tqp->tx_memcpy++;\n }\n \n-static int ntb_process_tx(struct ntb_transport_qp *qp,\n-\t\t\t  struct ntb_queue_entry *entry)\n+static int ntb_transport_default_tx_enqueue(struct ntb_transport_qp *qp,\n+\t\t\t\t\t    struct ntb_queue_entry *entry,\n+\t\t\t\t\t    void *cb, void *data, unsigned int len,\n+\t\t\t\t\t    unsigned int flags)\n {\n+\tentry->cb_data = cb;\n+\tentry->buf = data;\n+\tentry->len = len;\n+\tentry->flags = flags;\n+\tentry->errors = 0;\n+\tentry->tx_index = 0;\n+\n \tif (!ntb_transport_tx_free_entry(qp)) {\n \t\tqp->tx_ring_full++;\n \t\treturn -EAGAIN;\n@@ -1775,6 +1840,7 @@ static int ntb_process_tx(struct ntb_transport_qp *qp,\n \n static void ntb_send_link_down(struct ntb_transport_qp *qp)\n {\n+\tstruct ntb_transport_ctx *nt = qp->transport;\n \tstruct pci_dev *pdev = qp->ndev->pdev;\n \tstruct ntb_queue_entry *entry;\n \tint i, rc;\n@@ -1794,12 +1860,7 @@ static void ntb_send_link_down(struct ntb_transport_qp *qp)\n \tif (!entry)\n \t\treturn;\n \n-\tentry->cb_data = NULL;\n-\tentry->buf = NULL;\n-\tentry->len = 0;\n-\tentry->flags = LINK_DOWN_FLAG;\n-\n-\trc = ntb_process_tx(qp, entry);\n+\trc = nt->backend_ops.tx_enqueue(qp, entry, NULL, NULL, 0, LINK_DOWN_FLAG);\n \tif (rc)\n \t\tdev_err(&pdev->dev, \"ntb: QP%d unable to send linkdown msg\\n\",\n \t\t\tqp->qp_num);\n@@ -2086,6 +2147,7 @@ EXPORT_SYMBOL_GPL(ntb_transport_rx_remove);\n int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data,\n \t\t\t     unsigned int len)\n {\n+\tstruct ntb_transport_ctx *nt = qp->transport;\n \tstruct ntb_queue_entry *entry;\n \n \tif (!qp)\n@@ -2103,12 +2165,7 @@ int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data,\n \tentry->errors = 0;\n \tentry->rx_index = 0;\n \n-\tntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, &qp->rx_pend_q);\n-\n-\tif (qp->active)\n-\t\ttasklet_schedule(&qp->rxc_db_work);\n-\n-\treturn 0;\n+\treturn nt->backend_ops.rx_enqueue(qp, entry);\n }\n EXPORT_SYMBOL_GPL(ntb_transport_rx_enqueue);\n \n@@ -2128,6 +2185,7 @@ EXPORT_SYMBOL_GPL(ntb_transport_rx_enqueue);\n int ntb_transport_tx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data,\n \t\t\t     unsigned int len)\n {\n+\tstruct ntb_transport_ctx *nt = qp->transport;\n \tstruct ntb_queue_entry *entry;\n \tint rc;\n \n@@ -2144,15 +2202,7 @@ int ntb_transport_tx_enqueue(struct ntb_transport_qp *qp, void *cb, void *data,\n \t\treturn -EBUSY;\n \t}\n \n-\tentry->cb_data = cb;\n-\tentry->buf = data;\n-\tentry->len = len;\n-\tentry->flags = 0;\n-\tentry->errors = 0;\n-\tentry->retries = 0;\n-\tentry->tx_index = 0;\n-\n-\trc = ntb_process_tx(qp, entry);\n+\trc = nt->backend_ops.tx_enqueue(qp, entry, cb, data, len, 0);\n \tif (rc)\n \t\tntb_list_add(&qp->ntb_tx_free_q_lock, &entry->entry,\n \t\t\t     &qp->tx_free_q);\n@@ -2274,10 +2324,9 @@ EXPORT_SYMBOL_GPL(ntb_transport_max_size);\n \n unsigned int ntb_transport_tx_free_entry(struct ntb_transport_qp *qp)\n {\n-\tunsigned int head = qp->tx_index;\n-\tunsigned int tail = qp->remote_rx_info->entry;\n+\tstruct ntb_transport_ctx *nt = qp->transport;\n \n-\treturn tail >= head ? tail - head : qp->tx_max_entry + tail - head;\n+\treturn nt->backend_ops.tx_free_entry(qp);\n }\n EXPORT_SYMBOL_GPL(ntb_transport_tx_free_entry);\n \ndiff --git a/drivers/ntb/ntb_transport_internal.h b/drivers/ntb/ntb_transport_internal.h\nindex 79c7dbcf6f91..33c06be36dfd 100644\n--- a/drivers/ntb/ntb_transport_internal.h\n+++ b/drivers/ntb/ntb_transport_internal.h\n@@ -120,12 +120,33 @@ struct ntb_transport_mw {\n \tdma_addr_t dma_addr;\n };\n \n+/**\n+ * struct ntb_transport_backend_ops - backend-specific transport hooks\n+ * @setup_qp_mw:    Set up memory windows for a given queue pair.\n+ * @tx_free_entry:  Return the number of free TX entries for the queue pair.\n+ * @tx_enqueue:     Backend-specific TX enqueue implementation.\n+ * @rx_enqueue:     Backend-specific RX enqueue implementation.\n+ * @rx_poll:        Poll for RX completions / push new RX buffers.\n+ * @debugfs_stats_show: Dump backend-specific statistics, if any.\n+ */\n+struct ntb_transport_backend_ops {\n+\tint (*setup_qp_mw)(struct ntb_transport_ctx *nt, unsigned int qp_num);\n+\tunsigned int (*tx_free_entry)(struct ntb_transport_qp *qp);\n+\tint (*tx_enqueue)(struct ntb_transport_qp *qp, struct ntb_queue_entry *entry,\n+\t\t\t  void *cb, void *data, unsigned int len, unsigned int flags);\n+\tint (*rx_enqueue)(struct ntb_transport_qp *qp, struct ntb_queue_entry *entry);\n+\tvoid (*rx_poll)(struct ntb_transport_qp *qp);\n+\tvoid (*debugfs_stats_show)(struct seq_file *s, struct ntb_transport_qp *qp);\n+};\n+\n struct ntb_transport_ctx {\n \tstruct list_head entry;\n \tstruct list_head client_devs;\n \n \tstruct ntb_dev *ndev;\n \n+\tstruct ntb_transport_backend_ops backend_ops;\n+\n \tstruct ntb_transport_mw *mw_vec;\n \tstruct ntb_transport_qp *qp_vec;\n \tunsigned int mw_count;\n","prefixes":["RFC","v3","16/35"]}