nvme-fc: Sync nvme-fc header to FC-NVME-2
authorJames Smart <jsmart2021@gmail.com>
Fri, 27 Sep 2019 21:51:34 +0000 (14:51 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 4 Nov 2019 17:56:40 +0000 (10:56 -0700)
Sync the header to FC-NVME-2 r1.06 (T11-2019-00210-v001).

Includes some minor mods where pre-release field names changed
by the time the spec was released.

Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/nvme-fc.h

index 067c9fea64fe07f1a73e10ee4fea75a71d914308..e8c30b39bb27f72ac73a3ed0dc6d3aad46cfbe86 100644 (file)
@@ -4,33 +4,60 @@
  */
 
 /*
- * This file contains definitions relative to FC-NVME r1.14 (16-020vB).
- * The fcnvme_lsdesc_cr_assoc_cmd struct reflects expected r1.16 content.
+ * This file contains definitions relative to FC-NVME-2 r1.06
+ * (T11-2019-00210-v001).
  */
 
 #ifndef _NVME_FC_H
 #define _NVME_FC_H 1
 
+#include <uapi/scsi/fc/fc_fs.h>
 
-#define NVME_CMD_SCSI_ID               0xFD
+#define NVME_CMD_FORMAT_ID             0xFD
 #define NVME_CMD_FC_ID                 FC_TYPE_NVME
 
 /* FC-NVME Cmd IU Flags */
-#define FCNVME_CMD_FLAGS_DIRMASK       0x03
-#define FCNVME_CMD_FLAGS_WRITE         0x01
-#define FCNVME_CMD_FLAGS_READ          0x02
+enum {
+       FCNVME_CMD_FLAGS_DIRMASK        = 0x03,
+       FCNVME_CMD_FLAGS_WRITE          = (1 << 0),
+       FCNVME_CMD_FLAGS_READ           = (1 << 1),
+
+       FCNVME_CMD_FLAGS_PICWP          = (1 << 2),
+};
+
+enum {
+       FCNVME_CMD_CAT_MASK             = 0x0F,
+       FCNVME_CMD_CAT_ADMINQ           = 0x01,
+       FCNVME_CMD_CAT_CSSMASK          = 0x07,
+       FCNVME_CMD_CAT_CSSFLAG          = 0x08,
+};
+
+static inline __u8 fccmnd_set_cat_admin(__u8 rsv_cat)
+{
+       return (rsv_cat & ~FCNVME_CMD_CAT_MASK) | FCNVME_CMD_CAT_ADMINQ;
+}
+
+static inline __u8 fccmnd_set_cat_css(__u8 rsv_cat, __u8 css)
+{
+       return (rsv_cat & ~FCNVME_CMD_CAT_MASK) | FCNVME_CMD_CAT_CSSFLAG |
+               (css & FCNVME_CMD_CAT_CSSMASK);
+}
 
 struct nvme_fc_cmd_iu {
-       __u8                    scsi_id;
+       __u8                    format_id;
        __u8                    fc_id;
        __be16                  iu_len;
-       __u8                    rsvd4[3];
+       __u8                    rsvd4[2];
+       __u8                    rsv_cat;
        __u8                    flags;
        __be64                  connection_id;
        __be32                  csn;
        __be32                  data_len;
        struct nvme_command     sqe;
-       __be32                  rsvd88[2];
+       __u8                    dps;
+       __u8                    lbads;
+       __be16                  ms;
+       __be32                  rsvd92;
 };
 
 #define NVME_FC_SIZEOF_ZEROS_RSP       12
@@ -38,11 +65,12 @@ struct nvme_fc_cmd_iu {
 enum {
        FCNVME_SC_SUCCESS               = 0,
        FCNVME_SC_INVALID_FIELD         = 1,
-       FCNVME_SC_INVALID_CONNID        = 2,
+       /* reserved                       2 */
+       FCNVME_SC_ILL_CONN_PARAMS       = 3,
 };
 
 struct nvme_fc_ersp_iu {
-       __u8                    status_code;
+       __u8                    ersp_result;
        __u8                    rsvd1;
        __be16                  iu_len;
        __be32                  rsn;
@@ -53,14 +81,44 @@ struct nvme_fc_ersp_iu {
 };
 
 
-/* FC-NVME Link Services */
+#define FCNVME_NVME_SR_OPCODE  0x01
+
+struct nvme_fc_nvme_sr_iu {
+       __u8                    fc_id;
+       __u8                    opcode;
+       __u8                    rsvd2;
+       __u8                    retry_rctl;
+       __be32                  rsvd4;
+};
+
+
+enum {
+       FCNVME_SRSTAT_ACC               = 0x0,
+       FCNVME_SRSTAT_INV_FCID          = 0x1,
+       /* reserved                       0x2 */
+       FCNVME_SRSTAT_LOGICAL_ERR       = 0x3,
+       FCNVME_SRSTAT_INV_QUALIF        = 0x4,
+       FCNVME_SRSTAT_UNABL2PERFORM     = 0x9,
+};
+
+struct nvme_fc_nvme_sr_rsp_iu {
+       __u8                    fc_id;
+       __u8                    opcode;
+       __u8                    rsvd2;
+       __u8                    status;
+       __be32                  rsvd4;
+};
+
+
+/* FC-NVME Link Services - LS cmd values (w0 bits 31:24) */
 enum {
        FCNVME_LS_RSVD                  = 0,
        FCNVME_LS_RJT                   = 1,
        FCNVME_LS_ACC                   = 2,
-       FCNVME_LS_CREATE_ASSOCIATION    = 3,
-       FCNVME_LS_CREATE_CONNECTION     = 4,
-       FCNVME_LS_DISCONNECT            = 5,
+       FCNVME_LS_CREATE_ASSOCIATION    = 3,    /* Create Association */
+       FCNVME_LS_CREATE_CONNECTION     = 4,    /* Create I/O Connection */
+       FCNVME_LS_DISCONNECT_ASSOC      = 5,    /* Disconnect Association */
+       FCNVME_LS_DISCONNECT_CONN       = 6,    /* Disconnect Connection */
 };
 
 /* FC-NVME Link Service Descriptors */
@@ -117,14 +175,17 @@ enum fcnvme_ls_rjt_reason {
        FCNVME_RJT_RC_UNSUP             = 0x0b,
        /* command not supported */
 
-       FCNVME_RJT_RC_INPROG            = 0x0e,
-       /* command already in progress */
-
        FCNVME_RJT_RC_INV_ASSOC         = 0x40,
-       /* Invalid Association ID*/
+       /* Invalid Association ID */
 
        FCNVME_RJT_RC_INV_CONN          = 0x41,
-       /* Invalid Connection ID*/
+       /* Invalid Connection ID */
+
+       FCNVME_RJT_RC_INV_PARAM         = 0x42,
+       /* Invalid Parameters */
+
+       FCNVME_RJT_RC_INSUF_RES         = 0x43,
+       /* Insufficient Resources */
 
        FCNVME_RJT_RC_VENDOR            = 0xff,
        /* vendor specific error */
@@ -138,14 +199,32 @@ enum fcnvme_ls_rjt_explan {
        FCNVME_RJT_EXP_OXID_RXID        = 0x17,
        /* invalid OX_ID-RX_ID combination */
 
-       FCNVME_RJT_EXP_INSUF_RES        = 0x29,
-       /* insufficient resources */
-
        FCNVME_RJT_EXP_UNAB_DATA        = 0x2a,
        /* unable to supply requested data */
 
        FCNVME_RJT_EXP_INV_LEN          = 0x2d,
        /* Invalid payload length */
+
+       FCNVME_RJT_EXP_INV_ERSP_RAT     = 0x40,
+       /* Invalid NVMe_ERSP Ratio */
+
+       FCNVME_RJT_EXP_INV_CTLR_ID      = 0x41,
+       /* Invalid Controller ID */
+
+       FCNVME_RJT_EXP_INV_QUEUE_ID     = 0x42,
+       /* Invalid Queue ID */
+
+       FCNVME_RJT_EXP_INV_SQSIZE       = 0x43,
+       /* Invalid Submission Queue Size */
+
+       FCNVME_RJT_EXP_INV_HOSTID       = 0x44,
+       /* Invalid HOST ID */
+
+       FCNVME_RJT_EXP_INV_HOSTNQN      = 0x45,
+       /* Invalid HOSTNQN */
+
+       FCNVME_RJT_EXP_INV_SUBNQN       = 0x46,
+       /* Invalid SUBNQN */
 };
 
 /* FCNVME_LSDESC_RJT */
@@ -209,21 +288,11 @@ struct fcnvme_lsdesc_cr_conn_cmd {
        __be32  rsvd52;
 };
 
-/* Disconnect Scope Values */
-enum {
-       FCNVME_DISCONN_ASSOCIATION      = 0,
-       FCNVME_DISCONN_CONNECTION       = 1,
-};
-
 /* FCNVME_LSDESC_DISCONN_CMD */
 struct fcnvme_lsdesc_disconn_cmd {
        __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
        __be32  desc_len;
-       u8      rsvd8[3];
-       /* note: scope is really a 1 bit field */
-       u8      scope;                  /* FCNVME_DISCONN_xxx */
-       __be32  rsvd12;
-       __be64  id;
+       __be32  rsvd8[4];
 };
 
 /* FCNVME_LSDESC_CONN_ID */
@@ -242,9 +311,14 @@ struct fcnvme_lsdesc_assoc_id {
 
 /* r_ctl values */
 enum {
-       FCNVME_RS_RCTL_DATA             = 1,
-       FCNVME_RS_RCTL_XFER_RDY         = 5,
-       FCNVME_RS_RCTL_RSP              = 8,
+       FCNVME_RS_RCTL_CMND             = 0x6,
+       FCNVME_RS_RCTL_DATA             = 0x1,
+       FCNVME_RS_RCTL_CONF             = 0x3,
+       FCNVME_RS_RCTL_SR               = 0x9,
+       FCNVME_RS_RCTL_XFER_RDY         = 0x5,
+       FCNVME_RS_RCTL_RSP              = 0x7,
+       FCNVME_RS_RCTL_ERSP             = 0x8,
+       FCNVME_RS_RCTL_SR_RSP           = 0xA,
 };
 
 
@@ -264,7 +338,10 @@ struct fcnvme_ls_acc_hdr {
        struct fcnvme_ls_rqst_w0                w0;
        __be32                                  desc_list_len;
        struct fcnvme_lsdesc_rqst               rqst;
-       /* Followed by cmd-specific ACC descriptors, see next definitions */
+       /*
+        * Followed by cmd-specific ACCEPT descriptors, see xxx_acc
+        * definitions below
+        */
 };
 
 /* FCNVME_LS_CREATE_ASSOCIATION */
@@ -302,25 +379,39 @@ struct fcnvme_ls_cr_conn_acc {
        struct fcnvme_lsdesc_conn_id            connectid;
 };
 
-/* FCNVME_LS_DISCONNECT */
-struct fcnvme_ls_disconnect_rqst {
+/* FCNVME_LS_DISCONNECT_ASSOC */
+struct fcnvme_ls_disconnect_assoc_rqst {
        struct fcnvme_ls_rqst_w0                w0;
        __be32                                  desc_list_len;
        struct fcnvme_lsdesc_assoc_id           associd;
        struct fcnvme_lsdesc_disconn_cmd        discon_cmd;
 };
 
-struct fcnvme_ls_disconnect_acc {
+struct fcnvme_ls_disconnect_assoc_acc {
+       struct fcnvme_ls_acc_hdr                hdr;
+};
+
+
+/* FCNVME_LS_DISCONNECT_CONN */
+struct fcnvme_ls_disconnect_conn_rqst {
+       struct fcnvme_ls_rqst_w0                w0;
+       __be32                                  desc_list_len;
+       struct fcnvme_lsdesc_assoc_id           associd;
+       struct fcnvme_lsdesc_disconn_cmd        connectid;
+};
+
+struct fcnvme_ls_disconnect_conn_acc {
        struct fcnvme_ls_acc_hdr                hdr;
 };
 
 
 /*
- * Yet to be defined in FC-NVME:
+ * Default R_A_TOV is pulled in from fc_fs.h but needs conversion
+ * from ms to seconds for our use.
  */
-#define NVME_FC_CONNECT_TIMEOUT_SEC    2               /* 2 seconds */
-#define NVME_FC_LS_TIMEOUT_SEC         2               /* 2 seconds */
-#define NVME_FC_TGTOP_TIMEOUT_SEC      2               /* 2 seconds */
+#define FC_TWO_TIMES_R_A_TOV           (2 * (FC_DEF_R_A_TOV / 1000))
+#define NVME_FC_LS_TIMEOUT_SEC         FC_TWO_TIMES_R_A_TOV
+#define NVME_FC_TGTOP_TIMEOUT_SEC      FC_TWO_TIMES_R_A_TOV
 
 /*
  * TRADDR string must be of form "nn-<16hexdigits>:pn-<16hexdigits>"
@@ -328,6 +419,7 @@ struct fcnvme_ls_disconnect_acc {
  * infront of the <16hexdigits>.  Without is considered the "min" string
  * and with is considered the "max" string. The hexdigits may be upper
  * or lower case.
+ * Note: FC-NVME-2 standard requires a "0x" prefix.
  */
 #define NVME_FC_TRADDR_NNLEN           3       /* "?n-" */
 #define NVME_FC_TRADDR_OXNNLEN         5       /* "?n-0x" */