]> www.infradead.org Git - linux.git/commitdiff
scsi: fc: Add EDC ELS definition
authorJames Smart <jsmart2021@gmail.com>
Mon, 16 Aug 2021 16:28:46 +0000 (09:28 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 25 Aug 2021 02:56:33 +0000 (22:56 -0400)
Add Exchange Diagnostic Capabilities (EDC) ELS definition and the following
capability descriptors:

 - Link Fault Capability Descriptor

 - Congestion Signaling Capability Descriptor

Definitions taken from FC-LS-5 r5.01

Link: https://lore.kernel.org/r/20210816162901.121235-2-jsmart2021@gmail.com
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
include/uapi/scsi/fc/fc_els.h

index 91d4be9872203d22358a5c5adb23298d5dc39818..c9812c5c2fc44cf5cd8e78b601ba69c230644d0b 100644 (file)
@@ -41,6 +41,7 @@ enum fc_els_cmd {
        ELS_REC =       0x13,   /* read exchange concise */
        ELS_SRR =       0x14,   /* sequence retransmission request */
        ELS_FPIN =      0x16,   /* Fabric Performance Impact Notification */
+       ELS_EDC =       0x17,   /* Exchange Diagnostic Capabilities */
        ELS_RDP =       0x18,   /* Read Diagnostic Parameters */
        ELS_RDF =       0x19,   /* Register Diagnostic Functions */
        ELS_PRLI =      0x20,   /* process login */
@@ -111,6 +112,7 @@ enum fc_els_cmd {
        [ELS_REC] =     "REC",                  \
        [ELS_SRR] =     "SRR",                  \
        [ELS_FPIN] =    "FPIN",                 \
+       [ELS_EDC] =     "EDC",                  \
        [ELS_RDP] =     "RDP",                  \
        [ELS_RDF] =     "RDF",                  \
        [ELS_PRLI] =    "PRLI",                 \
@@ -218,6 +220,10 @@ enum fc_els_rjt_explan {
 enum fc_ls_tlv_dtag {
        ELS_DTAG_LS_REQ_INFO =          0x00000001,
                /* Link Service Request Information Descriptor */
+       ELS_DTAG_LNK_FAULT_CAP =        0x0001000D,
+               /* Link Fault Capability Descriptor */
+       ELS_DTAG_CG_SIGNAL_CAP =        0x0001000F,
+               /* Congestion Signaling Capability Descriptor */
        ELS_DTAG_LNK_INTEGRITY =        0x00020001,
                /* Link Integrity Notification Descriptor */
        ELS_DTAG_DELIVERY =             0x00020002,
@@ -236,6 +242,8 @@ enum fc_ls_tlv_dtag {
  */
 #define FC_LS_TLV_DTAG_INIT {                                        \
        { ELS_DTAG_LS_REQ_INFO,         "Link Service Request Information" }, \
+       { ELS_DTAG_LNK_FAULT_CAP,       "Link Fault Capability" },            \
+       { ELS_DTAG_CG_SIGNAL_CAP,       "Congestion Signaling Capability" },  \
        { ELS_DTAG_LNK_INTEGRITY,       "Link Integrity Notification" },      \
        { ELS_DTAG_DELIVERY,            "Delivery Notification Present" },    \
        { ELS_DTAG_PEER_CONGEST,        "Peer Congestion Notification" },     \
@@ -1144,4 +1152,102 @@ struct fc_els_rdf_resp {
 };
 
 
+/*
+ * Diagnostic Capability Descriptors for EDC ELS
+ */
+
+/*
+ * Diagnostic: Link Fault Capability Descriptor
+ */
+struct fc_diag_lnkflt_desc {
+       __be32          desc_tag;       /* Descriptor Tag (0x0001000D) */
+       __be32          desc_len;       /* Length of Descriptor (in bytes).
+                                        * Size of descriptor excluding
+                                        * desc_tag and desc_len fields.
+                                        * 12 bytes
+                                        */
+       __be32          degrade_activate_threshold;
+       __be32          degrade_deactivate_threshold;
+       __be32          fec_degrade_interval;
+};
+
+enum fc_edc_cg_signal_cap_types {
+       /* Note: Capability: bits 31:4 Rsvd; bits 3:0 are capabilities */
+       EDC_CG_SIG_NOTSUPPORTED =       0x00, /* neither supported */
+       EDC_CG_SIG_WARN_ONLY =          0x01,
+       EDC_CG_SIG_WARN_ALARM =         0x02, /* both supported */
+};
+
+/*
+ * Initializer useful for decoding table.
+ * Please keep this in sync with the above definitions.
+ */
+#define FC_EDC_CG_SIGNAL_CAP_TYPES_INIT {                              \
+       { EDC_CG_SIG_NOTSUPPORTED,      "Signaling Not Supported" },    \
+       { EDC_CG_SIG_WARN_ONLY,         "Warning Signal" },             \
+       { EDC_CG_SIG_WARN_ALARM,        "Warning and Alarm Signals" },  \
+}
+
+enum fc_diag_cg_sig_freq_types {
+       EDC_CG_SIGFREQ_CNT_MIN =        1,      /* Min Frequency Count */
+       EDC_CG_SIGFREQ_CNT_MAX =        999,    /* Max Frequency Count */
+
+       EDC_CG_SIGFREQ_SEC =            0x1,    /* Units: seconds */
+       EDC_CG_SIGFREQ_MSEC =           0x2,    /* Units: milliseconds */
+};
+
+struct fc_diag_cg_sig_freq {
+       __be16          count;          /* Time between signals
+                                        * note: upper 6 bits rsvd
+                                        */
+       __be16          units;          /* Time unit for count
+                                        * note: upper 12 bits rsvd
+                                        */
+};
+
+/*
+ * Diagnostic: Congestion Signaling Capability Descriptor
+ */
+struct fc_diag_cg_sig_desc {
+       __be32          desc_tag;       /* Descriptor Tag (0x0001000F) */
+       __be32          desc_len;       /* Length of Descriptor (in bytes).
+                                        * Size of descriptor excluding
+                                        * desc_tag and desc_len fields.
+                                        * 16 bytes
+                                        */
+       __be32                          xmt_signal_capability;
+       struct fc_diag_cg_sig_freq      xmt_signal_frequency;
+       __be32                          rcv_signal_capability;
+       struct fc_diag_cg_sig_freq      rcv_signal_frequency;
+};
+
+/*
+ * ELS_EDC - Exchange Diagnostic Capabilities
+ */
+struct fc_els_edc {
+       __u8            edc_cmd;        /* command (0x17) */
+       __u8            edc_zero[3];    /* specified as zero - part of cmd */
+       __be32          desc_len;       /* Length of Descriptor List (in bytes).
+                                        * Size of ELS excluding edc_cmd,
+                                        * edc_zero and desc_len fields.
+                                        */
+       struct fc_tlv_desc      desc[0];
+                                       /* Diagnostic Descriptor list */
+};
+
+/*
+ * ELS EDC LS_ACC Response.
+ */
+struct fc_els_edc_resp {
+       struct fc_els_ls_acc    acc_hdr;
+       __be32                  desc_list_len;  /* Length of response (in
+                                                * bytes). Excludes acc_hdr
+                                                * and desc_list_len fields.
+                                                */
+       struct fc_els_lsri_desc lsri;
+       struct fc_tlv_desc      desc[0];
+                                   /* Supported Diagnostic Descriptor list */
+};
+
+
 #endif /* _FC_ELS_H_ */