All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Frank Li <Frank.Li@nxp.com>, Jon Mason <jdmason@kudzu.us>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.15 204/317] PCI: endpoint: Support NTB transfer between RC and EP
Date: Sun, 24 Mar 2024 19:33:04 -0400	[thread overview]
Message-ID: <20240324233458.1352854-205-sashal@kernel.org> (raw)
In-Reply-To: <20240324233458.1352854-1-sashal@kernel.org>

From: Frank Li <Frank.Li@nxp.com>

[ Upstream commit e35f56bb03304abc92c928b641af41ca372966bb ]

Add NTB function driver and virtual PCI Bus and Virtual NTB driver
to implement communication between PCIe Root Port and PCIe EP devices

┌────────────┐         ┌─────────────────────────────────────┐
│            │         │                                     │
├────────────┤         │                      ┌──────────────┤
│ NTB        │         │                      │ NTB          │
│ NetDev     │         │                      │ NetDev       │
├────────────┤         │                      ├──────────────┤
│ NTB        │         │                      │ NTB          │
│ Transfer   │         │                      │ Transfer     │
├────────────┤         │                      ├──────────────┤
│            │         │                      │              │
│  PCI NTB   │         │                      │              │
│    EPF     │         │                      │              │
│   Driver   │         │                      │ PCI Virtual  │
│            │         ├───────────────┐      │ NTB Driver   │
│            │         │ PCI EP NTB    │◄────►│              │
│            │         │  FN Driver    │      │              │
├────────────┤         ├───────────────┤      ├──────────────┤
│            │         │               │      │              │
│  PCI Bus   │ ◄─────► │  PCI EP Bus   │      │  Virtual PCI │
│            │  PCI    │               │      │     Bus      │
└────────────┘         └───────────────┴──────┴──────────────┘
PCIe Root Port                        PCI EP

This driver includes 3 parts:
 1 PCI EP NTB function driver
 2 Virtual PCI bus
 3 PCI virtual NTB driver, which is loaded only by above virtual PCI bus

Signed-off-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
Stable-dep-of: aebfdfe39b93 ("NTB: fix possible name leak in ntb_register_device()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/pci/endpoint/functions/Kconfig        |   11 +
 drivers/pci/endpoint/functions/Makefile       |    1 +
 drivers/pci/endpoint/functions/pci-epf-vntb.c | 1424 +++++++++++++++++
 3 files changed, 1436 insertions(+)
 create mode 100644 drivers/pci/endpoint/functions/pci-epf-vntb.c

diff --git a/drivers/pci/endpoint/functions/Kconfig b/drivers/pci/endpoint/functions/Kconfig
index 5f1242ca2f4e4..65217428d17b9 100644
--- a/drivers/pci/endpoint/functions/Kconfig
+++ b/drivers/pci/endpoint/functions/Kconfig
@@ -25,3 +25,14 @@ config PCI_EPF_NTB
 	  device tree.
 
 	  If in doubt, say "N" to disable Endpoint NTB driver.
+
+config PCI_EPF_VNTB
+        tristate "PCI Endpoint NTB driver"
+        depends on PCI_ENDPOINT
+        select CONFIGFS_FS
+        help
+          Select this configuration option to enable the Non-Transparent
+          Bridge (NTB) driver for PCIe Endpoint. NTB driver implements NTB
+          between PCI Root Port and PCIe Endpoint.
+
+          If in doubt, say "N" to disable Endpoint NTB driver.
diff --git a/drivers/pci/endpoint/functions/Makefile b/drivers/pci/endpoint/functions/Makefile
index 96ab932a537a2..5c13001deaba1 100644
--- a/drivers/pci/endpoint/functions/Makefile
+++ b/drivers/pci/endpoint/functions/Makefile
@@ -5,3 +5,4 @@
 
 obj-$(CONFIG_PCI_EPF_TEST)		+= pci-epf-test.o
 obj-$(CONFIG_PCI_EPF_NTB)		+= pci-epf-ntb.o
+obj-$(CONFIG_PCI_EPF_VNTB) 		+= pci-epf-vntb.o
diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
new file mode 100644
index 0000000000000..1466dd1904175
--- /dev/null
+++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
@@ -0,0 +1,1424 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Endpoint Function Driver to implement Non-Transparent Bridge functionality
+ * Between PCI RC and EP
+ *
+ * Copyright (C) 2020 Texas Instruments
+ * Copyright (C) 2022 NXP
+ *
+ * Based on pci-epf-ntb.c
+ * Author: Frank Li <Frank.Li@nxp.com>
+ * Author: Kishon Vijay Abraham I <kishon@ti.com>
+ */
+
+/**
+ * +------------+         +---------------------------------------+
+ * |            |         |                                       |
+ * +------------+         |                        +--------------+
+ * | NTB        |         |                        | NTB          |
+ * | NetDev     |         |                        | NetDev       |
+ * +------------+         |                        +--------------+
+ * | NTB        |         |                        | NTB          |
+ * | Transfer   |         |                        | Transfer     |
+ * +------------+         |                        +--------------+
+ * |            |         |                        |              |
+ * |  PCI NTB   |         |                        |              |
+ * |    EPF     |         |                        |              |
+ * |   Driver   |         |                        | PCI Virtual  |
+ * |            |         +---------------+        | NTB Driver   |
+ * |            |         | PCI EP NTB    |<------>|              |
+ * |            |         |  FN Driver    |        |              |
+ * +------------+         +---------------+        +--------------+
+ * |            |         |               |        |              |
+ * |  PCI Bus   | <-----> |  PCI EP Bus   |        |  Virtual PCI |
+ * |            |  PCI    |               |        |     Bus      |
+ * +------------+         +---------------+--------+--------------+
+ * PCIe Root Port                        PCI EP
+ */
+
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+
+#include <linux/pci-epc.h>
+#include <linux/pci-epf.h>
+#include <linux/ntb.h>
+
+static struct workqueue_struct *kpcintb_workqueue;
+
+#define COMMAND_CONFIGURE_DOORBELL	1
+#define COMMAND_TEARDOWN_DOORBELL	2
+#define COMMAND_CONFIGURE_MW		3
+#define COMMAND_TEARDOWN_MW		4
+#define COMMAND_LINK_UP			5
+#define COMMAND_LINK_DOWN		6
+
+#define COMMAND_STATUS_OK		1
+#define COMMAND_STATUS_ERROR		2
+
+#define LINK_STATUS_UP			BIT(0)
+
+#define SPAD_COUNT			64
+#define DB_COUNT			4
+#define NTB_MW_OFFSET			2
+#define DB_COUNT_MASK			GENMASK(15, 0)
+#define MSIX_ENABLE			BIT(16)
+#define MAX_DB_COUNT			32
+#define MAX_MW				4
+
+enum epf_ntb_bar {
+	BAR_CONFIG,
+	BAR_DB,
+	BAR_MW0,
+	BAR_MW1,
+	BAR_MW2,
+};
+
+/*
+ * +--------------------------------------------------+ Base
+ * |                                                  |
+ * |                                                  |
+ * |                                                  |
+ * |          Common Control Register                 |
+ * |                                                  |
+ * |                                                  |
+ * |                                                  |
+ * +-----------------------+--------------------------+ Base+span_offset
+ * |                       |                          |
+ * |    Peer Span Space    |    Span Space            |
+ * |                       |                          |
+ * |                       |                          |
+ * +-----------------------+--------------------------+ Base+span_offset
+ * |                       |                          |     +span_count * 4
+ * |                       |                          |
+ * |     Span Space        |   Peer Span Space        |
+ * |                       |                          |
+ * +-----------------------+--------------------------+
+ *       Virtual PCI             PCIe Endpoint
+ *       NTB Driver               NTB Driver
+ */
+struct epf_ntb_ctrl {
+	u32     command;
+	u32     argument;
+	u16     command_status;
+	u16     link_status;
+	u32     topology;
+	u64     addr;
+	u64     size;
+	u32     num_mws;
+	u32	reserved;
+	u32     spad_offset;
+	u32     spad_count;
+	u32	db_entry_size;
+	u32     db_data[MAX_DB_COUNT];
+	u32     db_offset[MAX_DB_COUNT];
+} __packed;
+
+struct epf_ntb {
+	struct ntb_dev ntb;
+	struct pci_epf *epf;
+	struct config_group group;
+
+	u32 num_mws;
+	u32 db_count;
+	u32 spad_count;
+	u64 mws_size[MAX_MW];
+	u64 db;
+	u32 vbus_number;
+	u16 vntb_pid;
+	u16 vntb_vid;
+
+	bool linkup;
+	u32 spad_size;
+
+	enum pci_barno epf_ntb_bar[6];
+
+	struct epf_ntb_ctrl *reg;
+
+	phys_addr_t epf_db_phy;
+	void __iomem *epf_db;
+
+	phys_addr_t vpci_mw_phy[MAX_MW];
+	void __iomem *vpci_mw_addr[MAX_MW];
+
+	struct delayed_work cmd_handler;
+};
+
+#define to_epf_ntb(epf_group) container_of((epf_group), struct epf_ntb, group)
+#define ntb_ndev(__ntb) container_of(__ntb, struct epf_ntb, ntb)
+
+static struct pci_epf_header epf_ntb_header = {
+	.vendorid	= PCI_ANY_ID,
+	.deviceid	= PCI_ANY_ID,
+	.baseclass_code	= PCI_BASE_CLASS_MEMORY,
+	.interrupt_pin	= PCI_INTERRUPT_INTA,
+};
+
+/**
+ * epf_ntb_link_up() - Raise link_up interrupt to Virtual Host
+ * @ntb: NTB device that facilitates communication between HOST and VHOST
+ * @link_up: true or false indicating Link is UP or Down
+ *
+ * Once NTB function in HOST invoke ntb_link_enable(),
+ * this NTB function driver will trigger a link event to vhost.
+ */
+static int epf_ntb_link_up(struct epf_ntb *ntb, bool link_up)
+{
+	if (link_up)
+		ntb->reg->link_status |= LINK_STATUS_UP;
+	else
+		ntb->reg->link_status &= ~LINK_STATUS_UP;
+
+	ntb_link_event(&ntb->ntb);
+	return 0;
+}
+
+/**
+ * epf_ntb_configure_mw() - Configure the Outbound Address Space for vhost
+ *   to access the memory window of host
+ * @ntb: NTB device that facilitates communication between host and vhost
+ * @mw: Index of the memory window (either 0, 1, 2 or 3)
+ *
+ *                          EP Outbound Window
+ * +--------+              +-----------+
+ * |        |              |           |
+ * |        |              |           |
+ * |        |              |           |
+ * |        |              |           |
+ * |        |              +-----------+
+ * | Virtual|              | Memory Win|
+ * | NTB    | -----------> |           |
+ * | Driver |              |           |
+ * |        |              +-----------+
+ * |        |              |           |
+ * |        |              |           |
+ * +--------+              +-----------+
+ *  VHost                   PCI EP
+ */
+static int epf_ntb_configure_mw(struct epf_ntb *ntb, u32 mw)
+{
+	phys_addr_t phys_addr;
+	u8 func_no, vfunc_no;
+	u64 addr, size;
+	int ret = 0;
+
+	phys_addr = ntb->vpci_mw_phy[mw];
+	addr = ntb->reg->addr;
+	size = ntb->reg->size;
+
+	func_no = ntb->epf->func_no;
+	vfunc_no = ntb->epf->vfunc_no;
+
+	ret = pci_epc_map_addr(ntb->epf->epc, func_no, vfunc_no, phys_addr, addr, size);
+	if (ret)
+		dev_err(&ntb->epf->epc->dev,
+			"Failed to map memory window %d address\n", mw);
+	return ret;
+}
+
+/**
+ * epf_ntb_teardown_mw() - Teardown the configured OB ATU
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ * @mw: Index of the memory window (either 0, 1, 2 or 3)
+ *
+ * Teardown the configured OB ATU configured in epf_ntb_configure_mw() using
+ * pci_epc_unmap_addr()
+ */
+static void epf_ntb_teardown_mw(struct epf_ntb *ntb, u32 mw)
+{
+	pci_epc_unmap_addr(ntb->epf->epc,
+			   ntb->epf->func_no,
+			   ntb->epf->vfunc_no,
+			   ntb->vpci_mw_phy[mw]);
+}
+
+/**
+ * epf_ntb_cmd_handler() - Handle commands provided by the NTB Host
+ * @work: work_struct for the epf_ntb_epc
+ *
+ * Workqueue function that gets invoked for the two epf_ntb_epc
+ * periodically (once every 5ms) to see if it has received any commands
+ * from NTB host. The host can send commands to configure doorbell or
+ * configure memory window or to update link status.
+ */
+static void epf_ntb_cmd_handler(struct work_struct *work)
+{
+	struct epf_ntb_ctrl *ctrl;
+	u32 command, argument;
+	struct epf_ntb *ntb;
+	struct device *dev;
+	int ret;
+	int i;
+
+	ntb = container_of(work, struct epf_ntb, cmd_handler.work);
+
+	for (i = 1; i < ntb->db_count; i++) {
+		if (readl(ntb->epf_db + i * 4)) {
+			if (readl(ntb->epf_db + i * 4))
+				ntb->db |= 1 << (i - 1);
+
+			ntb_db_event(&ntb->ntb, i);
+			writel(0, ntb->epf_db + i * 4);
+		}
+	}
+
+	ctrl = ntb->reg;
+	command = ctrl->command;
+	if (!command)
+		goto reset_handler;
+	argument = ctrl->argument;
+
+	ctrl->command = 0;
+	ctrl->argument = 0;
+
+	ctrl = ntb->reg;
+	dev = &ntb->epf->dev;
+
+	switch (command) {
+	case COMMAND_CONFIGURE_DOORBELL:
+		ctrl->command_status = COMMAND_STATUS_OK;
+		break;
+	case COMMAND_TEARDOWN_DOORBELL:
+		ctrl->command_status = COMMAND_STATUS_OK;
+		break;
+	case COMMAND_CONFIGURE_MW:
+		ret = epf_ntb_configure_mw(ntb, argument);
+		if (ret < 0)
+			ctrl->command_status = COMMAND_STATUS_ERROR;
+		else
+			ctrl->command_status = COMMAND_STATUS_OK;
+		break;
+	case COMMAND_TEARDOWN_MW:
+		epf_ntb_teardown_mw(ntb, argument);
+		ctrl->command_status = COMMAND_STATUS_OK;
+		break;
+	case COMMAND_LINK_UP:
+		ntb->linkup = true;
+		ret = epf_ntb_link_up(ntb, true);
+		if (ret < 0)
+			ctrl->command_status = COMMAND_STATUS_ERROR;
+		else
+			ctrl->command_status = COMMAND_STATUS_OK;
+		goto reset_handler;
+	case COMMAND_LINK_DOWN:
+		ntb->linkup = false;
+		ret = epf_ntb_link_up(ntb, false);
+		if (ret < 0)
+			ctrl->command_status = COMMAND_STATUS_ERROR;
+		else
+			ctrl->command_status = COMMAND_STATUS_OK;
+		break;
+	default:
+		dev_err(dev, "UNKNOWN command: %d\n", command);
+		break;
+	}
+
+reset_handler:
+	queue_delayed_work(kpcintb_workqueue, &ntb->cmd_handler,
+			   msecs_to_jiffies(5));
+}
+
+/**
+ * epf_ntb_config_sspad_bar_clear() - Clear Config + Self scratchpad BAR
+ * @ntb_epc: EPC associated with one of the HOST which holds peer's outbound
+ *	     address.
+ *
+ * Clear BAR0 of EP CONTROLLER 1 which contains the HOST1's config and
+ * self scratchpad region (removes inbound ATU configuration). While BAR0 is
+ * the default self scratchpad BAR, an NTB could have other BARs for self
+ * scratchpad (because of reserved BARs). This function can get the exact BAR
+ * used for self scratchpad from epf_ntb_bar[BAR_CONFIG].
+ *
+ * Please note the self scratchpad region and config region is combined to
+ * a single region and mapped using the same BAR. Also note HOST2's peer
+ * scratchpad is HOST1's self scratchpad.
+ */
+static void epf_ntb_config_sspad_bar_clear(struct epf_ntb *ntb)
+{
+	struct pci_epf_bar *epf_bar;
+	enum pci_barno barno;
+
+	barno = ntb->epf_ntb_bar[BAR_CONFIG];
+	epf_bar = &ntb->epf->bar[barno];
+
+	pci_epc_clear_bar(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no, epf_bar);
+}
+
+/**
+ * epf_ntb_config_sspad_bar_set() - Set Config + Self scratchpad BAR
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ *
+ * Map BAR0 of EP CONTROLLER 1 which contains the HOST1's config and
+ * self scratchpad region.
+ *
+ * Please note the self scratchpad region and config region is combined to
+ * a single region and mapped using the same BAR.
+ */
+static int epf_ntb_config_sspad_bar_set(struct epf_ntb *ntb)
+{
+	struct pci_epf_bar *epf_bar;
+	enum pci_barno barno;
+	u8 func_no, vfunc_no;
+	struct device *dev;
+	int ret;
+
+	dev = &ntb->epf->dev;
+	func_no = ntb->epf->func_no;
+	vfunc_no = ntb->epf->vfunc_no;
+	barno = ntb->epf_ntb_bar[BAR_CONFIG];
+	epf_bar = &ntb->epf->bar[barno];
+
+	ret = pci_epc_set_bar(ntb->epf->epc, func_no, vfunc_no, epf_bar);
+	if (ret) {
+		dev_err(dev, "inft: Config/Status/SPAD BAR set failed\n");
+		return ret;
+	}
+	return 0;
+}
+
+/**
+ * epf_ntb_config_spad_bar_free() - Free the physical memory associated with
+ *   config + scratchpad region
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ */
+static void epf_ntb_config_spad_bar_free(struct epf_ntb *ntb)
+{
+	enum pci_barno barno;
+
+	barno = ntb->epf_ntb_bar[BAR_CONFIG];
+	pci_epf_free_space(ntb->epf, ntb->reg, barno, 0);
+}
+
+/**
+ * epf_ntb_config_spad_bar_alloc() - Allocate memory for config + scratchpad
+ *   region
+ * @ntb: NTB device that facilitates communication between HOST1 and HOST2
+ *
+ * Allocate the Local Memory mentioned in the above diagram. The size of
+ * CONFIG REGION is sizeof(struct epf_ntb_ctrl) and size of SCRATCHPAD REGION
+ * is obtained from "spad-count" configfs entry.
+ */
+static int epf_ntb_config_spad_bar_alloc(struct epf_ntb *ntb)
+{
+	size_t align;
+	enum pci_barno barno;
+	struct epf_ntb_ctrl *ctrl;
+	u32 spad_size, ctrl_size;
+	u64 size;
+	struct pci_epf *epf = ntb->epf;
+	struct device *dev = &epf->dev;
+	u32 spad_count;
+	void *base;
+	int i;
+	const struct pci_epc_features *epc_features = pci_epc_get_features(epf->epc,
+								epf->func_no,
+								epf->vfunc_no);
+	barno = ntb->epf_ntb_bar[BAR_CONFIG];
+	size = epc_features->bar_fixed_size[barno];
+	align = epc_features->align;
+
+	if ((!IS_ALIGNED(size, align)))
+		return -EINVAL;
+
+	spad_count = ntb->spad_count;
+
+	ctrl_size = sizeof(struct epf_ntb_ctrl);
+	spad_size = 2 * spad_count * 4;
+
+	if (!align) {
+		ctrl_size = roundup_pow_of_two(ctrl_size);
+		spad_size = roundup_pow_of_two(spad_size);
+	} else {
+		ctrl_size = ALIGN(ctrl_size, align);
+		spad_size = ALIGN(spad_size, align);
+	}
+
+	if (!size)
+		size = ctrl_size + spad_size;
+	else if (size < ctrl_size + spad_size)
+		return -EINVAL;
+
+	base = pci_epf_alloc_space(epf, size, barno, align, 0);
+	if (!base) {
+		dev_err(dev, "Config/Status/SPAD alloc region fail\n");
+		return -ENOMEM;
+	}
+
+	ntb->reg = base;
+
+	ctrl = ntb->reg;
+	ctrl->spad_offset = ctrl_size;
+
+	ctrl->spad_count = spad_count;
+	ctrl->num_mws = ntb->num_mws;
+	ntb->spad_size = spad_size;
+
+	ctrl->db_entry_size = 4;
+
+	for (i = 0; i < ntb->db_count; i++) {
+		ntb->reg->db_data[i] = 1 + i;
+		ntb->reg->db_offset[i] = 0;
+	}
+
+	return 0;
+}
+
+/**
+ * epf_ntb_configure_interrupt() - Configure MSI/MSI-X capaiblity
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ *
+ * Configure MSI/MSI-X capability for each interface with number of
+ * interrupts equal to "db_count" configfs entry.
+ */
+static int epf_ntb_configure_interrupt(struct epf_ntb *ntb)
+{
+	const struct pci_epc_features *epc_features;
+	struct device *dev;
+	u32 db_count;
+	int ret;
+
+	dev = &ntb->epf->dev;
+
+	epc_features = pci_epc_get_features(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no);
+
+	if (!(epc_features->msix_capable || epc_features->msi_capable)) {
+		dev_err(dev, "MSI or MSI-X is required for doorbell\n");
+		return -EINVAL;
+	}
+
+	db_count = ntb->db_count;
+	if (db_count > MAX_DB_COUNT) {
+		dev_err(dev, "DB count cannot be more than %d\n", MAX_DB_COUNT);
+		return -EINVAL;
+	}
+
+	ntb->db_count = db_count;
+
+	if (epc_features->msi_capable) {
+		ret = pci_epc_set_msi(ntb->epf->epc,
+				      ntb->epf->func_no,
+				      ntb->epf->vfunc_no,
+				      16);
+		if (ret) {
+			dev_err(dev, "MSI configuration failed\n");
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
+/**
+ * epf_ntb_db_bar_init() - Configure Doorbell window BARs
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ */
+static int epf_ntb_db_bar_init(struct epf_ntb *ntb)
+{
+	const struct pci_epc_features *epc_features;
+	u32 align;
+	struct device *dev = &ntb->epf->dev;
+	int ret;
+	struct pci_epf_bar *epf_bar;
+	void __iomem *mw_addr;
+	enum pci_barno barno;
+	size_t size = 4 * ntb->db_count;
+
+	epc_features = pci_epc_get_features(ntb->epf->epc,
+					    ntb->epf->func_no,
+					    ntb->epf->vfunc_no);
+	align = epc_features->align;
+
+	if (size < 128)
+		size = 128;
+
+	if (align)
+		size = ALIGN(size, align);
+	else
+		size = roundup_pow_of_two(size);
+
+	barno = ntb->epf_ntb_bar[BAR_DB];
+
+	mw_addr = pci_epf_alloc_space(ntb->epf, size, barno, align, 0);
+	if (!mw_addr) {
+		dev_err(dev, "Failed to allocate OB address\n");
+		return -ENOMEM;
+	}
+
+	ntb->epf_db = mw_addr;
+
+	epf_bar = &ntb->epf->bar[barno];
+
+	ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no, epf_bar);
+	if (ret) {
+		dev_err(dev, "Doorbell BAR set failed\n");
+			goto err_alloc_peer_mem;
+	}
+	return ret;
+
+err_alloc_peer_mem:
+	pci_epc_mem_free_addr(ntb->epf->epc, epf_bar->phys_addr, mw_addr, epf_bar->size);
+	return -1;
+}
+
+/**
+ * epf_ntb_db_bar_clear() - Clear doorbell BAR and free memory
+ *   allocated in peer's outbound address space
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ */
+static void epf_ntb_db_bar_clear(struct epf_ntb *ntb)
+{
+	enum pci_barno barno;
+
+	barno = ntb->epf_ntb_bar[BAR_DB];
+	pci_epf_free_space(ntb->epf, ntb->epf_db, barno, 0);
+	pci_epc_clear_bar(ntb->epf->epc,
+			  ntb->epf->func_no,
+			  ntb->epf->vfunc_no,
+			  &ntb->epf->bar[barno]);
+}
+
+/**
+ * epf_ntb_mw_bar_init() - Configure Memory window BARs
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ *
+ */
+static int epf_ntb_mw_bar_init(struct epf_ntb *ntb)
+{
+	int ret = 0;
+	int i;
+	u64 size;
+	enum pci_barno barno;
+	struct device *dev = &ntb->epf->dev;
+
+	for (i = 0; i < ntb->num_mws; i++) {
+		size = ntb->mws_size[i];
+		barno = ntb->epf_ntb_bar[BAR_MW0 + i];
+
+		ntb->epf->bar[barno].barno = barno;
+		ntb->epf->bar[barno].size = size;
+		ntb->epf->bar[barno].addr = 0;
+		ntb->epf->bar[barno].phys_addr = 0;
+		ntb->epf->bar[barno].flags |= upper_32_bits(size) ?
+				PCI_BASE_ADDRESS_MEM_TYPE_64 :
+				PCI_BASE_ADDRESS_MEM_TYPE_32;
+
+		ret = pci_epc_set_bar(ntb->epf->epc,
+				      ntb->epf->func_no,
+				      ntb->epf->vfunc_no,
+				      &ntb->epf->bar[barno]);
+		if (ret) {
+			dev_err(dev, "MW set failed\n");
+			goto err_alloc_mem;
+		}
+
+		/* Allocate EPC outbound memory windows to vpci vntb device */
+		ntb->vpci_mw_addr[i] = pci_epc_mem_alloc_addr(ntb->epf->epc,
+							      &ntb->vpci_mw_phy[i],
+							      size);
+		if (!ntb->vpci_mw_addr[i]) {
+			dev_err(dev, "Failed to allocate source address\n");
+			goto err_alloc_mem;
+		}
+	}
+
+	return ret;
+err_alloc_mem:
+	return ret;
+}
+
+/**
+ * epf_ntb_mw_bar_clear() - Clear Memory window BARs
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ */
+static void epf_ntb_mw_bar_clear(struct epf_ntb *ntb)
+{
+	enum pci_barno barno;
+	int i;
+
+	for (i = 0; i < ntb->num_mws; i++) {
+		barno = ntb->epf_ntb_bar[BAR_MW0 + i];
+		pci_epc_clear_bar(ntb->epf->epc,
+				  ntb->epf->func_no,
+				  ntb->epf->vfunc_no,
+				  &ntb->epf->bar[barno]);
+
+		pci_epc_mem_free_addr(ntb->epf->epc,
+				      ntb->vpci_mw_phy[i],
+				      ntb->vpci_mw_addr[i],
+				      ntb->mws_size[i]);
+	}
+}
+
+/**
+ * epf_ntb_epc_destroy() - Cleanup NTB EPC interface
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ *
+ * Wrapper for epf_ntb_epc_destroy_interface() to cleanup all the NTB interfaces
+ */
+static void epf_ntb_epc_destroy(struct epf_ntb *ntb)
+{
+	pci_epc_remove_epf(ntb->epf->epc, ntb->epf, 0);
+	pci_epc_put(ntb->epf->epc);
+}
+
+/**
+ * epf_ntb_init_epc_bar() - Identify BARs to be used for each of the NTB
+ * constructs (scratchpad region, doorbell, memorywindow)
+ * @ntb: NTB device that facilitates communication between HOST and vHOST
+ */
+static int epf_ntb_init_epc_bar(struct epf_ntb *ntb)
+{
+	const struct pci_epc_features *epc_features;
+	enum pci_barno barno;
+	enum epf_ntb_bar bar;
+	struct device *dev;
+	u32 num_mws;
+	int i;
+
+	barno = BAR_0;
+	num_mws = ntb->num_mws;
+	dev = &ntb->epf->dev;
+	epc_features = pci_epc_get_features(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no);
+
+	/* These are required BARs which are mandatory for NTB functionality */
+	for (bar = BAR_CONFIG; bar <= BAR_MW0; bar++, barno++) {
+		barno = pci_epc_get_next_free_bar(epc_features, barno);
+		if (barno < 0) {
+			dev_err(dev, "Fail to get NTB function BAR\n");
+			return barno;
+		}
+		ntb->epf_ntb_bar[bar] = barno;
+	}
+
+	/* These are optional BARs which don't impact NTB functionality */
+	for (bar = BAR_MW1, i = 1; i < num_mws; bar++, barno++, i++) {
+		barno = pci_epc_get_next_free_bar(epc_features, barno);
+		if (barno < 0) {
+			ntb->num_mws = i;
+			dev_dbg(dev, "BAR not available for > MW%d\n", i + 1);
+		}
+		ntb->epf_ntb_bar[bar] = barno;
+	}
+
+	return 0;
+}
+
+/**
+ * epf_ntb_epc_init() - Initialize NTB interface
+ * @ntb: NTB device that facilitates communication between HOST and vHOST2
+ *
+ * Wrapper to initialize a particular EPC interface and start the workqueue
+ * to check for commands from host. This function will write to the
+ * EP controller HW for configuring it.
+ */
+static int epf_ntb_epc_init(struct epf_ntb *ntb)
+{
+	u8 func_no, vfunc_no;
+	struct pci_epc *epc;
+	struct pci_epf *epf;
+	struct device *dev;
+	int ret;
+
+	epf = ntb->epf;
+	dev = &epf->dev;
+	epc = epf->epc;
+	func_no = ntb->epf->func_no;
+	vfunc_no = ntb->epf->vfunc_no;
+
+	ret = epf_ntb_config_sspad_bar_set(ntb);
+	if (ret) {
+		dev_err(dev, "Config/self SPAD BAR init failed");
+		return ret;
+	}
+
+	ret = epf_ntb_configure_interrupt(ntb);
+	if (ret) {
+		dev_err(dev, "Interrupt configuration failed\n");
+		goto err_config_interrupt;
+	}
+
+	ret = epf_ntb_db_bar_init(ntb);
+	if (ret) {
+		dev_err(dev, "DB BAR init failed\n");
+		goto err_db_bar_init;
+	}
+
+	ret = epf_ntb_mw_bar_init(ntb);
+	if (ret) {
+		dev_err(dev, "MW BAR init failed\n");
+		goto err_mw_bar_init;
+	}
+
+	if (vfunc_no <= 1) {
+		ret = pci_epc_write_header(epc, func_no, vfunc_no, epf->header);
+		if (ret) {
+			dev_err(dev, "Configuration header write failed\n");
+			goto err_write_header;
+		}
+	}
+
+	INIT_DELAYED_WORK(&ntb->cmd_handler, epf_ntb_cmd_handler);
+	queue_work(kpcintb_workqueue, &ntb->cmd_handler.work);
+
+	return 0;
+
+err_write_header:
+	epf_ntb_mw_bar_clear(ntb);
+err_mw_bar_init:
+	epf_ntb_db_bar_clear(ntb);
+err_db_bar_init:
+err_config_interrupt:
+	epf_ntb_config_sspad_bar_clear(ntb);
+
+	return ret;
+}
+
+
+/**
+ * epf_ntb_epc_cleanup() - Cleanup all NTB interfaces
+ * @ntb: NTB device that facilitates communication between HOST1 and HOST2
+ *
+ * Wrapper to cleanup all NTB interfaces.
+ */
+static void epf_ntb_epc_cleanup(struct epf_ntb *ntb)
+{
+	epf_ntb_db_bar_clear(ntb);
+	epf_ntb_mw_bar_clear(ntb);
+}
+
+#define EPF_NTB_R(_name)						\
+static ssize_t epf_ntb_##_name##_show(struct config_item *item,		\
+				      char *page)			\
+{									\
+	struct config_group *group = to_config_group(item);		\
+	struct epf_ntb *ntb = to_epf_ntb(group);			\
+									\
+	return sprintf(page, "%d\n", ntb->_name);			\
+}
+
+#define EPF_NTB_W(_name)						\
+static ssize_t epf_ntb_##_name##_store(struct config_item *item,	\
+				       const char *page, size_t len)	\
+{									\
+	struct config_group *group = to_config_group(item);		\
+	struct epf_ntb *ntb = to_epf_ntb(group);			\
+	u32 val;							\
+	int ret;							\
+									\
+	ret = kstrtou32(page, 0, &val);					\
+	if (ret)							\
+		return ret;						\
+									\
+	ntb->_name = val;						\
+									\
+	return len;							\
+}
+
+#define EPF_NTB_MW_R(_name)						\
+static ssize_t epf_ntb_##_name##_show(struct config_item *item,		\
+				      char *page)			\
+{									\
+	struct config_group *group = to_config_group(item);		\
+	struct epf_ntb *ntb = to_epf_ntb(group);			\
+	int win_no;							\
+									\
+	sscanf(#_name, "mw%d", &win_no);				\
+									\
+	return sprintf(page, "%lld\n", ntb->mws_size[win_no - 1]);	\
+}
+
+#define EPF_NTB_MW_W(_name)						\
+static ssize_t epf_ntb_##_name##_store(struct config_item *item,	\
+				       const char *page, size_t len)	\
+{									\
+	struct config_group *group = to_config_group(item);		\
+	struct epf_ntb *ntb = to_epf_ntb(group);			\
+	struct device *dev = &ntb->epf->dev;				\
+	int win_no;							\
+	u64 val;							\
+	int ret;							\
+									\
+	ret = kstrtou64(page, 0, &val);					\
+	if (ret)							\
+		return ret;						\
+									\
+	if (sscanf(#_name, "mw%d", &win_no) != 1)			\
+		return -EINVAL;						\
+									\
+	if (ntb->num_mws < win_no) {					\
+		dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
+		return -EINVAL;						\
+	}								\
+									\
+	ntb->mws_size[win_no - 1] = val;				\
+									\
+	return len;							\
+}
+
+static ssize_t epf_ntb_num_mws_store(struct config_item *item,
+				     const char *page, size_t len)
+{
+	struct config_group *group = to_config_group(item);
+	struct epf_ntb *ntb = to_epf_ntb(group);
+	u32 val;
+	int ret;
+
+	ret = kstrtou32(page, 0, &val);
+	if (ret)
+		return ret;
+
+	if (val > MAX_MW)
+		return -EINVAL;
+
+	ntb->num_mws = val;
+
+	return len;
+}
+
+EPF_NTB_R(spad_count)
+EPF_NTB_W(spad_count)
+EPF_NTB_R(db_count)
+EPF_NTB_W(db_count)
+EPF_NTB_R(num_mws)
+EPF_NTB_R(vbus_number)
+EPF_NTB_W(vbus_number)
+EPF_NTB_R(vntb_pid)
+EPF_NTB_W(vntb_pid)
+EPF_NTB_R(vntb_vid)
+EPF_NTB_W(vntb_vid)
+EPF_NTB_MW_R(mw1)
+EPF_NTB_MW_W(mw1)
+EPF_NTB_MW_R(mw2)
+EPF_NTB_MW_W(mw2)
+EPF_NTB_MW_R(mw3)
+EPF_NTB_MW_W(mw3)
+EPF_NTB_MW_R(mw4)
+EPF_NTB_MW_W(mw4)
+
+CONFIGFS_ATTR(epf_ntb_, spad_count);
+CONFIGFS_ATTR(epf_ntb_, db_count);
+CONFIGFS_ATTR(epf_ntb_, num_mws);
+CONFIGFS_ATTR(epf_ntb_, mw1);
+CONFIGFS_ATTR(epf_ntb_, mw2);
+CONFIGFS_ATTR(epf_ntb_, mw3);
+CONFIGFS_ATTR(epf_ntb_, mw4);
+CONFIGFS_ATTR(epf_ntb_, vbus_number);
+CONFIGFS_ATTR(epf_ntb_, vntb_pid);
+CONFIGFS_ATTR(epf_ntb_, vntb_vid);
+
+static struct configfs_attribute *epf_ntb_attrs[] = {
+	&epf_ntb_attr_spad_count,
+	&epf_ntb_attr_db_count,
+	&epf_ntb_attr_num_mws,
+	&epf_ntb_attr_mw1,
+	&epf_ntb_attr_mw2,
+	&epf_ntb_attr_mw3,
+	&epf_ntb_attr_mw4,
+	&epf_ntb_attr_vbus_number,
+	&epf_ntb_attr_vntb_pid,
+	&epf_ntb_attr_vntb_vid,
+	NULL,
+};
+
+static const struct config_item_type ntb_group_type = {
+	.ct_attrs	= epf_ntb_attrs,
+	.ct_owner	= THIS_MODULE,
+};
+
+/**
+ * epf_ntb_add_cfs() - Add configfs directory specific to NTB
+ * @epf: NTB endpoint function device
+ * @group: A pointer to the config_group structure referencing a group of
+ *	   config_items of a specific type that belong to a specific sub-system.
+ *
+ * Add configfs directory specific to NTB. This directory will hold
+ * NTB specific properties like db_count, spad_count, num_mws etc.,
+ */
+static struct config_group *epf_ntb_add_cfs(struct pci_epf *epf,
+					    struct config_group *group)
+{
+	struct epf_ntb *ntb = epf_get_drvdata(epf);
+	struct config_group *ntb_group = &ntb->group;
+	struct device *dev = &epf->dev;
+
+	config_group_init_type_name(ntb_group, dev_name(dev), &ntb_group_type);
+
+	return ntb_group;
+}
+
+/*==== virtual PCI bus driver, which only load virtual NTB PCI driver ====*/
+
+static u32 pci_space[] = {
+	0xffffffff,	/*DeviceID, Vendor ID*/
+	0,		/*Status, Command*/
+	0xffffffff,	/*Class code, subclass, prog if, revision id*/
+	0x40,		/*bist, header type, latency Timer, cache line size*/
+	0,		/*BAR 0*/
+	0,		/*BAR 1*/
+	0,		/*BAR 2*/
+	0,		/*BAR 3*/
+	0,		/*BAR 4*/
+	0,		/*BAR 5*/
+	0,		/*Cardbus cis point*/
+	0,		/*Subsystem ID Subystem vendor id*/
+	0,		/*ROM Base Address*/
+	0,		/*Reserved, Cap. Point*/
+	0,		/*Reserved,*/
+	0,		/*Max Lat, Min Gnt, interrupt pin, interrupt line*/
+};
+
+int pci_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val)
+{
+	if (devfn == 0) {
+		memcpy(val, ((u8 *)pci_space) + where, size);
+		return PCIBIOS_SUCCESSFUL;
+	}
+	return PCIBIOS_DEVICE_NOT_FOUND;
+}
+
+int pci_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val)
+{
+	return 0;
+}
+
+struct pci_ops vpci_ops = {
+	.read = pci_read,
+	.write = pci_write,
+};
+
+static int vpci_scan_bus(void *sysdata)
+{
+	struct pci_bus *vpci_bus;
+	struct epf_ntb *ndev = sysdata;
+
+	vpci_bus = pci_scan_bus(ndev->vbus_number, &vpci_ops, sysdata);
+	if (vpci_bus)
+		pr_err("create pci bus\n");
+
+	pci_bus_add_devices(vpci_bus);
+
+	return 0;
+}
+
+/*==================== Virtual PCIe NTB driver ==========================*/
+
+static int vntb_epf_mw_count(struct ntb_dev *ntb, int pidx)
+{
+	struct epf_ntb *ndev = ntb_ndev(ntb);
+
+	return ndev->num_mws;
+}
+
+static int vntb_epf_spad_count(struct ntb_dev *ntb)
+{
+	return ntb_ndev(ntb)->spad_count;
+}
+
+static int vntb_epf_peer_mw_count(struct ntb_dev *ntb)
+{
+	return ntb_ndev(ntb)->num_mws;
+}
+
+static u64 vntb_epf_db_valid_mask(struct ntb_dev *ntb)
+{
+	return BIT_ULL(ntb_ndev(ntb)->db_count) - 1;
+}
+
+static int vntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits)
+{
+	return 0;
+}
+
+static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx,
+		dma_addr_t addr, resource_size_t size)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+	struct pci_epf_bar *epf_bar;
+	enum pci_barno barno;
+	int ret;
+	struct device *dev;
+
+	dev = &ntb->ntb.dev;
+	barno = ntb->epf_ntb_bar[BAR_MW0 + idx];
+	epf_bar = &ntb->epf->bar[barno];
+	epf_bar->phys_addr = addr;
+	epf_bar->barno = barno;
+	epf_bar->size = size;
+
+	ret = pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar);
+	if (ret) {
+		dev_err(dev, "failure set mw trans\n");
+		return ret;
+	}
+	return 0;
+}
+
+static int vntb_epf_mw_clear_trans(struct ntb_dev *ntb, int pidx, int idx)
+{
+	return 0;
+}
+
+static int vntb_epf_peer_mw_get_addr(struct ntb_dev *ndev, int idx,
+				phys_addr_t *base, resource_size_t *size)
+{
+
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+
+	if (base)
+		*base = ntb->vpci_mw_phy[idx];
+
+	if (size)
+		*size = ntb->mws_size[idx];
+
+	return 0;
+}
+
+static int vntb_epf_link_enable(struct ntb_dev *ntb,
+			enum ntb_speed max_speed,
+			enum ntb_width max_width)
+{
+	return 0;
+}
+
+static u32 vntb_epf_spad_read(struct ntb_dev *ndev, int idx)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+	int off = ntb->reg->spad_offset, ct = ntb->reg->spad_count * 4;
+	u32 val;
+	void __iomem *base = ntb->reg;
+
+	val = readl(base + off + ct + idx * 4);
+	return val;
+}
+
+static int vntb_epf_spad_write(struct ntb_dev *ndev, int idx, u32 val)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+	struct epf_ntb_ctrl *ctrl = ntb->reg;
+	int off = ctrl->spad_offset, ct = ctrl->spad_count * 4;
+	void __iomem *base = ntb->reg;
+
+	writel(val, base + off + ct + idx * 4);
+	return 0;
+}
+
+static u32 vntb_epf_peer_spad_read(struct ntb_dev *ndev, int pidx, int idx)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+	struct epf_ntb_ctrl *ctrl = ntb->reg;
+	int off = ctrl->spad_offset;
+	void __iomem *base = ntb->reg;
+	u32 val;
+
+	val = readl(base + off + idx * 4);
+	return val;
+}
+
+static int vntb_epf_peer_spad_write(struct ntb_dev *ndev, int pidx, int idx, u32 val)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+	struct epf_ntb_ctrl *ctrl = ntb->reg;
+	int off = ctrl->spad_offset;
+	void __iomem *base = ntb->reg;
+
+	writel(val, base + off + idx * 4);
+	return 0;
+}
+
+static int vntb_epf_peer_db_set(struct ntb_dev *ndev, u64 db_bits)
+{
+	u32 interrupt_num = ffs(db_bits) + 1;
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+	u8 func_no, vfunc_no;
+	int ret;
+
+	func_no = ntb->epf->func_no;
+	vfunc_no = ntb->epf->vfunc_no;
+
+	ret = pci_epc_raise_irq(ntb->epf->epc,
+				func_no,
+				vfunc_no,
+				PCI_EPC_IRQ_MSI,
+				interrupt_num + 1);
+	if (ret)
+		dev_err(&ntb->ntb.dev, "Failed to raise IRQ\n");
+
+	return ret;
+}
+
+static u64 vntb_epf_db_read(struct ntb_dev *ndev)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+
+	return ntb->db;
+}
+
+static int vntb_epf_mw_get_align(struct ntb_dev *ndev, int pidx, int idx,
+			resource_size_t *addr_align,
+			resource_size_t *size_align,
+			resource_size_t *size_max)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+
+	if (addr_align)
+		*addr_align = SZ_4K;
+
+	if (size_align)
+		*size_align = 1;
+
+	if (size_max)
+		*size_max = ntb->mws_size[idx];
+
+	return 0;
+}
+
+static u64 vntb_epf_link_is_up(struct ntb_dev *ndev,
+			enum ntb_speed *speed,
+			enum ntb_width *width)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+
+	return ntb->reg->link_status;
+}
+
+static int vntb_epf_db_clear_mask(struct ntb_dev *ndev, u64 db_bits)
+{
+	return 0;
+}
+
+static int vntb_epf_db_clear(struct ntb_dev *ndev, u64 db_bits)
+{
+	struct epf_ntb *ntb = ntb_ndev(ndev);
+
+	ntb->db &= ~db_bits;
+	return 0;
+}
+
+static int vntb_epf_link_disable(struct ntb_dev *ntb)
+{
+	return 0;
+}
+
+static const struct ntb_dev_ops vntb_epf_ops = {
+	.mw_count		= vntb_epf_mw_count,
+	.spad_count		= vntb_epf_spad_count,
+	.peer_mw_count		= vntb_epf_peer_mw_count,
+	.db_valid_mask		= vntb_epf_db_valid_mask,
+	.db_set_mask		= vntb_epf_db_set_mask,
+	.mw_set_trans		= vntb_epf_mw_set_trans,
+	.mw_clear_trans		= vntb_epf_mw_clear_trans,
+	.peer_mw_get_addr	= vntb_epf_peer_mw_get_addr,
+	.link_enable		= vntb_epf_link_enable,
+	.spad_read		= vntb_epf_spad_read,
+	.spad_write		= vntb_epf_spad_write,
+	.peer_spad_read		= vntb_epf_peer_spad_read,
+	.peer_spad_write	= vntb_epf_peer_spad_write,
+	.peer_db_set		= vntb_epf_peer_db_set,
+	.db_read		= vntb_epf_db_read,
+	.mw_get_align		= vntb_epf_mw_get_align,
+	.link_is_up		= vntb_epf_link_is_up,
+	.db_clear_mask		= vntb_epf_db_clear_mask,
+	.db_clear		= vntb_epf_db_clear,
+	.link_disable		= vntb_epf_link_disable,
+};
+
+static int pci_vntb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+	int ret;
+	struct epf_ntb *ndev = (struct epf_ntb *)pdev->sysdata;
+	struct device *dev = &pdev->dev;
+
+	ndev->ntb.pdev = pdev;
+	ndev->ntb.topo = NTB_TOPO_NONE;
+	ndev->ntb.ops =  &vntb_epf_ops;
+
+	ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
+	if (ret) {
+		dev_err(dev, "Cannot set DMA mask\n");
+		return -EINVAL;
+	}
+
+	ret = ntb_register_device(&ndev->ntb);
+	if (ret) {
+		dev_err(dev, "Failed to register NTB device\n");
+		goto err_register_dev;
+	}
+
+	dev_dbg(dev, "PCI Virtual NTB driver loaded\n");
+	return 0;
+
+err_register_dev:
+	return -EINVAL;
+}
+
+static struct pci_device_id pci_vntb_table[] = {
+	{
+		PCI_DEVICE(0xffff, 0xffff),
+	},
+	{},
+};
+
+static struct pci_driver vntb_pci_driver = {
+	.name           = "pci-vntb",
+	.id_table       = pci_vntb_table,
+	.probe          = pci_vntb_probe,
+};
+
+/* ============ PCIe EPF Driver Bind ====================*/
+
+/**
+ * epf_ntb_bind() - Initialize endpoint controller to provide NTB functionality
+ * @epf: NTB endpoint function device
+ *
+ * Initialize both the endpoint controllers associated with NTB function device.
+ * Invoked when a primary interface or secondary interface is bound to EPC
+ * device. This function will succeed only when EPC is bound to both the
+ * interfaces.
+ */
+static int epf_ntb_bind(struct pci_epf *epf)
+{
+	struct epf_ntb *ntb = epf_get_drvdata(epf);
+	struct device *dev = &epf->dev;
+	int ret;
+
+	if (!epf->epc) {
+		dev_dbg(dev, "PRIMARY EPC interface not yet bound\n");
+		return 0;
+	}
+
+	ret = epf_ntb_init_epc_bar(ntb);
+	if (ret) {
+		dev_err(dev, "Failed to create NTB EPC\n");
+		goto err_bar_init;
+	}
+
+	ret = epf_ntb_config_spad_bar_alloc(ntb);
+	if (ret) {
+		dev_err(dev, "Failed to allocate BAR memory\n");
+		goto err_bar_alloc;
+	}
+
+	ret = epf_ntb_epc_init(ntb);
+	if (ret) {
+		dev_err(dev, "Failed to initialize EPC\n");
+		goto err_bar_alloc;
+	}
+
+	epf_set_drvdata(epf, ntb);
+
+	pci_space[0] = (ntb->vntb_pid << 16) | ntb->vntb_vid;
+	pci_vntb_table[0].vendor = ntb->vntb_vid;
+	pci_vntb_table[0].device = ntb->vntb_pid;
+
+	if (pci_register_driver(&vntb_pci_driver)) {
+		dev_err(dev, "failure register vntb pci driver\n");
+		goto err_bar_alloc;
+	}
+
+	vpci_scan_bus(ntb);
+
+	return 0;
+
+err_bar_alloc:
+	epf_ntb_config_spad_bar_free(ntb);
+
+err_bar_init:
+	epf_ntb_epc_destroy(ntb);
+
+	return ret;
+}
+
+/**
+ * epf_ntb_unbind() - Cleanup the initialization from epf_ntb_bind()
+ * @epf: NTB endpoint function device
+ *
+ * Cleanup the initialization from epf_ntb_bind()
+ */
+static void epf_ntb_unbind(struct pci_epf *epf)
+{
+	struct epf_ntb *ntb = epf_get_drvdata(epf);
+
+	epf_ntb_epc_cleanup(ntb);
+	epf_ntb_config_spad_bar_free(ntb);
+	epf_ntb_epc_destroy(ntb);
+
+	pci_unregister_driver(&vntb_pci_driver);
+}
+
+// EPF driver probe
+static struct pci_epf_ops epf_ntb_ops = {
+	.bind   = epf_ntb_bind,
+	.unbind = epf_ntb_unbind,
+	.add_cfs = epf_ntb_add_cfs,
+};
+
+/**
+ * epf_ntb_probe() - Probe NTB function driver
+ * @epf: NTB endpoint function device
+ *
+ * Probe NTB function driver when endpoint function bus detects a NTB
+ * endpoint function.
+ */
+static int epf_ntb_probe(struct pci_epf *epf)
+{
+	struct epf_ntb *ntb;
+	struct device *dev;
+
+	dev = &epf->dev;
+
+	ntb = devm_kzalloc(dev, sizeof(*ntb), GFP_KERNEL);
+	if (!ntb)
+		return -ENOMEM;
+
+	epf->header = &epf_ntb_header;
+	ntb->epf = epf;
+	ntb->vbus_number = 0xff;
+	epf_set_drvdata(epf, ntb);
+
+	dev_info(dev, "pci-ep epf driver loaded\n");
+	return 0;
+}
+
+static const struct pci_epf_device_id epf_ntb_ids[] = {
+	{
+		.name = "pci_epf_vntb",
+	},
+	{},
+};
+
+static struct pci_epf_driver epf_ntb_driver = {
+	.driver.name    = "pci_epf_vntb",
+	.probe          = epf_ntb_probe,
+	.id_table       = epf_ntb_ids,
+	.ops            = &epf_ntb_ops,
+	.owner          = THIS_MODULE,
+};
+
+static int __init epf_ntb_init(void)
+{
+	int ret;
+
+	kpcintb_workqueue = alloc_workqueue("kpcintb", WQ_MEM_RECLAIM |
+					    WQ_HIGHPRI, 0);
+	ret = pci_epf_register_driver(&epf_ntb_driver);
+	if (ret) {
+		destroy_workqueue(kpcintb_workqueue);
+		pr_err("Failed to register pci epf ntb driver --> %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+module_init(epf_ntb_init);
+
+static void __exit epf_ntb_exit(void)
+{
+	pci_epf_unregister_driver(&epf_ntb_driver);
+	destroy_workqueue(kpcintb_workqueue);
+}
+module_exit(epf_ntb_exit);
+
+MODULE_DESCRIPTION("PCI EPF NTB DRIVER");
+MODULE_AUTHOR("Frank Li <Frank.li@nxp.com>");
+MODULE_LICENSE("GPL v2");
-- 
2.43.0


  parent reply	other threads:[~2024-03-24 23:38 UTC|newest]

Thread overview: 334+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-24 23:29 [PATCH 5.15 000/317] 5.15.153-rc1 review Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 001/317] io_uring/unix: drop usage of io_uring socket Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 002/317] io_uring: drop any code related to SCM_RIGHTS Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 003/317] rcu-tasks: Provide rcu_trace_implies_rcu_gp() Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 004/317] bpf: Defer the free of inner map when necessary Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 005/317] btrfs: add and use helper to check if block group is used Sasha Levin
2024-03-25 18:25   ` David Sterba
2024-03-26 19:23     ` Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 006/317] selftests: tls: use exact comparison in recv_partial Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 007/317] ASoC: rt5645: Make LattePanda board DMI match more precise Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 008/317] x86/xen: Add some null pointer checking to smp.c Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 009/317] MIPS: Clear Cause.BD in instruction_pointer_set Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 010/317] HID: multitouch: Add required quirk for Synaptics 0xcddc device Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 011/317] gen_compile_commands: fix invalid escape sequence warning Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 012/317] RDMA/mlx5: Fix fortify source warning while accessing Eth segment Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 013/317] RDMA/mlx5: Relax DEVX access upon modify commands Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 014/317] riscv: dts: sifive: add missing #interrupt-cells to pmic Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 015/317] x86/mm: Move is_vsyscall_vaddr() into asm/vsyscall.h Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 016/317] x86/mm: Disallow vsyscall page read for copy_from_kernel_nofault() Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 017/317] net/iucv: fix the allocation size of iucv_path_table array Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 018/317] parisc/ftrace: add missing CONFIG_DYNAMIC_FTRACE check Sasha Levin
2024-03-24 23:29 ` [PATCH 5.15 019/317] block: sed-opal: handle empty atoms when parsing response Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 020/317] dm-verity, dm-crypt: align "struct bvec_iter" correctly Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 021/317] scsi: mpt3sas: Prevent sending diag_reset when the controller is ready Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 022/317] ALSA: hda/realtek - ALC285 reduce pop noise from Headphone port Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 023/317] drm/amdgpu: Enable gpu reset for S3 abort cases on Raven series Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 024/317] Bluetooth: rfcomm: Fix null-ptr-deref in rfcomm_check_security Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 025/317] firewire: core: use long bus reset on gap count error Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 026/317] ASoC: Intel: bytcr_rt5640: Add an extra entry for the Chuwi Vi8 tablet Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 027/317] Input: gpio_keys_polled - suppress deferred probe error for gpio Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 028/317] ASoC: wm8962: Enable oscillator if selecting WM8962_FLL_OSC Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 029/317] ASoC: wm8962: Enable both SPKOUTR_ENA and SPKOUTL_ENA in mono mode Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 030/317] ASoC: wm8962: Fix up incorrect error message in wm8962_set_fll Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 031/317] do_sys_name_to_handle(): use kzalloc() to fix kernel-infoleak Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 032/317] f2fs: implement iomap operations Sasha Levin
2024-03-25  3:37   ` Eric Biggers
2024-03-25  3:40     ` Eric Biggers
2024-03-25 11:09     ` Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 033/317] s390/dasd: put block allocation in separate function Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 034/317] s390/dasd: add query PPRC function Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 035/317] s390/dasd: add copy pair setup Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 036/317] s390/dasd: add autoquiesce feature Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 037/317] s390/dasd: Use dev_*() for device log messages Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 038/317] s390/dasd: fix double module refcount decrement Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 039/317] nbd: null check for nla_nest_start Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 040/317] fs/select: rework stack allocation hack for clang Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 041/317] md: Don't clear MD_CLOSING when the raid is about to stop Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 042/317] lib/cmdline: Fix an invalid format specifier in an assertion msg Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 043/317] time: test: Fix incorrect format specifier Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 044/317] rtc: test: Fix invalid " Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 045/317] aoe: fix the potential use-after-free problem in aoecmd_cfg_pkts Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 046/317] timekeeping: Fix cross-timestamp interpolation on counter wrap Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 047/317] timekeeping: Fix cross-timestamp interpolation corner case decision Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 048/317] timekeeping: Fix cross-timestamp interpolation for non-x86 Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 049/317] sched/fair: Take the scheduling domain into account in select_idle_core() Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 050/317] wifi: ath10k: fix NULL pointer dereference in ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev() Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 051/317] wifi: b43: Stop/wake correct queue in DMA Tx path when QoS is disabled Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 052/317] wifi: b43: Stop/wake correct queue in PIO " Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 053/317] wifi: b43: Stop correct queue in DMA worker " Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 054/317] wifi: b43: Disable QoS for bcm4331 Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 055/317] wifi: wilc1000: fix declarations ordering Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 056/317] wifi: wilc1000: fix RCU usage in connect path Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 057/317] wifi: rtl8xxxu: add cancel_work_sync() for c2hcmd_work Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 058/317] wifi: wilc1000: fix multi-vif management when deleting a vif Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 059/317] wifi: mwifiex: debugfs: Drop unnecessary error check for debugfs_create_dir() Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 060/317] ARM: dts: renesas: r8a73a4: Fix external clocks and clock rate Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 061/317] cpufreq: brcmstb-avs-cpufreq: add check for cpufreq_cpu_get's return value Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 062/317] cpufreq: Explicitly include correct DT includes Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 063/317] cpufreq: mediatek-hw: Wait for CPU supplies before probing Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 064/317] sock_diag: annotate data-races around sock_diag_handlers[family] Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 065/317] inet_diag: annotate data-races around inet_diag_table[] Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 066/317] bpftool: Silence build warning about calloc() Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 067/317] libbpf: Apply map_set_def_max_entries() for inner_maps on creation Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 068/317] selftest/bpf: Add map_in_maps with BPF_MAP_TYPE_PERF_EVENT_ARRAY values Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 069/317] af_unix: Annotate data-race of gc_in_progress in wait_for_unix_gc() Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 070/317] cpufreq: mediatek-hw: Don't error out if supply is not found Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 071/317] arm64: dts: imx8mm-kontron: Disable pullups for I2C signals on SL/BL i.MX8MM Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 072/317] arm64: dts: imx8mm-kontron: Disable pullups for onboard UART signals on BL board Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 073/317] arm64: dts: imx8mm-kontron: Add support for ultra high speed modes on SD card Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 074/317] arm64: dts: imx8mm-kontron: Use the VSELECT signal to switch SD card IO voltage Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 075/317] arm64: dts: imx8mm-kontron: Disable pull resistors for SD card signals on BL board Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 076/317] wifi: ath9k: delay all of ath9k_wmi_event_tasklet() until init is complete Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 077/317] wifi: iwlwifi: mvm: report beacon protection failures Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 078/317] wifi: iwlwifi: dbg-tlv: ensure NUL termination Sasha Levin
2024-03-24 23:30 ` [PATCH 5.15 079/317] wifi: iwlwifi: fix EWRD table validity check Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 080/317] arm64: dts: imx8mm-venice-gw71xx: fix USB OTG VBUS Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 081/317] pwm: atmel-hlcdc: Convert to platform remove callback returning void Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 082/317] pwm: atmel-hlcdc: Use consistent variable naming Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 083/317] pwm: atmel-hlcdc: Fix clock imbalance related to suspend support Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 084/317] net: blackhole_dev: fix build warning for ethh set but not used Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 085/317] wifi: libertas: fix some memleaks in lbs_allocate_cmd_buffer() Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 086/317] arm64: dts: qcom: msm8996: Move '#clock-cells' to QMP PHY child node Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 087/317] arm64: dts: qcom: msm8998: drop USB PHY clock index Sasha Levin
2024-03-25  7:42   ` Johan Hovold
2024-03-24 23:31 ` [PATCH 5.15 088/317] arm64: dts: qcom: msm8998: switch USB QMP PHY to new style of bindings Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 089/317] arm64: dts: qcom: msm8998: declare VLS CLAMP register for USB3 PHY Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 090/317] printk: Add panic_in_progress helper Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 091/317] printk: Disable passing console lock owner completely during panic() Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 092/317] pwm: sti: Implement .apply() callback Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 093/317] pwm: sti: Fix capture for st,pwm-num-chan < st,capture-num-chan Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 094/317] wifi: iwlwifi: mvm: don't set replay counters to 0xff Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 095/317] s390/vdso: drop '-fPIC' from LDFLAGS Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 096/317] ipv6: mcast: remove one synchronize_net() barrier in ipv6_mc_down() Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 097/317] arm64: dts: mt8183: kukui: Add Type C node Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 098/317] arm64: dts: mt8183: kukui: Split out keyboard node and describe detachables Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 099/317] arm64: dts: mt8183: Move CrosEC base detection node to kukui-based DTs Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 100/317] arm64: dts: mediatek: mt7622: add missing "device_type" to memory nodes Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 101/317] bpf: Mark bpf_spin_{lock,unlock}() helpers with notrace correctly Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 102/317] wireless: Remove redundant 'flush_workqueue()' calls Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 103/317] wifi: wilc1000: prevent use-after-free on vif when cleaning up all interfaces Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 104/317] ACPI: processor_idle: Fix memory leak in acpi_processor_power_exit() Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 105/317] bus: tegra-aconnect: Update dependency to ARCH_TEGRA Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 106/317] iommu/amd: Mark interrupt as managed Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 107/317] wifi: brcmsmac: avoid function pointer casts Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 108/317] net: ena: Remove ena_select_queue Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 109/317] ARM: dts: arm: realview: Fix development chip ROM compatible value Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 110/317] arm64: dts: renesas: r8a779a0: Update to R-Car Gen4 compatible values Sasha Levin
2024-03-25  8:43   ` Geert Uytterhoeven
2024-03-26 19:18     ` Sasha Levin
2024-03-27  9:41       ` Geert Uytterhoeven
2024-03-27 13:39         ` Greg KH
2024-04-02  8:57   ` Geert Uytterhoeven
2024-04-02 23:11     ` Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 111/317] arm64: dts: renesas: r8a779a0: Correct avb[01] reg sizes Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 112/317] ARM: dts: imx6dl-yapp4: Move phy reset into switch node Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 113/317] ARM: dts: imx6dl-yapp4: Fix typo in the QCA switch register address Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 114/317] ARM: dts: imx6dl-yapp4: Move the internal switch PHYs under the switch node Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 115/317] arm64: dts: marvell: reorder crypto interrupts on Armada SoCs Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 116/317] ACPI: resource: Add Infinity laptops to irq1_edge_low_force_override Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 117/317] ACPI: resource: Do IRQ override on Lunnen Ground laptops Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 118/317] ACPI: resource: Add MAIBENBEN X577 to irq1_edge_low_force_override Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 119/317] ACPI: scan: Fix device check notification handling Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 120/317] x86, relocs: Ignore relocations in .notes section Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 121/317] SUNRPC: fix some memleaks in gssx_dec_option_array Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 122/317] mmc: wmt-sdmmc: remove an incorrect release_mem_region() call in the .remove function Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 123/317] wifi: rtw88: 8821c: Fix false alarm count Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 124/317] PCI: Make pci_dev_is_disconnected() helper public for other drivers Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 125/317] iommu/vt-d: Don't issue ATS Invalidation request when device is disconnected Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 126/317] igb: move PEROUT and EXTTS isr logic to separate functions Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 127/317] igb: Fix missing time sync events Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 128/317] Bluetooth: Remove superfluous call to hci_conn_check_pending() Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 129/317] Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855 Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 130/317] Bluetooth: hci_qca: don't use IS_ERR_OR_NULL() with gpiod_get_optional() Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 131/317] Bluetooth: hci_core: Fix possible buffer overflow Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 132/317] sr9800: Add check for usbnet_get_endpoints Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 133/317] bpf: Fix DEVMAP_HASH overflow check on 32-bit arches Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 134/317] bpf: Fix hashtab " Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 135/317] bpf: Fix stackmap " Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 136/317] ipv6: fib6_rules: flush route cache when rule is changed Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 137/317] net: ip_tunnel: make sure to pull inner header in ip_tunnel_rcv() Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 138/317] net: phy: fix phy_get_internal_delay accessing an empty array Sasha Levin
2024-03-24 23:31 ` [PATCH 5.15 139/317] net: hns3: fix kernel crash when 1588 is received on HIP08 devices Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 140/317] net: hns3: fix port duplex configure error in IMP reset Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 141/317] net: phy: DP83822: enable rgmii mode if phy_interface_is_rgmii Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 142/317] net: phy: dp83822: Fix RGMII TX delay configuration Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 143/317] OPP: debugfs: Fix warning around icc_get_name() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 144/317] tcp: fix incorrect parameter validation in the do_tcp_getsockopt() function Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 145/317] net: Change sock_getsockopt() to take the sk ptr instead of the sock ptr Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 146/317] bpf: net: Change sk_getsockopt() to take the sockptr_t argument Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 147/317] bpf: net: Change do_ip_getsockopt() " Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 148/317] ipmr: fix incorrect parameter validation in the ip_mroute_getsockopt() function Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 149/317] l2tp: fix incorrect parameter validation in the pppol2tp_getsockopt() function Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 150/317] udp: fix incorrect parameter validation in the udp_lib_getsockopt() function Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 151/317] net: kcm: fix incorrect parameter validation in the kcm_getsockopt) function Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 152/317] net/x25: fix incorrect parameter validation in the x25_getsockopt() function Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 153/317] nfp: flower: handle acti_netdevs allocation failure Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 154/317] dm raid: fix false positive for requeue needed during reshape Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 155/317] dm: call the resume method on internal suspend Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 156/317] drm/tegra: dsi: Add missing check for of_find_device_by_node Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 157/317] drm/tegra: dpaux: Populate AUX bus Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 158/317] drm/tegra: dpaux: Fix PM disable depth imbalance in tegra_dpaux_probe Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 159/317] drm/tegra: dsi: Make use of the helper function dev_err_probe() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 160/317] drm/tegra: dsi: Fix some error handling paths in tegra_dsi_probe() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 161/317] drm/tegra: dsi: Fix missing pm_runtime_disable() in the error handling path of tegra_dsi_probe() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 162/317] drm/tegra: dc: rgb: Allow changing PLLD rate on Tegra30+ Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 163/317] drm/tegra: rgb: Fix some error handling paths in tegra_dc_rgb_probe() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 164/317] drm/tegra: rgb: Fix missing clk_put() in the error handling paths of tegra_dc_rgb_probe() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 165/317] drm/tegra: output: Fix missing i2c_put_adapter() in the error handling paths of tegra_output_probe() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 166/317] drm/rockchip: inno_hdmi: Fix video timing Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 167/317] drm: Don't treat 0 as -1 in drm_fixp2int_ceil Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 168/317] drm/ttm: add ttm_resource_fini v2 Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 169/317] drm/vmwgfx: fix a memleak in vmw_gmrid_man_get_node Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 170/317] drm/rockchip: lvds: do not overwrite error code Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 171/317] drm/rockchip: lvds: do not print scary message when probing defer Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 172/317] drm/lima: fix a memleak in lima_heap_alloc Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 173/317] dmaengine: tegra210-adma: Update dependency to ARCH_TEGRA Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 174/317] media: tc358743: register v4l2 async device only after successful setup Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 175/317] PCI/DPC: Print all TLP Prefixes, not just the first Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 176/317] perf record: Fix possible incorrect free in record__switch_output() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 177/317] HID: lenovo: Add middleclick_workaround sysfs knob for cptkbd Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 178/317] drm/amd/display: Fix a potential buffer overflow in 'dp_dsc_clock_en_read()' Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 179/317] drm/amd/display: Fix potential NULL pointer dereferences in 'dcn10_set_output_transfer_func()' Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 180/317] perf evsel: Fix duplicate initialization of data->id in evsel__parse_sample() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 181/317] PCI/AER: Fix rootport attribute paths in ABI docs Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 182/317] clk: meson: Add missing clocks to axg_clk_regmaps Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 183/317] media: em28xx: annotate unchecked call to media_device_register() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 184/317] media: v4l2-tpg: fix some memleaks in tpg_alloc Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 185/317] media: v4l2-mem2mem: fix a memleak in v4l2_m2m_register_entity Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 186/317] media: edia: dvbdev: fix a use-after-free Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 187/317] pinctrl: mediatek: Drop bogus slew rate register range for MT8192 Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 188/317] clk: qcom: reset: Commonize the de/assert functions Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 189/317] clk: qcom: reset: Ensure write completion on reset de/assertion Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 190/317] quota: simplify drop_dquot_ref() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 191/317] quota: Fix potential NULL pointer dereference Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 192/317] quota: Fix rcu annotations of inode dquot pointers Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 193/317] PCI/P2PDMA: Fix a sleeping issue in a RCU read section Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 194/317] PCI: switchtec: Fix an error handling path in switchtec_pci_probe() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 195/317] crypto: xilinx - call finalize with bh disabled Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 196/317] perf thread_map: Free strlist on normal path in thread_map__new_by_tid_str() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 197/317] drm/radeon/ni: Fix wrong firmware size logging in ni_init_microcode() Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 198/317] ALSA: seq: fix function cast warnings Sasha Levin
2024-03-24 23:32 ` [PATCH 5.15 199/317] perf stat: Avoid metric-only segv Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 200/317] ASoC: meson: Use dev_err_probe() helper Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 201/317] ASoC: meson: aiu: fix function pointer type mismatch Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 202/317] ASoC: meson: t9015: " Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 203/317] powerpc: Force inlining of arch_vmap_p{u/m}d_supported() Sasha Levin
2024-03-24 23:33 ` Sasha Levin [this message]
2024-03-24 23:33 ` [PATCH 5.15 205/317] NTB: EPF: fix possible memory leak in pci_vntb_probe() Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 206/317] NTB: fix possible name leak in ntb_register_device() Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 207/317] media: sun8i-di: Fix coefficient writes Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 208/317] media: sun8i-di: Fix power on/off sequences Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 209/317] media: sun8i-di: Fix chroma difference threshold Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 210/317] media: imx: csc/scaler: fix v4l2_ctrl_handler memory leak Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 211/317] media: go7007: add check of return value of go7007_read_addr() Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 212/317] media: pvrusb2: remove redundant NULL check Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 213/317] media: pvrusb2: fix pvr2_stream_callback casts Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 214/317] clk: qcom: dispcc-sdm845: Adjust internal GDSC wait times Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 215/317] drm/mediatek: dsi: Fix DSI RGB666 formats and definitions Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 216/317] PCI: Mark 3ware-9650SE Root Port Extended Tags as broken Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 217/317] clk: hisilicon: hi3519: Release the correct number of gates in hi3519_clk_unregister() Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 218/317] clk: hisilicon: hi3559a: Fix an erroneous devm_kfree() Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 219/317] drm/tegra: put drm_gem_object ref on error in tegra_fb_create Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 220/317] mfd: syscon: Call of_node_put() only when of_parse_phandle() takes a ref Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 221/317] mfd: altera-sysmgr: " Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 222/317] crypto: arm/sha - fix function cast warnings Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 223/317] drm/tidss: Fix initial plane zpos values Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 224/317] mtd: maps: physmap-core: fix flash size larger than 32-bit Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 225/317] mtd: rawnand: lpc32xx_mlc: fix irq handler prototype Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 226/317] ASoC: meson: axg-tdm-interface: fix mclk setup without mclk-fs Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 227/317] ASoC: meson: axg-tdm-interface: add frame rate constraint Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 228/317] HID: amd_sfh: Update HPD sensor structure elements Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 229/317] drm/amdgpu: Fix missing break in ATOM_ARG_IMM Case of atom_get_src_int() Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 230/317] media: pvrusb2: fix uaf in pvr2_context_set_notify Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 231/317] media: dvb-frontends: avoid stack overflow warnings with clang Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 232/317] media: go7007: fix a memleak in go7007_load_encoder Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 233/317] media: ttpci: fix two memleaks in budget_av_attach Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 234/317] media: mediatek: vcodec: avoid -Wcast-function-type-strict warning Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 235/317] drm/mediatek: Fix a null pointer crash in mtk_drm_crtc_finish_page_flip Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 236/317] powerpc/hv-gpci: Fix the H_GET_PERF_COUNTER_INFO hcall return value checks Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 237/317] drm/msm/dpu: add division of drm_display_mode's hskew parameter Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 238/317] module: Add support for default value for module async_probe Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 239/317] modules: wait do_free_init correctly Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 240/317] powerpc/embedded6xx: Fix no previous prototype for avr_uart_send() etc Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 241/317] leds: aw2013: Unlock mutex before destroying it Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 242/317] leds: sgm3140: Add missing timer cleanup and flash gpio control Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 243/317] backlight: lm3630a: Initialize backlight_properties on init Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 244/317] backlight: lm3630a: Don't set bl->props.brightness in get_brightness Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 245/317] backlight: da9052: Fully initialize backlight_properties during probe Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 246/317] backlight: lm3639: " Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 247/317] backlight: lp8788: " Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 248/317] arch/powerpc: Remove <linux/fb.h> from backlight code Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 249/317] sparc32: Fix section mismatch in leon_pci_grpci Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 250/317] clk: Fix clk_core_get NULL dereference Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 251/317] clk: zynq: Prevent null pointer dereference caused by kmalloc failure Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 252/317] ALSA: hda/realtek: fix ALC285 issues on HP Envy x360 laptops Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 253/317] ALSA: usb-audio: Stop parsing channels bits when all channels are found Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 254/317] RDMA/srpt: Do not register event handler until srpt device is fully setup Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 255/317] f2fs: multidevice: support direct IO Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 256/317] f2fs: invalidate META_MAPPING before IPU/DIO write Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 257/317] f2fs: replace congestion_wait() calls with io_schedule_timeout() Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 258/317] f2fs: fix to invalidate META_MAPPING before DIO write Sasha Levin
2024-03-24 23:33 ` [PATCH 5.15 259/317] f2fs: invalidate meta pages only for post_read required inode Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 260/317] f2fs: reduce stack memory cost by using bitfield in struct f2fs_io_info Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 261/317] f2fs: compress: fix to cover normal cluster write with cp_rwsem Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 262/317] f2fs: compress: fix to check unreleased compressed cluster Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 263/317] scsi: csiostor: Avoid function pointer casts Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 264/317] RDMA/device: Fix a race between mad_client and cm_client init Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 265/317] RDMA/rtrs-clt: Check strnlen return len in sysfs mpath_policy_store() Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 266/317] scsi: bfa: Fix function pointer type mismatch for hcb_qe->cbfn Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 267/317] net: sunrpc: Fix an off by one in rpc_sockaddr2uaddr() Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 268/317] NFSv4.2: fix nfs4_listxattr kernel BUG at mm/usercopy.c:102 Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 269/317] NFSv4.2: fix listxattr maximum XDR buffer size Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 270/317] watchdog: stm32_iwdg: initialize default timeout Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 271/317] NFS: Fix an off by one in root_nfs_cat() Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 272/317] f2fs: compress: fix reserve_cblocks counting error when out of space Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 273/317] afs: Revert "afs: Hide silly-rename files from userspace" Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 274/317] comedi: comedi_test: Prevent timers rescheduling during deletion Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 275/317] remoteproc: stm32: use correct format strings on 64-bit Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 276/317] remoteproc: stm32: Fix incorrect type in assignment for va Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 277/317] remoteproc: stm32: Fix incorrect type assignment returned by stm32_rproc_get_loaded_rsc_tablef Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 278/317] tty: vt: fix 20 vs 0x20 typo in EScsiignore Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 279/317] serial: max310x: fix syntax error in IRQ error message Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 280/317] tty: serial: samsung: fix tx_empty() to return TIOCSER_TEMT Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 281/317] arm64: dts: broadcom: bcmbca: bcm4908: drop invalid switch cells Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 282/317] kconfig: fix infinite loop when expanding a macro at the end of file Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 283/317] rtc: mt6397: select IRQ_DOMAIN instead of depending on it Sasha Levin
2024-03-24 23:34   ` Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 284/317] serial: 8250_exar: Don't remove GPIO device on suspend Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 285/317] staging: greybus: fix get_channel_from_mode() failure path Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 286/317] usb: gadget: net2272: Use irqflags in the call to net2272_probe_fin Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 287/317] io_uring: don't save/restore iowait state Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 288/317] nouveau: reset the bo resource bus info after an eviction Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 289/317] octeontx2-af: Use matching wake_up API variant in CGX command interface Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 290/317] s390/vtime: fix average steal time calculation Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 291/317] soc: fsl: dpio: fix kcalloc() argument order Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 292/317] hsr: Fix uninit-value access in hsr_get_node() Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 293/317] net: mtk_eth_soc: move MAC_MCR setting to mac_finish() Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 294/317] net: mediatek: mtk_eth_soc: clear MAC_MCR_FORCE_LINK only when MAC is up Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 295/317] net: ethernet: mtk_eth_soc: fix PPE hanging issue Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 296/317] packet: annotate data-races around ignore_outgoing Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 297/317] net: veth: do not manipulate GRO when using XDP Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 298/317] net: dsa: mt7530: prevent possible incorrect XTAL frequency selection Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 299/317] vdpa/mlx5: Allow CVQ size changes Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 300/317] wireguard: receive: annotate data-race around receiving_counter.counter Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 301/317] rds: introduce acquire/release ordering in acquire/release_in_xmit() Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 302/317] hsr: Handle failures in module init Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 303/317] net: phy: fix phy_read_poll_timeout argument type in genphy_loopback Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 304/317] net/bnx2x: Prevent access to a freed page in page_pool Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 305/317] octeontx2-af: Use separate handlers for interrupts Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 306/317] netfilter: nft_set_pipapo: release elements in clone only from destroy path Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 307/317] netfilter: nf_tables: do not compare internal table flags on updates Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 308/317] rcu: add a helper to report consolidated flavor QS Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 309/317] net: report RCU QS on threaded NAPI repolling Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 310/317] bpf: report RCU QS in cpumap kthread Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 311/317] net: dsa: mt7530: fix handling of LLDP frames Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 312/317] net: dsa: mt7530: fix handling of 802.1X PAE frames Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 313/317] net: dsa: mt7530: fix link-local frames that ingress vlan filtering ports Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 314/317] net: dsa: mt7530: fix handling of all link-local frames Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 315/317] spi: spi-mt65xx: Fix NULL pointer access in interrupt handler Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 316/317] regmap: Add missing map->bus check Sasha Levin
2024-03-24 23:34 ` [PATCH 5.15 317/317] Linux 5.15.153-rc1 Sasha Levin
2024-03-25  5:52 ` [PATCH 5.15 000/317] 5.15.153-rc1 review Harshit Mogalapalli
2024-03-25  9:10 ` Naresh Kamboju
2024-03-25  9:28 ` Naresh Kamboju

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240324233458.1352854-205-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=Frank.Li@nxp.com \
    --cc=jdmason@kudzu.us \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.