Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (c) 2016 Avago Technologies.  All rights reserved.
0004  */
0005 
0006 /*
0007  * This file contains definitions relative to FC-NVME-2 r1.08
0008  * (T11-2019-00210-v004).
0009  */
0010 
0011 #ifndef _NVME_FC_H
0012 #define _NVME_FC_H 1
0013 
0014 #include <uapi/scsi/fc/fc_fs.h>
0015 
0016 #define NVME_CMD_FORMAT_ID      0xFD
0017 #define NVME_CMD_FC_ID          FC_TYPE_NVME
0018 
0019 /* FC-NVME Cmd IU Flags */
0020 enum {
0021     FCNVME_CMD_FLAGS_DIRMASK    = 0x03,
0022     FCNVME_CMD_FLAGS_WRITE      = (1 << 0),
0023     FCNVME_CMD_FLAGS_READ       = (1 << 1),
0024 
0025     FCNVME_CMD_FLAGS_PICWP      = (1 << 2),
0026 };
0027 
0028 enum {
0029     FCNVME_CMD_CAT_MASK     = 0x0F,
0030     FCNVME_CMD_CAT_ADMINQ       = 0x01,
0031     FCNVME_CMD_CAT_CSSMASK      = 0x07,
0032     FCNVME_CMD_CAT_CSSFLAG      = 0x08,
0033 };
0034 
0035 static inline __u8 fccmnd_set_cat_admin(__u8 rsv_cat)
0036 {
0037     return (rsv_cat & ~FCNVME_CMD_CAT_MASK) | FCNVME_CMD_CAT_ADMINQ;
0038 }
0039 
0040 static inline __u8 fccmnd_set_cat_css(__u8 rsv_cat, __u8 css)
0041 {
0042     return (rsv_cat & ~FCNVME_CMD_CAT_MASK) | FCNVME_CMD_CAT_CSSFLAG |
0043         (css & FCNVME_CMD_CAT_CSSMASK);
0044 }
0045 
0046 struct nvme_fc_cmd_iu {
0047     __u8            format_id;
0048     __u8            fc_id;
0049     __be16          iu_len;
0050     __u8            rsvd4[2];
0051     __u8            rsv_cat;
0052     __u8            flags;
0053     __be64          connection_id;
0054     __be32          csn;
0055     __be32          data_len;
0056     struct nvme_command sqe;
0057     __u8            dps;
0058     __u8            lbads;
0059     __be16          ms;
0060     __be32          rsvd92;
0061 };
0062 
0063 #define NVME_FC_SIZEOF_ZEROS_RSP    12
0064 
0065 enum {
0066     FCNVME_SC_SUCCESS       = 0,
0067     FCNVME_SC_INVALID_FIELD     = 1,
0068     /* reserved           2 */
0069     FCNVME_SC_ILL_CONN_PARAMS   = 3,
0070 };
0071 
0072 struct nvme_fc_ersp_iu {
0073     __u8            ersp_result;
0074     __u8            rsvd1;
0075     __be16          iu_len;
0076     __be32          rsn;
0077     __be32          xfrd_len;
0078     __be32          rsvd12;
0079     struct nvme_completion  cqe;
0080     /* for now - no additional payload */
0081 };
0082 
0083 
0084 #define FCNVME_NVME_SR_OPCODE       0x01
0085 #define FCNVME_NVME_SR_RSP_OPCODE   0x02
0086 
0087 struct nvme_fc_nvme_sr_iu {
0088     __u8            fc_id;
0089     __u8            opcode;
0090     __u8            rsvd2;
0091     __u8            retry_rctl;
0092     __be32          rsvd4;
0093 };
0094 
0095 
0096 enum {
0097     FCNVME_SRSTAT_ACC       = 0x0,
0098     /* reserved           0x1 */
0099     /* reserved           0x2 */
0100     FCNVME_SRSTAT_LOGICAL_ERR   = 0x3,
0101     FCNVME_SRSTAT_INV_QUALIF    = 0x4,
0102     FCNVME_SRSTAT_UNABL2PERFORM = 0x9,
0103 };
0104 
0105 struct nvme_fc_nvme_sr_rsp_iu {
0106     __u8            fc_id;
0107     __u8            opcode;
0108     __u8            rsvd2;
0109     __u8            status;
0110     __be32          rsvd4;
0111 };
0112 
0113 
0114 /* FC-NVME Link Services - LS cmd values (w0 bits 31:24) */
0115 enum {
0116     FCNVME_LS_RSVD          = 0,
0117     FCNVME_LS_RJT           = 1,
0118     FCNVME_LS_ACC           = 2,
0119     FCNVME_LS_CREATE_ASSOCIATION    = 3,    /* Create Association */
0120     FCNVME_LS_CREATE_CONNECTION = 4,    /* Create I/O Connection */
0121     FCNVME_LS_DISCONNECT_ASSOC  = 5,    /* Disconnect Association */
0122     FCNVME_LS_DISCONNECT_CONN   = 6,    /* Disconnect Connection */
0123 };
0124 
0125 /* FC-NVME Link Service Descriptors */
0126 enum {
0127     FCNVME_LSDESC_RSVD      = 0x0,
0128     FCNVME_LSDESC_RQST      = 0x1,
0129     FCNVME_LSDESC_RJT       = 0x2,
0130     FCNVME_LSDESC_CREATE_ASSOC_CMD  = 0x3,
0131     FCNVME_LSDESC_CREATE_CONN_CMD   = 0x4,
0132     FCNVME_LSDESC_DISCONN_CMD   = 0x5,
0133     FCNVME_LSDESC_CONN_ID       = 0x6,
0134     FCNVME_LSDESC_ASSOC_ID      = 0x7,
0135 };
0136 
0137 
0138 /* ********** start of Link Service Descriptors ********** */
0139 
0140 
0141 /*
0142  * fills in length of a descriptor. Struture minus descriptor header
0143  */
0144 static inline __be32 fcnvme_lsdesc_len(size_t sz)
0145 {
0146     return cpu_to_be32(sz - (2 * sizeof(u32)));
0147 }
0148 
0149 struct fcnvme_ls_rqst_w0 {
0150     u8  ls_cmd;         /* FCNVME_LS_xxx */
0151     u8  zeros[3];
0152 };
0153 
0154 /* FCNVME_LSDESC_RQST */
0155 struct fcnvme_lsdesc_rqst {
0156     __be32  desc_tag;       /* FCNVME_LSDESC_xxx */
0157     __be32  desc_len;
0158     struct fcnvme_ls_rqst_w0    w0;
0159     __be32  rsvd12;
0160 };
0161 
0162 /* FC-NVME LS RJT reason_code values */
0163 enum fcnvme_ls_rjt_reason {
0164     FCNVME_RJT_RC_NONE      = 0,
0165     /* no reason - not to be sent */
0166 
0167     FCNVME_RJT_RC_INVAL     = 0x01,
0168     /* invalid NVMe_LS command code */
0169 
0170     FCNVME_RJT_RC_LOGIC     = 0x03,
0171     /* logical error */
0172 
0173     FCNVME_RJT_RC_UNAB      = 0x09,
0174     /* unable to perform command request */
0175 
0176     FCNVME_RJT_RC_UNSUP     = 0x0b,
0177     /* command not supported */
0178 
0179     FCNVME_RJT_RC_INV_ASSOC     = 0x40,
0180     /* Invalid Association ID */
0181 
0182     FCNVME_RJT_RC_INV_CONN      = 0x41,
0183     /* Invalid Connection ID */
0184 
0185     FCNVME_RJT_RC_INV_PARAM     = 0x42,
0186     /* Invalid Parameters */
0187 
0188     FCNVME_RJT_RC_INSUF_RES     = 0x43,
0189     /* Insufficient Resources */
0190 
0191     FCNVME_RJT_RC_VENDOR        = 0xff,
0192     /* vendor specific error */
0193 };
0194 
0195 /* FC-NVME LS RJT reason_explanation values */
0196 enum fcnvme_ls_rjt_explan {
0197     FCNVME_RJT_EXP_NONE     = 0x00,
0198     /* No additional explanation */
0199 
0200     FCNVME_RJT_EXP_OXID_RXID    = 0x17,
0201     /* invalid OX_ID-RX_ID combination */
0202 
0203     FCNVME_RJT_EXP_UNAB_DATA    = 0x2a,
0204     /* unable to supply requested data */
0205 
0206     FCNVME_RJT_EXP_INV_LEN      = 0x2d,
0207     /* Invalid payload length */
0208 
0209     FCNVME_RJT_EXP_INV_ERSP_RAT = 0x40,
0210     /* Invalid NVMe_ERSP Ratio */
0211 
0212     FCNVME_RJT_EXP_INV_CTLR_ID  = 0x41,
0213     /* Invalid Controller ID */
0214 
0215     FCNVME_RJT_EXP_INV_QUEUE_ID = 0x42,
0216     /* Invalid Queue ID */
0217 
0218     FCNVME_RJT_EXP_INV_SQSIZE   = 0x43,
0219     /* Invalid Submission Queue Size */
0220 
0221     FCNVME_RJT_EXP_INV_HOSTID   = 0x44,
0222     /* Invalid HOST ID */
0223 
0224     FCNVME_RJT_EXP_INV_HOSTNQN  = 0x45,
0225     /* Invalid HOSTNQN */
0226 
0227     FCNVME_RJT_EXP_INV_SUBNQN   = 0x46,
0228     /* Invalid SUBNQN */
0229 };
0230 
0231 /* FCNVME_LSDESC_RJT */
0232 struct fcnvme_lsdesc_rjt {
0233     __be32  desc_tag;       /* FCNVME_LSDESC_xxx */
0234     __be32  desc_len;
0235     u8  rsvd8;
0236 
0237     /*
0238      * Reject reason and explanaction codes are generic
0239      * to ELs's from LS-3.
0240      */
0241     u8  reason_code;        /* fcnvme_ls_rjt_reason */
0242     u8  reason_explanation; /* fcnvme_ls_rjt_explan */
0243 
0244     u8  vendor;
0245     __be32  rsvd12;
0246 };
0247 
0248 
0249 #define FCNVME_ASSOC_HOSTNQN_LEN    256
0250 #define FCNVME_ASSOC_SUBNQN_LEN     256
0251 
0252 /* FCNVME_LSDESC_CREATE_ASSOC_CMD */
0253 struct fcnvme_lsdesc_cr_assoc_cmd {
0254     __be32  desc_tag;       /* FCNVME_LSDESC_xxx */
0255     __be32  desc_len;
0256     __be16  ersp_ratio;
0257     __be16  rsvd10;
0258     __be32  rsvd12[9];
0259     __be16  cntlid;
0260     __be16  sqsize;
0261     __be32  rsvd52;
0262     uuid_t  hostid;
0263     u8  hostnqn[FCNVME_ASSOC_HOSTNQN_LEN];
0264     u8  subnqn[FCNVME_ASSOC_SUBNQN_LEN];
0265     __be32  rsvd584[108];       /* pad to 1016 bytes,
0266                      * which makes overall LS rqst
0267                      * payload 1024 bytes
0268                      */
0269 };
0270 
0271 #define FCNVME_LSDESC_CRA_CMD_DESC_MINLEN   \
0272         offsetof(struct fcnvme_lsdesc_cr_assoc_cmd, rsvd584)
0273 
0274 #define FCNVME_LSDESC_CRA_CMD_DESC_MIN_DESCLEN  \
0275         (FCNVME_LSDESC_CRA_CMD_DESC_MINLEN - \
0276          offsetof(struct fcnvme_lsdesc_cr_assoc_cmd, ersp_ratio))
0277 
0278 
0279 
0280 /* FCNVME_LSDESC_CREATE_CONN_CMD */
0281 struct fcnvme_lsdesc_cr_conn_cmd {
0282     __be32  desc_tag;       /* FCNVME_LSDESC_xxx */
0283     __be32  desc_len;
0284     __be16  ersp_ratio;
0285     __be16  rsvd10;
0286     __be32  rsvd12[9];
0287     __be16  qid;
0288     __be16  sqsize;
0289     __be32  rsvd52;
0290 };
0291 
0292 /* FCNVME_LSDESC_DISCONN_CMD */
0293 struct fcnvme_lsdesc_disconn_cmd {
0294     __be32  desc_tag;       /* FCNVME_LSDESC_xxx */
0295     __be32  desc_len;
0296     __be32  rsvd8[4];
0297 };
0298 
0299 /* FCNVME_LSDESC_CONN_ID */
0300 struct fcnvme_lsdesc_conn_id {
0301     __be32  desc_tag;       /* FCNVME_LSDESC_xxx */
0302     __be32  desc_len;
0303     __be64  connection_id;
0304 };
0305 
0306 /* FCNVME_LSDESC_ASSOC_ID */
0307 struct fcnvme_lsdesc_assoc_id {
0308     __be32  desc_tag;       /* FCNVME_LSDESC_xxx */
0309     __be32  desc_len;
0310     __be64  association_id;
0311 };
0312 
0313 /* r_ctl values */
0314 enum {
0315     FCNVME_RS_RCTL_CMND     = 0x6,
0316     FCNVME_RS_RCTL_DATA     = 0x1,
0317     FCNVME_RS_RCTL_CONF     = 0x3,
0318     FCNVME_RS_RCTL_SR       = 0x9,
0319     FCNVME_RS_RCTL_XFER_RDY     = 0x5,
0320     FCNVME_RS_RCTL_RSP      = 0x7,
0321     FCNVME_RS_RCTL_ERSP     = 0x8,
0322     FCNVME_RS_RCTL_SR_RSP       = 0xA,
0323 };
0324 
0325 
0326 /* ********** start of Link Services ********** */
0327 
0328 
0329 /* FCNVME_LS_RJT */
0330 struct fcnvme_ls_rjt {
0331     struct fcnvme_ls_rqst_w0        w0;
0332     __be32                  desc_list_len;
0333     struct fcnvme_lsdesc_rqst       rqst;
0334     struct fcnvme_lsdesc_rjt        rjt;
0335 };
0336 
0337 /* FCNVME_LS_ACC */
0338 struct fcnvme_ls_acc_hdr {
0339     struct fcnvme_ls_rqst_w0        w0;
0340     __be32                  desc_list_len;
0341     struct fcnvme_lsdesc_rqst       rqst;
0342     /*
0343      * Followed by cmd-specific ACCEPT descriptors, see xxx_acc
0344      * definitions below
0345      */
0346 };
0347 
0348 /* FCNVME_LS_CREATE_ASSOCIATION */
0349 struct fcnvme_ls_cr_assoc_rqst {
0350     struct fcnvme_ls_rqst_w0        w0;
0351     __be32                  desc_list_len;
0352     struct fcnvme_lsdesc_cr_assoc_cmd   assoc_cmd;
0353 };
0354 
0355 #define FCNVME_LSDESC_CRA_RQST_MINLEN   \
0356         (offsetof(struct fcnvme_ls_cr_assoc_rqst, assoc_cmd) + \
0357             FCNVME_LSDESC_CRA_CMD_DESC_MINLEN)
0358 
0359 #define FCNVME_LSDESC_CRA_RQST_MIN_LISTLEN  \
0360         FCNVME_LSDESC_CRA_CMD_DESC_MINLEN
0361 
0362 
0363 struct fcnvme_ls_cr_assoc_acc {
0364     struct fcnvme_ls_acc_hdr        hdr;
0365     struct fcnvme_lsdesc_assoc_id       associd;
0366     struct fcnvme_lsdesc_conn_id        connectid;
0367 };
0368 
0369 
0370 /* FCNVME_LS_CREATE_CONNECTION */
0371 struct fcnvme_ls_cr_conn_rqst {
0372     struct fcnvme_ls_rqst_w0        w0;
0373     __be32                  desc_list_len;
0374     struct fcnvme_lsdesc_assoc_id       associd;
0375     struct fcnvme_lsdesc_cr_conn_cmd    connect_cmd;
0376 };
0377 
0378 struct fcnvme_ls_cr_conn_acc {
0379     struct fcnvme_ls_acc_hdr        hdr;
0380     struct fcnvme_lsdesc_conn_id        connectid;
0381 };
0382 
0383 /* FCNVME_LS_DISCONNECT_ASSOC */
0384 struct fcnvme_ls_disconnect_assoc_rqst {
0385     struct fcnvme_ls_rqst_w0        w0;
0386     __be32                  desc_list_len;
0387     struct fcnvme_lsdesc_assoc_id       associd;
0388     struct fcnvme_lsdesc_disconn_cmd    discon_cmd;
0389 };
0390 
0391 struct fcnvme_ls_disconnect_assoc_acc {
0392     struct fcnvme_ls_acc_hdr        hdr;
0393 };
0394 
0395 
0396 /* FCNVME_LS_DISCONNECT_CONN */
0397 struct fcnvme_ls_disconnect_conn_rqst {
0398     struct fcnvme_ls_rqst_w0        w0;
0399     __be32                  desc_list_len;
0400     struct fcnvme_lsdesc_assoc_id       associd;
0401     struct fcnvme_lsdesc_conn_id        connectid;
0402 };
0403 
0404 struct fcnvme_ls_disconnect_conn_acc {
0405     struct fcnvme_ls_acc_hdr        hdr;
0406 };
0407 
0408 
0409 /*
0410  * Default R_A_TOV is pulled in from fc_fs.h but needs conversion
0411  * from ms to seconds for our use.
0412  */
0413 #define FC_TWO_TIMES_R_A_TOV        (2 * (FC_DEF_R_A_TOV / 1000))
0414 #define NVME_FC_LS_TIMEOUT_SEC      FC_TWO_TIMES_R_A_TOV
0415 #define NVME_FC_TGTOP_TIMEOUT_SEC   FC_TWO_TIMES_R_A_TOV
0416 
0417 /*
0418  * TRADDR string must be of form "nn-<16hexdigits>:pn-<16hexdigits>"
0419  * the string is allowed to be specified with or without a "0x" prefix
0420  * infront of the <16hexdigits>.  Without is considered the "min" string
0421  * and with is considered the "max" string. The hexdigits may be upper
0422  * or lower case.
0423  * Note: FC-NVME-2 standard requires a "0x" prefix.
0424  */
0425 #define NVME_FC_TRADDR_NNLEN        3   /* "?n-" */
0426 #define NVME_FC_TRADDR_OXNNLEN      5   /* "?n-0x" */
0427 #define NVME_FC_TRADDR_HEXNAMELEN   16
0428 #define NVME_FC_TRADDR_MINLENGTH    \
0429         (2 * (NVME_FC_TRADDR_NNLEN + NVME_FC_TRADDR_HEXNAMELEN) + 1)
0430 #define NVME_FC_TRADDR_MAXLENGTH    \
0431         (2 * (NVME_FC_TRADDR_OXNNLEN + NVME_FC_TRADDR_HEXNAMELEN) + 1)
0432 #define NVME_FC_TRADDR_MIN_PN_OFFSET    \
0433         (NVME_FC_TRADDR_NNLEN + NVME_FC_TRADDR_HEXNAMELEN + 1)
0434 #define NVME_FC_TRADDR_MAX_PN_OFFSET    \
0435         (NVME_FC_TRADDR_OXNNLEN + NVME_FC_TRADDR_HEXNAMELEN + 1)
0436 
0437 
0438 #endif /* _NVME_FC_H */