mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 15:22:21 -04:00
scsi: ibmvfc: add NVMe/FC protocol interface definitions
Add the protocol definitions for client-VIOS interface updates needed to support NVMe/FC over the ibmvfc NPIV transport. Extend the ibmvfc interface with: - NVMe/FC-specific capability bits and opcodes - protocol-specific channel and queue definitions - updated channel enquiry/setup fields for NVMe queues - v3 command layout support for protocol-specific payloads These changes provide the common header and interface plumbing needed by later patches that add NVMe/FC login, discovery, remote-port handling, and I/O submission. Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com> Link: https://patch.msgid.link/20260723000149.969416-7-tyreld@linux.ibm.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
de7ac0f3f0
commit
4991c8f57b
@@ -13,6 +13,8 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/types.h>
|
||||
#include <scsi/viosrp.h>
|
||||
#include <linux/nvme.h>
|
||||
#include <linux/nvme-fc.h>
|
||||
|
||||
#define IBMVFC_NAME "ibmvfc"
|
||||
#define IBMVFC_DRIVER_VERSION "1.0.11"
|
||||
@@ -92,6 +94,7 @@ enum ibmvfc_cmd_status_flags {
|
||||
IBMVFC_FC_SCSI_ERROR = 0x0008,
|
||||
IBMVFC_HW_EVENT_LOGGED = 0x0010,
|
||||
IBMVFC_VIOS_LOGGED = 0x0020,
|
||||
IBMVFC_FC_NVME_STATUS = 0x0040,
|
||||
};
|
||||
|
||||
enum ibmvfc_fabric_mapped_errors {
|
||||
@@ -124,20 +127,37 @@ enum ibmvfc_vios_errors {
|
||||
IBMVFC_COMMAND_FAILED = 0x8000,
|
||||
};
|
||||
|
||||
enum ibmvfc_fc_nvme_errors {
|
||||
IBMVFC_NVMS_VALID_ERSP = 0x0001,
|
||||
IBMVFC_NVMS_VALID_NODMA_CQE = 0x0002,
|
||||
};
|
||||
|
||||
enum ibmvfc_mad_types {
|
||||
IBMVFC_NPIV_LOGIN = 0x0001,
|
||||
IBMVFC_DISC_TARGETS = 0x0002,
|
||||
IBMVFC_DISC_TARGETS = 0x0002,
|
||||
IBMVFC_DISC_NVMF_TARGETS = 0x0003,
|
||||
IBMVFC_PORT_LOGIN = 0x0004,
|
||||
IBMVFC_PROCESS_LOGIN = 0x0008,
|
||||
IBMVFC_QUERY_TARGET = 0x0010,
|
||||
IBMVFC_NVMF_PORT_LOGIN = 0x0005,
|
||||
IBMVFC_PROCESS_LOGIN = 0x0008,
|
||||
IBMVFC_NVMF_PROCESS_LOGIN = 0x0009,
|
||||
IBMVFC_QUERY_TARGET = 0x0010,
|
||||
IBMVFC_NVMF_QUERY_TARGET = 0x0011,
|
||||
IBMVFC_MOVE_LOGIN = 0x0020,
|
||||
IBMVFC_IMPLICIT_LOGOUT = 0x0040,
|
||||
IBMVFC_PASSTHRU = 0x0200,
|
||||
IBMVFC_TMF_MAD = 0x0100,
|
||||
IBMVFC_NPIV_LOGOUT = 0x0800,
|
||||
IBMVFC_CHANNEL_ENQUIRY = 0x1000,
|
||||
IBMVFC_CHANNEL_SETUP = 0x2000,
|
||||
IBMVFC_CONNECTION_INFO = 0x4000,
|
||||
IBMVFC_NVMF_MOVE_LOGIN = 0x0021,
|
||||
IBMVFC_IMPLICIT_LOGOUT = 0x0040,
|
||||
IBMVFC_NVMF_IMPLICIT_LOGOUT = 0x0041,
|
||||
IBMVFC_RNID = 0x0080,
|
||||
IBMVFC_NVMF_RNID = 0x0081,
|
||||
IBMVFC_TMF_MAD = 0x0100,
|
||||
IBMVFC_NVMF_TMF_MAD = 0x0101,
|
||||
IBMVFC_PASSTHRU = 0x0200,
|
||||
IBMVFC_NVMF_PASSTHRU = 0x0201,
|
||||
IBMVFC_NPIV_LOGOUT = 0x0800,
|
||||
IBMVFC_CHANNEL_ENQUIRY = 0x1000,
|
||||
IBMVFC_CHANNEL_SETUP = 0x2000,
|
||||
IBMVFC_CONNECTION_INFO = 0x4000,
|
||||
IBMVFC_FABRIC_LOGIN = 0x8000,
|
||||
IBMVFC_NVMF_FABRIC_LOGIN = 0x8001,
|
||||
};
|
||||
|
||||
struct ibmvfc_mad_common {
|
||||
@@ -175,11 +195,16 @@ struct ibmvfc_npiv_login {
|
||||
#define IBMVFC_FLUSH_ON_HALT 0x02
|
||||
__be32 max_cmds;
|
||||
__be64 capabilities;
|
||||
#define IBMVFC_CAN_MIGRATE 0x01
|
||||
#define IBMVFC_CAN_USE_CHANNELS 0x02
|
||||
#define IBMVFC_CAN_HANDLE_FPIN 0x04
|
||||
#define IBMVFC_CAN_USE_MAD_VERSION 0x08
|
||||
#define IBMVFC_CAN_SEND_VF_WWPN 0x10
|
||||
#define IBMVFC_CAN_MIGRATE 0x001
|
||||
#define IBMVFC_CAN_USE_CHANNELS 0x002
|
||||
#define IBMVFC_CAN_HANDLE_FPIN 0x004
|
||||
#define IBMVFC_CAN_USE_MAD_VERSION 0x008
|
||||
#define IBMVFC_CAN_SEND_VF_WWPN 0x010
|
||||
#define IBMVFC_YES_NVMEOF 0x020
|
||||
#define IBMVFC_YES_SCSI 0x040
|
||||
#define IBMVFC_CAN_USE_WWPN_ALL 0x080
|
||||
#define IBMVFC_USE_ASYNC_SUBQ 0x100
|
||||
#define IBMVFC_CAN_USE_NOOP_CMD 0x200
|
||||
__be64 node_name;
|
||||
struct srp_direct_buf async;
|
||||
u8 partition_name[IBMVFC_MAX_NAME];
|
||||
@@ -219,13 +244,18 @@ struct ibmvfc_npiv_login_resp {
|
||||
__be16 error;
|
||||
__be32 flags;
|
||||
#define IBMVFC_NATIVE_FC 0x01
|
||||
__be32 reserved;
|
||||
__be32 possible_nports;
|
||||
__be64 capabilities;
|
||||
#define IBMVFC_CAN_FLUSH_ON_HALT 0x08
|
||||
#define IBMVFC_CAN_SUPPRESS_ABTS 0x10
|
||||
#define IBMVFC_MAD_VERSION_CAP 0x20
|
||||
#define IBMVFC_HANDLE_VF_WWPN 0x40
|
||||
#define IBMVFC_CAN_SUPPORT_CHANNELS 0x80
|
||||
#define IBMVFC_CAN_FLUSH_ON_HALT 0x0008
|
||||
#define IBMVFC_CAN_SUPPRESS_ABTS 0x0010
|
||||
#define IBMVFC_MAD_VERSION_CAP 0x0020
|
||||
#define IBMVFC_HANDLE_VF_WWPN 0x0040
|
||||
#define IBMVFC_CAN_SUPPORT_CHANNELS 0x0080
|
||||
#define IBMVFC_SUPPORT_NVMEOF 0x0100
|
||||
#define IBMVFC_SUPPORT_SCSI 0x0200
|
||||
#define IBMVFC_SUPPORT_WWPN_ALL 0x0400
|
||||
#define IBMVFC_ASYNC_SUBQ 0x0800
|
||||
#define IBMVFC_SUPPORT_NOOP_CMD 0x1000
|
||||
__be32 max_cmds;
|
||||
__be32 scsi_id_sz;
|
||||
__be64 max_dma_len;
|
||||
@@ -238,7 +268,7 @@ struct ibmvfc_npiv_login_resp {
|
||||
u8 port_loc_code[IBMVFC_MAX_NAME];
|
||||
u8 drc_name[IBMVFC_MAX_NAME];
|
||||
struct ibmvfc_service_parms service_parms;
|
||||
__be64 reserved2;
|
||||
__be64 reserved;
|
||||
} __packed __aligned(8);
|
||||
|
||||
union ibmvfc_npiv_login_data {
|
||||
@@ -246,6 +276,17 @@ union ibmvfc_npiv_login_data {
|
||||
struct ibmvfc_npiv_login_resp resp;
|
||||
} __packed __aligned(8);
|
||||
|
||||
struct ibmvfc_fabric_login_mad {
|
||||
struct ibmvfc_mad_common common;
|
||||
__be64 flags;
|
||||
__be64 capabilities;
|
||||
__be64 nport_id;
|
||||
__be16 status;
|
||||
__be16 error;
|
||||
__be32 reserved;
|
||||
__be64 reserved2[16];
|
||||
} __packed __aligned(8);
|
||||
|
||||
struct ibmvfc_discover_targets_entry {
|
||||
__be32 scsi_id;
|
||||
__be32 pad;
|
||||
@@ -287,6 +328,7 @@ enum ibmvfc_fc_type {
|
||||
IBMVFC_FABRIC_BUSY = 0x04,
|
||||
IBMVFC_PORT_BUSY = 0x05,
|
||||
IBMVFC_BASIC_REJECT = 0x06,
|
||||
IBMVFC_FC4_LS_REJECT = 0x07,
|
||||
};
|
||||
|
||||
enum ibmvfc_gs_explain {
|
||||
@@ -377,20 +419,27 @@ struct ibmvfc_query_tgt {
|
||||
struct ibmvfc_implicit_logout {
|
||||
struct ibmvfc_mad_common common;
|
||||
__be64 old_scsi_id;
|
||||
__be64 reserved[2];
|
||||
__be64 reserved[8];
|
||||
__be64 target_wwpn;
|
||||
} __packed __aligned(8);
|
||||
|
||||
struct ibmvfc_tmf {
|
||||
struct ibmvfc_mad_common common;
|
||||
__be64 scsi_id;
|
||||
struct scsi_lun lun;
|
||||
union {
|
||||
struct scsi_lun lun;
|
||||
__be64 assoc_id;
|
||||
};
|
||||
__be32 flags;
|
||||
#define IBMVFC_TMF_ABORT_TASK 0x02
|
||||
#define IBMVFC_TMF_ABORT_TASK_SET 0x04
|
||||
#define IBMVFC_TMF_LUN_RESET 0x10
|
||||
#define IBMVFC_TMF_TGT_RESET 0x20
|
||||
#define IBMVFC_TMF_LUA_VALID 0x40
|
||||
#define IBMVFC_TMF_SUPPRESS_ABTS 0x80
|
||||
#define IBMVFC_TMF_ABORT_TASK 0x002
|
||||
#define IBMVFC_TMF_ABORT_TASK_SET 0x004
|
||||
#define IBMVFC_TMF_LUN_RESET 0x010
|
||||
#define IBMVFC_TMF_TGT_RESET 0x020
|
||||
#define IBMVFC_TMF_LUA_VALID 0x040
|
||||
#define IBMVFC_TMF_SUPPRESS_ABTS 0x080
|
||||
#define IBMVFC_TMF_NVMF_ASSOC 0x100
|
||||
#define IBMVFC_TMF_NVMF_TARGET 0x200
|
||||
#define IBMVFC_TMF_BITMASK_VALID 0x400
|
||||
__be32 cancel_key;
|
||||
__be32 my_cancel_key;
|
||||
__be32 pad;
|
||||
@@ -446,6 +495,8 @@ enum ibmvfc_cmd_flags {
|
||||
IBMVFC_WRITE = 0x0008,
|
||||
IBMVFC_TMF = 0x0080,
|
||||
IBMVFC_CLASS_3_ERR = 0x0100,
|
||||
IBMVFC_NVMEOF_PROTOCOL = 0x0200,
|
||||
IBMVFC_NVMF_SLER = 0x0400,
|
||||
};
|
||||
|
||||
enum ibmvfc_fc_task_attr {
|
||||
@@ -493,7 +544,7 @@ struct ibmvfc_cmd {
|
||||
__be64 tgt_scsi_id;
|
||||
__be64 tag;
|
||||
__be64 target_wwpn;
|
||||
__be64 reserved3;
|
||||
__be64 assoc_id;
|
||||
union {
|
||||
struct {
|
||||
struct ibmvfc_fcp_cmd_iu iu;
|
||||
@@ -504,6 +555,15 @@ struct ibmvfc_cmd {
|
||||
struct ibmvfc_fcp_cmd_iu iu;
|
||||
struct ibmvfc_fcp_rsp rsp;
|
||||
} v2;
|
||||
struct {
|
||||
__be64 reserved5[4];
|
||||
struct ibmvfc_fcp_cmd_iu iu;
|
||||
struct ibmvfc_fcp_rsp rsp;
|
||||
} v3scsi;
|
||||
struct {
|
||||
__be64 reserved[4];
|
||||
struct nvme_fc_cmd_iu iu;
|
||||
} v3nvme;
|
||||
};
|
||||
} __packed __aligned(8);
|
||||
|
||||
@@ -522,6 +582,9 @@ struct ibmvfc_passthru_iu {
|
||||
__be32 flags;
|
||||
#define IBMVFC_FC_ELS 0x01
|
||||
#define IBMVFC_FC_CT_IU 0x02
|
||||
#define IBMVFC_PT_PRLI 0x04
|
||||
#define IBMVFC_FC4_LS_OTH 0x08
|
||||
#define IBMVFC_FC4_LS_DSC_CTRL 0x10
|
||||
__be32 cancel_key;
|
||||
#define IBMVFC_PASSTHRU_CANCEL_KEY 0x80000000
|
||||
#define IBMVFC_INTERNAL_CANCEL_KEY 0x80000001
|
||||
@@ -559,7 +622,7 @@ struct ibmvfc_channel_setup_mad {
|
||||
struct srp_direct_buf buffer;
|
||||
} __packed __aligned(8);
|
||||
|
||||
#define IBMVFC_MAX_CHANNELS 502
|
||||
#define IBMVFC_MAX_CHANNELS 501
|
||||
|
||||
struct ibmvfc_channel_setup {
|
||||
__be32 flags;
|
||||
@@ -574,6 +637,7 @@ struct ibmvfc_channel_setup {
|
||||
struct srp_direct_buf buffer;
|
||||
__be64 reserved2[5];
|
||||
__be64 channel_handles[IBMVFC_MAX_CHANNELS];
|
||||
__be64 async_sub_crq_handle;
|
||||
} __packed __aligned(8);
|
||||
|
||||
struct ibmvfc_connection_info {
|
||||
@@ -620,7 +684,8 @@ struct ibmvfc_trace_entry {
|
||||
|
||||
enum ibmvfc_crq_formats {
|
||||
IBMVFC_CMD_FORMAT = 0x01,
|
||||
IBMVFC_ASYNC_EVENT = 0x02,
|
||||
IBMVFC_ASYNC_EVENT = 0x02,
|
||||
IBMVFC_NOOP = 0x03,
|
||||
IBMVFC_MAD_FORMAT = 0x04,
|
||||
};
|
||||
|
||||
@@ -639,6 +704,9 @@ enum ibmvfc_async_event {
|
||||
IBMVFC_AE_RESUME = 0x0800,
|
||||
IBMVFC_AE_ADAPTER_FAILED = 0x1000,
|
||||
IBMVFC_AE_FPIN = 0x2000,
|
||||
IBMVFC_NVME_DISCONNECT = 0x4000,
|
||||
IBMVFC_NVMEOF_PROTO_AVAIL = 0x40000000,
|
||||
IBMVFC_SCSI_PROTO_AVAIL = 0x80000000,
|
||||
};
|
||||
|
||||
struct ibmvfc_async_desc {
|
||||
@@ -683,13 +751,30 @@ struct ibmvfc_async_crq {
|
||||
volatile __be64 scsi_id;
|
||||
volatile __be64 wwpn;
|
||||
volatile __be64 node_name;
|
||||
__be64 reserved;
|
||||
__be64 assoc_id;
|
||||
} __packed __aligned(8);
|
||||
|
||||
struct ibmvfc_async_sub_crq {
|
||||
volatile u8 valid;
|
||||
u8 flags;
|
||||
#define IBMVFC_ASYNC_ID_IS_ASSOC_ID 0x01
|
||||
u8 link_state;
|
||||
u8 fpin_status;
|
||||
__be16 event;
|
||||
__be16 pad;
|
||||
__be64 wwpn;
|
||||
__be64 nport_id;
|
||||
union {
|
||||
__be64 node_name;
|
||||
__be64 assoc_id;
|
||||
} id;
|
||||
} __packed __aligned(8);
|
||||
|
||||
union ibmvfc_iu {
|
||||
struct ibmvfc_mad_common mad_common;
|
||||
struct ibmvfc_npiv_login_mad npiv_login;
|
||||
struct ibmvfc_npiv_logout_mad npiv_logout;
|
||||
struct ibmvfc_fabric_login_mad fabric_login;
|
||||
struct ibmvfc_discover_targets discover_targets;
|
||||
struct ibmvfc_port_login plogi;
|
||||
struct ibmvfc_process_login prli;
|
||||
|
||||
Reference in New Issue
Block a user