[PATCH 03/29] ibmvfc: split NVMe support into separate source file and add transport stubs
From: Tyrel Datwyler <tyreld@linux.ibm.com>
Date: 2026-06-23 01:30:55
Also in:
linux-scsi, lkml
Subsystem:
ibm power virtual fc device drivers, linux for powerpc (32-bit and 64-bit), scsi subsystem, the rest · Maintainers:
Tyrel Datwyler, Madhavan Srinivasan, Michael Ellerman, "James E.J. Bottomley", "Martin K. Petersen", Linus Torvalds
Rename ibmvfc.c to ibmvfc-core.c as first step in decoupling each
protocol from the core driver logic. Add ibmvfc-nvme.[ch] files, and
register an nvme_fc_port_template with empty callback stubs.
Add empty registration functions definitions for local and remote ports.
No functional NVMe/FC support is added yet.
Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
---
drivers/scsi/ibmvscsi/Makefile | 2 +
.../scsi/ibmvscsi/{ibmvfc.c => ibmvfc-core.c} | 19 +++-
drivers/scsi/ibmvscsi/ibmvfc-nvme.c | 87 +++++++++++++++++++
drivers/scsi/ibmvscsi/ibmvfc-nvme.h | 32 +++++++
drivers/scsi/ibmvscsi/ibmvfc.h | 10 ++-
5 files changed, 146 insertions(+), 4 deletions(-)
rename drivers/scsi/ibmvscsi/{ibmvfc.c => ibmvfc-core.c} (99%)
create mode 100644 drivers/scsi/ibmvscsi/ibmvfc-nvme.c
create mode 100644 drivers/scsi/ibmvscsi/ibmvfc-nvme.h
diff --git a/drivers/scsi/ibmvscsi/Makefile b/drivers/scsi/ibmvscsi/Makefile
index 5eb1cb1a0028..9408c7f4cdee 100644
--- a/drivers/scsi/ibmvscsi/Makefile
+++ b/drivers/scsi/ibmvscsi/Makefile@@ -1,3 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only +ibmvfc-objs := ibmvfc-core.o ibmvfc-nvme.o + obj-$(CONFIG_SCSI_IBMVSCSI) += ibmvscsi.o obj-$(CONFIG_SCSI_IBMVFC) += ibmvfc.o
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc-core.c
similarity index 99%
rename from drivers/scsi/ibmvscsi/ibmvfc.c
rename to drivers/scsi/ibmvscsi/ibmvfc-core.c
index 912901436442..4e45d23221d6 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc-core.c@@ -1,10 +1,11 @@ -// SPDX-License-Identifier: GPL-2.0-or-later +/* SPDX-License-Identifier: GPL-2.0-or-later */ + /* * ibmvfc.c -- driver for IBM Power Virtual Fibre Channel Adapter * * Written By: Brian King <brking@linux.vnet.ibm.com>, IBM Corporation * - * Copyright (C) IBM Corporation, 2008 + * Copyright (C) IBM Corporation, 2008-2026 */ #include <linux/module.h>
@@ -46,6 +47,9 @@ static unsigned int cls3_error = IBMVFC_CLS3_ERROR; static unsigned int mq_enabled = IBMVFC_MQ; static unsigned int nr_scsi_hw_queues = IBMVFC_SCSI_HW_QUEUES; static unsigned int nr_scsi_channels = IBMVFC_SCSI_CHANNELS; +static unsigned int nvme_enabled = IBMVFC_NVME; +static unsigned int nr_nvme_hw_queues = IBMVFC_NVME_HW_QUEUES; +static unsigned int nr_nvme_channels = IBMVFC_NVME_CHANNELS; static unsigned int mig_channels_only = IBMVFC_MIG_NO_SUB_TO_CRQ; static unsigned int mig_no_less_channels = IBMVFC_MIG_NO_N_TO_M;
@@ -74,6 +78,16 @@ module_param_named(mig_no_less_channels, mig_no_less_channels, uint, S_IRUGO); MODULE_PARM_DESC(mig_no_less_channels, "Prevent migration to system with less channels. " "[Default=" __stringify(IBMVFC_MIG_NO_N_TO_M) "]"); +module_param_named(nvme, nvme_enabled, uint, S_IRUGO); +MODULE_PARM_DESC(nvme, "Enable NVMe over FC support. " + "[Default=" __stringify(IBMVFC_NVME) "]"); +module_param_named(nvme_host_queues, nr_nvme_hw_queues, uint, S_IRUGO); +MODULE_PARM_DESC(nvme_host_queues, "Number of NVMeoF Host submission queues. " + "[Default=" __stringify(IBMVFC_NVME_HW_QUEUES) "]"); +module_param_named(nvme_hw_channels, nr_nvme_channels, uint, S_IRUGO); +MODULE_PARM_DESC(nvme_hw_channels, "Number of hw NVMeoF channels to request. " + "[Default=" __stringify(IBMVFC_NVME_CHANNELS) "]"); + module_param_named(init_timeout, init_timeout, uint, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(init_timeout, "Initialization timeout in seconds. " "[Default=" __stringify(IBMVFC_INIT_TIMEOUT) "]");
@@ -468,6 +482,7 @@ static const struct { { IBMVFC_FABRIC_BUSY, "fabric busy" }, { IBMVFC_PORT_BUSY, "port busy" }, { IBMVFC_BASIC_REJECT, "basic reject" }, + { IBMVFC_FC4_LS_REJECT, "fc4 ls reject" }, }; static const char *unknown_fc_type = "unknown fc type";
diff --git a/drivers/scsi/ibmvscsi/ibmvfc-nvme.c b/drivers/scsi/ibmvscsi/ibmvfc-nvme.c
new file mode 100644
index 000000000000..4a66cde8a8d2
--- /dev/null
+++ b/drivers/scsi/ibmvscsi/ibmvfc-nvme.c@@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/* + * ibmvfc-nvme.c -- IBM Power Virtual Fibre Channel NVMeoF HBA driver + * + * Written By: Tyrel Datwyler <tyreld@linux.ibm.com>, IBM Corporation + * + * Copyright (C) IBM Corporation, 2026 + */ + +#include <scsi/scsi_transport_fc.h> + +#include "ibmvfc-nvme.h" + +static void ibmvfc_nvme_localport_delete(struct nvme_fc_local_port *lport) +{ +} + +static void ibmvfc_nvme_remoteport_delete(struct nvme_fc_remote_port *rport) +{ +} + +static int ibmvfc_nvme_ls_req(struct nvme_fc_local_port *lport, + struct nvme_fc_remote_port *rport, + struct nvmefc_ls_req *ls_req) +{ + return 0; +} + +static void ibmvfc_nvme_ls_abort(struct nvme_fc_local_port *lport, + struct nvme_fc_remote_port *rport, + struct nvmefc_ls_req *ls_abort) +{ +} + +static int ibmvfc_nvme_fcp_io(struct nvme_fc_local_port *lport, + struct nvme_fc_remote_port *rport, + void *hw_queue_handle, + struct nvmefc_fcp_req *fcp_req) +{ + return 0; +} + +static void ibmvfc_nvme_fcp_abort(struct nvme_fc_local_port *lport, + struct nvme_fc_remote_port *rport, + void *hw_queue_handle, + struct nvmefc_fcp_req *abort_req) +{ +} + +static struct nvme_fc_port_template ibmvfc_nvme_fc_transport = { + .localport_delete = ibmvfc_nvme_localport_delete, + .remoteport_delete = ibmvfc_nvme_remoteport_delete, + .create_queue = NULL, + .delete_queue = NULL, + .ls_req = ibmvfc_nvme_ls_req, + .ls_abort = ibmvfc_nvme_ls_abort, + .fcp_io = ibmvfc_nvme_fcp_io, + .fcp_abort = ibmvfc_nvme_fcp_abort, + .map_queues = NULL, + .max_hw_queues = IBMVFC_NVME_HW_QUEUES, + .max_sgl_segments = 1024, + .max_dif_sgl_segments = 64, + .dma_boundary = 0xFFFFFFFF, + .local_priv_sz = sizeof(struct ibmvfc_host *), + .remote_priv_sz = sizeof(struct ibmvfc_target *), + .lsrqst_priv_sz = sizeof(struct ibmvfc_event *), + .fcprqst_priv_sz = sizeof(struct ibmvfc_event *), +}; + +int ibmvfc_nvme_register_remoteport(struct ibmvfc_target *tgt) +{ + return 0; +} + +void ibmvfc_nvme_unregister_remoteport(struct ibmvfc_target *tgt) +{ +} + +int ibmvfc_nvme_register(struct ibmvfc_host *vhost) +{ + return 0; +} + +void ibmvfc_nvme_unregister(struct ibmvfc_host *vhost) +{ +}
diff --git a/drivers/scsi/ibmvscsi/ibmvfc-nvme.h b/drivers/scsi/ibmvscsi/ibmvfc-nvme.h
new file mode 100644
index 000000000000..97e267871df2
--- /dev/null
+++ b/drivers/scsi/ibmvscsi/ibmvfc-nvme.h@@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/* + * ibmvfc-nvme.h -- IBM Power Virtual Fibre Channel NVMeoF HBA driver + * + * Written By: Tyrel Datwyler <tyreld@linux.ibm.com>, IBM Corporation + * + * Copyright (C) IBM Corporation, 2026 + */ + +#ifndef _IBMVFC_NVME_H +#define _IBMVFC_NVME_H + +#include <uapi/scsi/fc/fc_fs.h> +#include <uapi/scsi/fc/fc_els.h> +#include <linux/nvme-fc-driver.h> + +#include "ibmvfc.h" + +#define IBMVFC_NVME 0 +#define IBMVFC_NVME_HW_QUEUES 8 +#define IBMVFC_MAX_NVME_QUEUES 16 +#define IBMVFC_NVME_CHANNELS 8 + +struct ibmvfc_host; +struct ibmvfc_target; + +int ibmvfc_nvme_register_remoteport(struct ibmvfc_target *tgt); +void ibmvfc_nvme_unregister_remoteport(struct ibmvfc_target *tgt); +int ibmvfc_nvme_register(struct ibmvfc_host *vhost); +void ibmvfc_nvme_unregister(struct ibmvfc_host *vhost); +#endif
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
index f8a2bf92da41..f137b61ce422 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.h
+++ b/drivers/scsi/ibmvscsi/ibmvfc.h@@ -1,22 +1,27 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ + /* * ibmvfc.h -- driver for IBM Power Virtual Fibre Channel Adapter * * Written By: Brian King <brking@linux.vnet.ibm.com>, IBM Corporation * - * Copyright (C) IBM Corporation, 2008 + * Copyright (C) IBM Corporation, 2008-2026 */ #ifndef _IBMVFC_H #define _IBMVFC_H +#include <linux/interrupt.h> #include <linux/list.h> #include <linux/types.h> +#include <scsi/scsi_device.h> #include <scsi/viosrp.h> #include <linux/nvme.h> #include <linux/nvme-fc.h> -#define IBMVFC_NAME "ibmvfc" +#include "ibmvfc-nvme.h" + +#define IBMVFC_NAME "ibmvfc" #define IBMVFC_DRIVER_VERSION "1.0.11" #define IBMVFC_DRIVER_DATE "(April 12, 2013)"
@@ -984,6 +989,7 @@ struct ibmvfc_host { unsigned int mq_enabled:1; unsigned int using_channels:1; unsigned int do_enquiry:1; + unsigned int nvme_enabled:1; unsigned int aborting_passthru:1; unsigned int scan_complete:1; int scan_timeout;
--
2.54.0