VIOS partitions with SLI-4 enabled Emulex adapters will be capable of
driving IO in parallel through mulitple work queues or channels, and
with new hyperviosr firmware that supports multiple interrupt sources
an ibmvfc NPIV single initiator can be modified to exploit end to end
channelization in a PowerVM environment.

VIOS hosts will also be able to expose fabric perfromance impact
notifications (FPIN) via a new asynchronous event to ibmvfc clients that
advertise support via IBMVFC_CAN_HANDLE_FPIN in their capabilities flag
during NPIV_LOGIN.

This patch introduces three new Management Datagrams (MADs) for
channelization support negotiation as well as the FPIN asynchronous
event and FPIN status flags. Follow up work is required to plumb the
ibmvfc client driver to use these new interfaces.

Signed-off-by: Tyrel Datwyler <tyr...@linux.ibm.com>
---
v2 -> v3:
        Fixup checkpatch warnings about using __attribute__()
v1 -> v2:
        Fixup complier errors from neglected commit --amend

---
 drivers/scsi/ibmvscsi/ibmvfc.h | 66 +++++++++++++++++++++++++++++++++-
 1 file changed, 65 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
index 6da23666f5be..e6e1c255a79c 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.h
+++ b/drivers/scsi/ibmvscsi/ibmvfc.h
@@ -124,6 +124,9 @@ enum ibmvfc_mad_types {
        IBMVFC_PASSTHRU         = 0x0200,
        IBMVFC_TMF_MAD          = 0x0100,
        IBMVFC_NPIV_LOGOUT      = 0x0800,
+       IBMVFC_CHANNEL_ENQUIRY  = 0x1000,
+       IBMVFC_CHANNEL_SETUP    = 0x2000,
+       IBMVFC_CONNECTION_INFO  = 0x4000,
 };
 
 struct ibmvfc_mad_common {
@@ -162,6 +165,8 @@ struct ibmvfc_npiv_login {
        __be32 max_cmds;
        __be64 capabilities;
 #define IBMVFC_CAN_MIGRATE             0x01
+#define IBMVFC_CAN_USE_CHANNELS                0x02
+#define IBMVFC_CAN_HANDLE_FPIN         0x04
        __be64 node_name;
        struct srp_direct_buf async;
        u8 partition_name[IBMVFC_MAX_NAME];
@@ -204,6 +209,7 @@ struct ibmvfc_npiv_login_resp {
        __be64 capabilities;
 #define IBMVFC_CAN_FLUSH_ON_HALT       0x08
 #define IBMVFC_CAN_SUPPRESS_ABTS       0x10
+#define IBMVFC_CAN_SUPPORT_CHANNELS    0x20
        __be32 max_cmds;
        __be32 scsi_id_sz;
        __be64 max_dma_len;
@@ -482,6 +488,52 @@ struct ibmvfc_passthru_mad {
        struct ibmvfc_passthru_fc_iu fc_iu;
 } __packed __aligned(8);
 
+struct ibmvfc_channel_enquiry {
+       struct ibmvfc_mad_common common;
+       __be32 flags;
+#define IBMVFC_NO_CHANNELS_TO_CRQ_SUPPORT      0x01
+#define IBMVFC_SUPPORT_VARIABLE_SUBQ_MSG       0x02
+#define IBMVFC_NO_N_TO_M_CHANNELS_SUPPORT      0x04
+       __be32 num_scsi_subq_channels;
+       __be32 num_nvmeof_subq_channels;
+       __be32 num_scsi_vas_channels;
+       __be32 num_nvmeof_vas_channels;
+} __packed __aligned(8);
+
+struct ibmvfc_channel_setup_mad {
+       struct ibmvfc_mad_common common;
+       struct srp_direct_buf buffer;
+} __packed __aligned(8);
+
+#define IBMVFC_MAX_CHANNELS    502
+
+struct ibmvfc_channel_setup {
+       __be32 flags;
+#define IBMVFC_CANCEL_CHANNELS         0x01
+#define IBMVFC_USE_BUFFER              0x02
+#define IBMVFC_CHANNELS_CANCELED       0x04
+       __be32 reserved;
+       __be32 num_scsi_subq_channels;
+       __be32 num_nvmeof_subq_channels;
+       __be32 num_scsi_vas_channels;
+       __be32 num_nvmeof_vas_channels;
+       struct srp_direct_buf buffer;
+       __be64 reserved2[5];
+       __be64 channel_handles[IBMVFC_MAX_CHANNELS];
+} __packed __aligned(8);
+
+struct ibmvfc_connection_info {
+       struct ibmvfc_mad_common common;
+       __be64 information_bits;
+#define IBMVFC_NO_FC_IO_CHANNEL                0x01
+#define IBMVFC_NO_PHYP_VAS             0x02
+#define IBMVFC_NO_PHYP_SUBQ            0x04
+#define IBMVFC_PHYP_DEPRECATED_SUBQ    0x08
+#define IBMVFC_PHYP_PRESERVED_SUBQ     0x10
+#define IBMVFC_PHYP_FULL_SUBQ          0x20
+       __be64 reserved[16];
+} __packed __aligned(8);
+
 struct ibmvfc_trace_start_entry {
        u32 xfer_len;
 } __packed;
@@ -532,6 +584,7 @@ enum ibmvfc_async_event {
        IBMVFC_AE_HALT                  = 0x0400,
        IBMVFC_AE_RESUME                        = 0x0800,
        IBMVFC_AE_ADAPTER_FAILED        = 0x1000,
+       IBMVFC_AE_FPIN                  = 0x2000,
 };
 
 struct ibmvfc_async_desc {
@@ -560,10 +613,18 @@ enum ibmvfc_ae_link_state {
        IBMVFC_AE_LS_LINK_DEAD          = 0x08,
 };
 
+enum ibmvfc_ae_fpin_status {
+       IBMVFC_AE_FPIN_LINK_CONGESTED   = 0x1,
+       IBMVFC_AE_FPIN_PORT_CONGESTED   = 0x2,
+       IBMVFC_AE_FPIN_PORT_CLEARED     = 0x3,
+       IBMVFC_AE_FPIN_PORT_DEGRADED    = 0x4,
+};
+
 struct ibmvfc_async_crq {
        volatile u8 valid;
        u8 link_state;
-       u8 pad[2];
+       u8 fpin_status;
+       u8 pad;
        __be32 pad2;
        volatile __be64 event;
        volatile __be64 scsi_id;
@@ -590,6 +651,9 @@ union ibmvfc_iu {
        struct ibmvfc_tmf tmf;
        struct ibmvfc_cmd cmd;
        struct ibmvfc_passthru_mad passthru;
+       struct ibmvfc_channel_enquiry channel_enquiry;
+       struct ibmvfc_channel_setup_mad channel_setup;
+       struct ibmvfc_connection_info connection_info;
 } __packed __aligned(8);
 
 enum ibmvfc_target_action {
-- 
2.27.0

Reply via email to