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 <[email protected]>
---
 drivers/scsi/ibmvscsi/ibmvfc.h | 153 +++++++++++++++++++++++++--------
 1 file changed, 119 insertions(+), 34 deletions(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
index 0e259e9d2e9b..f8a2bf92da41 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.h
+++ b/drivers/scsi/ibmvscsi/ibmvfc.h
@@ -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;
-- 
2.54.0


Reply via email to