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 {
        __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];
        __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;
        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;
        IBMVFC_AE_HALT                  = 0x0400,
        IBMVFC_AE_RESUME                        = 0x0800,
        IBMVFC_AE_ADAPTER_FAILED        = 0x1000,
+       IBMVFC_AE_FPIN                  = 0x2000,
 };
 
 struct ibmvfc_async_desc {
        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;
        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 {