Robert Love | f032c2f | 2008-12-09 15:10:11 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright(c) 2007 Intel Corporation. All rights reserved. |
| 3 | * |
| 4 | * This program is free software; you can redistribute it and/or modify it |
| 5 | * under the terms and conditions of the GNU General Public License, |
| 6 | * version 2, as published by the Free Software Foundation. |
| 7 | * |
| 8 | * This program is distributed in the hope it will be useful, but WITHOUT |
| 9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| 11 | * more details. |
| 12 | * |
| 13 | * You should have received a copy of the GNU General Public License along with |
| 14 | * this program; if not, write to the Free Software Foundation, Inc., |
| 15 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. |
| 16 | * |
| 17 | * Maintained at www.Open-FCoE.org |
| 18 | */ |
| 19 | |
| 20 | #ifndef _FC_FS_H_ |
| 21 | #define _FC_FS_H_ |
| 22 | |
Robert Love | 07aac32 | 2009-11-03 11:47:23 -0800 | [diff] [blame^] | 23 | #include <linux/types.h> |
| 24 | |
Robert Love | f032c2f | 2008-12-09 15:10:11 -0800 | [diff] [blame] | 25 | /* |
| 26 | * Fibre Channel Framing and Signalling definitions. |
| 27 | * From T11 FC-FS-2 Rev 0.90 - 9 August 2005. |
| 28 | */ |
| 29 | |
| 30 | /* |
| 31 | * Frame header |
| 32 | */ |
| 33 | struct fc_frame_header { |
| 34 | __u8 fh_r_ctl; /* routing control */ |
| 35 | __u8 fh_d_id[3]; /* Destination ID */ |
| 36 | |
| 37 | __u8 fh_cs_ctl; /* class of service control / pri */ |
| 38 | __u8 fh_s_id[3]; /* Source ID */ |
| 39 | |
| 40 | __u8 fh_type; /* see enum fc_fh_type below */ |
| 41 | __u8 fh_f_ctl[3]; /* frame control */ |
| 42 | |
| 43 | __u8 fh_seq_id; /* sequence ID */ |
| 44 | __u8 fh_df_ctl; /* data field control */ |
| 45 | __be16 fh_seq_cnt; /* sequence count */ |
| 46 | |
| 47 | __be16 fh_ox_id; /* originator exchange ID */ |
| 48 | __be16 fh_rx_id; /* responder exchange ID */ |
| 49 | __be32 fh_parm_offset; /* parameter or relative offset */ |
| 50 | }; |
| 51 | |
| 52 | #define FC_FRAME_HEADER_LEN 24 /* expected length of structure */ |
| 53 | |
| 54 | #define FC_MAX_PAYLOAD 2112U /* max payload length in bytes */ |
| 55 | #define FC_MIN_MAX_PAYLOAD 256U /* lower limit on max payload */ |
| 56 | |
| 57 | #define FC_MAX_FRAME (FC_MAX_PAYLOAD + FC_FRAME_HEADER_LEN) |
| 58 | #define FC_MIN_MAX_FRAME (FC_MIN_MAX_PAYLOAD + FC_FRAME_HEADER_LEN) |
| 59 | |
| 60 | /* |
| 61 | * fh_r_ctl - Routing control definitions. |
| 62 | */ |
| 63 | /* |
| 64 | * FC-4 device_data. |
| 65 | */ |
| 66 | enum fc_rctl { |
| 67 | FC_RCTL_DD_UNCAT = 0x00, /* uncategorized information */ |
| 68 | FC_RCTL_DD_SOL_DATA = 0x01, /* solicited data */ |
| 69 | FC_RCTL_DD_UNSOL_CTL = 0x02, /* unsolicited control */ |
| 70 | FC_RCTL_DD_SOL_CTL = 0x03, /* solicited control or reply */ |
| 71 | FC_RCTL_DD_UNSOL_DATA = 0x04, /* unsolicited data */ |
| 72 | FC_RCTL_DD_DATA_DESC = 0x05, /* data descriptor */ |
| 73 | FC_RCTL_DD_UNSOL_CMD = 0x06, /* unsolicited command */ |
| 74 | FC_RCTL_DD_CMD_STATUS = 0x07, /* command status */ |
| 75 | |
| 76 | #define FC_RCTL_ILS_REQ FC_RCTL_DD_UNSOL_CTL /* ILS request */ |
| 77 | #define FC_RCTL_ILS_REP FC_RCTL_DD_SOL_CTL /* ILS reply */ |
| 78 | |
| 79 | /* |
| 80 | * Extended Link_Data |
| 81 | */ |
| 82 | FC_RCTL_ELS_REQ = 0x22, /* extended link services request */ |
| 83 | FC_RCTL_ELS_REP = 0x23, /* extended link services reply */ |
| 84 | FC_RCTL_ELS4_REQ = 0x32, /* FC-4 ELS request */ |
| 85 | FC_RCTL_ELS4_REP = 0x33, /* FC-4 ELS reply */ |
| 86 | /* |
| 87 | * Optional Extended Headers |
| 88 | */ |
| 89 | FC_RCTL_VFTH = 0x50, /* virtual fabric tagging header */ |
| 90 | FC_RCTL_IFRH = 0x51, /* inter-fabric routing header */ |
| 91 | FC_RCTL_ENCH = 0x52, /* encapsulation header */ |
| 92 | /* |
| 93 | * Basic Link Services fh_r_ctl values. |
| 94 | */ |
| 95 | FC_RCTL_BA_NOP = 0x80, /* basic link service NOP */ |
| 96 | FC_RCTL_BA_ABTS = 0x81, /* basic link service abort */ |
| 97 | FC_RCTL_BA_RMC = 0x82, /* remove connection */ |
| 98 | FC_RCTL_BA_ACC = 0x84, /* basic accept */ |
| 99 | FC_RCTL_BA_RJT = 0x85, /* basic reject */ |
| 100 | FC_RCTL_BA_PRMT = 0x86, /* dedicated connection preempted */ |
| 101 | /* |
| 102 | * Link Control Information. |
| 103 | */ |
| 104 | FC_RCTL_ACK_1 = 0xc0, /* acknowledge_1 */ |
| 105 | FC_RCTL_ACK_0 = 0xc1, /* acknowledge_0 */ |
| 106 | FC_RCTL_P_RJT = 0xc2, /* port reject */ |
| 107 | FC_RCTL_F_RJT = 0xc3, /* fabric reject */ |
| 108 | FC_RCTL_P_BSY = 0xc4, /* port busy */ |
| 109 | FC_RCTL_F_BSY = 0xc5, /* fabric busy to data frame */ |
| 110 | FC_RCTL_F_BSYL = 0xc6, /* fabric busy to link control frame */ |
| 111 | FC_RCTL_LCR = 0xc7, /* link credit reset */ |
| 112 | FC_RCTL_END = 0xc9, /* end */ |
| 113 | }; |
| 114 | /* incomplete list of definitions */ |
| 115 | |
| 116 | /* |
| 117 | * R_CTL names initializer. |
| 118 | * Please keep this matching the above definitions. |
| 119 | */ |
| 120 | #define FC_RCTL_NAMES_INIT { \ |
| 121 | [FC_RCTL_DD_UNCAT] = "uncat", \ |
| 122 | [FC_RCTL_DD_SOL_DATA] = "sol data", \ |
| 123 | [FC_RCTL_DD_UNSOL_CTL] = "unsol ctl", \ |
| 124 | [FC_RCTL_DD_SOL_CTL] = "sol ctl/reply", \ |
| 125 | [FC_RCTL_DD_UNSOL_DATA] = "unsol data", \ |
| 126 | [FC_RCTL_DD_DATA_DESC] = "data desc", \ |
| 127 | [FC_RCTL_DD_UNSOL_CMD] = "unsol cmd", \ |
| 128 | [FC_RCTL_DD_CMD_STATUS] = "cmd status", \ |
| 129 | [FC_RCTL_ELS_REQ] = "ELS req", \ |
| 130 | [FC_RCTL_ELS_REP] = "ELS rep", \ |
| 131 | [FC_RCTL_ELS4_REQ] = "FC-4 ELS req", \ |
| 132 | [FC_RCTL_ELS4_REP] = "FC-4 ELS rep", \ |
| 133 | [FC_RCTL_BA_NOP] = "BLS NOP", \ |
| 134 | [FC_RCTL_BA_ABTS] = "BLS abort", \ |
| 135 | [FC_RCTL_BA_RMC] = "BLS remove connection", \ |
| 136 | [FC_RCTL_BA_ACC] = "BLS accept", \ |
| 137 | [FC_RCTL_BA_RJT] = "BLS reject", \ |
| 138 | [FC_RCTL_BA_PRMT] = "BLS dedicated connection preempted", \ |
| 139 | [FC_RCTL_ACK_1] = "LC ACK_1", \ |
| 140 | [FC_RCTL_ACK_0] = "LC ACK_0", \ |
| 141 | [FC_RCTL_P_RJT] = "LC port reject", \ |
| 142 | [FC_RCTL_F_RJT] = "LC fabric reject", \ |
| 143 | [FC_RCTL_P_BSY] = "LC port busy", \ |
| 144 | [FC_RCTL_F_BSY] = "LC fabric busy to data frame", \ |
| 145 | [FC_RCTL_F_BSYL] = "LC fabric busy to link control frame",\ |
| 146 | [FC_RCTL_LCR] = "LC link credit reset", \ |
| 147 | [FC_RCTL_END] = "LC end", \ |
| 148 | } |
| 149 | |
| 150 | /* |
| 151 | * Well-known fabric addresses. |
| 152 | */ |
| 153 | enum fc_well_known_fid { |
Robert Love | a29e764 | 2009-04-21 16:27:41 -0700 | [diff] [blame] | 154 | FC_FID_NONE = 0x000000, /* No destination */ |
Robert Love | f032c2f | 2008-12-09 15:10:11 -0800 | [diff] [blame] | 155 | FC_FID_BCAST = 0xffffff, /* broadcast */ |
| 156 | FC_FID_FLOGI = 0xfffffe, /* fabric login */ |
| 157 | FC_FID_FCTRL = 0xfffffd, /* fabric controller */ |
| 158 | FC_FID_DIR_SERV = 0xfffffc, /* directory server */ |
| 159 | FC_FID_TIME_SERV = 0xfffffb, /* time server */ |
| 160 | FC_FID_MGMT_SERV = 0xfffffa, /* management server */ |
| 161 | FC_FID_QOS = 0xfffff9, /* QoS Facilitator */ |
| 162 | FC_FID_ALIASES = 0xfffff8, /* alias server (FC-PH2) */ |
| 163 | FC_FID_SEC_KEY = 0xfffff7, /* Security key dist. server */ |
| 164 | FC_FID_CLOCK = 0xfffff6, /* clock synch server */ |
| 165 | FC_FID_MCAST_SERV = 0xfffff5, /* multicast server */ |
| 166 | }; |
| 167 | |
| 168 | #define FC_FID_WELL_KNOWN_MAX 0xffffff /* highest well-known fabric ID */ |
| 169 | #define FC_FID_WELL_KNOWN_BASE 0xfffff5 /* start of well-known fabric ID */ |
| 170 | |
| 171 | /* |
| 172 | * Other well-known addresses, outside the above contiguous range. |
| 173 | */ |
| 174 | #define FC_FID_DOM_MGR 0xfffc00 /* domain manager base */ |
| 175 | |
| 176 | /* |
| 177 | * Fabric ID bytes. |
| 178 | */ |
| 179 | #define FC_FID_DOMAIN 0 |
| 180 | #define FC_FID_PORT 1 |
| 181 | #define FC_FID_LINK 2 |
| 182 | |
| 183 | /* |
| 184 | * fh_type codes |
| 185 | */ |
| 186 | enum fc_fh_type { |
| 187 | FC_TYPE_BLS = 0x00, /* basic link service */ |
| 188 | FC_TYPE_ELS = 0x01, /* extended link service */ |
| 189 | FC_TYPE_IP = 0x05, /* IP over FC, RFC 4338 */ |
| 190 | FC_TYPE_FCP = 0x08, /* SCSI FCP */ |
| 191 | FC_TYPE_CT = 0x20, /* Fibre Channel Services (FC-CT) */ |
| 192 | FC_TYPE_ILS = 0x22, /* internal link service */ |
| 193 | }; |
| 194 | |
| 195 | /* |
| 196 | * FC_TYPE names initializer. |
| 197 | * Please keep this matching the above definitions. |
| 198 | */ |
| 199 | #define FC_TYPE_NAMES_INIT { \ |
| 200 | [FC_TYPE_BLS] = "BLS", \ |
| 201 | [FC_TYPE_ELS] = "ELS", \ |
| 202 | [FC_TYPE_IP] = "IP", \ |
| 203 | [FC_TYPE_FCP] = "FCP", \ |
| 204 | [FC_TYPE_CT] = "CT", \ |
| 205 | [FC_TYPE_ILS] = "ILS", \ |
| 206 | } |
| 207 | |
| 208 | /* |
| 209 | * Exchange IDs. |
| 210 | */ |
| 211 | #define FC_XID_UNKNOWN 0xffff /* unknown exchange ID */ |
| 212 | #define FC_XID_MIN 0x0 /* supported min exchange ID */ |
| 213 | #define FC_XID_MAX 0xfffe /* supported max exchange ID */ |
| 214 | |
| 215 | /* |
| 216 | * fh_f_ctl - Frame control flags. |
| 217 | */ |
| 218 | #define FC_FC_EX_CTX (1 << 23) /* sent by responder to exchange */ |
| 219 | #define FC_FC_SEQ_CTX (1 << 22) /* sent by responder to sequence */ |
| 220 | #define FC_FC_FIRST_SEQ (1 << 21) /* first sequence of this exchange */ |
| 221 | #define FC_FC_LAST_SEQ (1 << 20) /* last sequence of this exchange */ |
| 222 | #define FC_FC_END_SEQ (1 << 19) /* last frame of sequence */ |
| 223 | #define FC_FC_END_CONN (1 << 18) /* end of class 1 connection pending */ |
| 224 | #define FC_FC_RES_B17 (1 << 17) /* reserved */ |
| 225 | #define FC_FC_SEQ_INIT (1 << 16) /* transfer of sequence initiative */ |
| 226 | #define FC_FC_X_ID_REASS (1 << 15) /* exchange ID has been changed */ |
| 227 | #define FC_FC_X_ID_INVAL (1 << 14) /* exchange ID invalidated */ |
| 228 | |
| 229 | #define FC_FC_ACK_1 (1 << 12) /* 13:12 = 1: ACK_1 expected */ |
| 230 | #define FC_FC_ACK_N (2 << 12) /* 13:12 = 2: ACK_N expected */ |
| 231 | #define FC_FC_ACK_0 (3 << 12) /* 13:12 = 3: ACK_0 expected */ |
| 232 | |
| 233 | #define FC_FC_RES_B11 (1 << 11) /* reserved */ |
| 234 | #define FC_FC_RES_B10 (1 << 10) /* reserved */ |
| 235 | #define FC_FC_RETX_SEQ (1 << 9) /* retransmitted sequence */ |
| 236 | #define FC_FC_UNI_TX (1 << 8) /* unidirectional transmit (class 1) */ |
| 237 | #define FC_FC_CONT_SEQ(i) ((i) << 6) |
| 238 | #define FC_FC_ABT_SEQ(i) ((i) << 4) |
| 239 | #define FC_FC_REL_OFF (1 << 3) /* parameter is relative offset */ |
| 240 | #define FC_FC_RES2 (1 << 2) /* reserved */ |
| 241 | #define FC_FC_FILL(i) ((i) & 3) /* 1:0: bytes of trailing fill */ |
| 242 | |
| 243 | /* |
| 244 | * BA_ACC payload. |
| 245 | */ |
| 246 | struct fc_ba_acc { |
| 247 | __u8 ba_seq_id_val; /* SEQ_ID validity */ |
| 248 | #define FC_BA_SEQ_ID_VAL 0x80 |
| 249 | __u8 ba_seq_id; /* SEQ_ID of seq last deliverable */ |
| 250 | __u8 ba_resvd[2]; /* reserved */ |
| 251 | __be16 ba_ox_id; /* OX_ID for aborted seq or exch */ |
| 252 | __be16 ba_rx_id; /* RX_ID for aborted seq or exch */ |
| 253 | __be16 ba_low_seq_cnt; /* low SEQ_CNT of aborted seq */ |
| 254 | __be16 ba_high_seq_cnt; /* high SEQ_CNT of aborted seq */ |
| 255 | }; |
| 256 | |
| 257 | /* |
| 258 | * BA_RJT: Basic Reject payload. |
| 259 | */ |
| 260 | struct fc_ba_rjt { |
| 261 | __u8 br_resvd; /* reserved */ |
| 262 | __u8 br_reason; /* reason code */ |
| 263 | __u8 br_explan; /* reason explanation */ |
| 264 | __u8 br_vendor; /* vendor unique code */ |
| 265 | }; |
| 266 | |
| 267 | /* |
| 268 | * BA_RJT reason codes. |
| 269 | * From FS-2. |
| 270 | */ |
| 271 | enum fc_ba_rjt_reason { |
| 272 | FC_BA_RJT_NONE = 0, /* in software this means no reject */ |
| 273 | FC_BA_RJT_INVL_CMD = 0x01, /* invalid command code */ |
| 274 | FC_BA_RJT_LOG_ERR = 0x03, /* logical error */ |
| 275 | FC_BA_RJT_LOG_BUSY = 0x05, /* logical busy */ |
| 276 | FC_BA_RJT_PROTO_ERR = 0x07, /* protocol error */ |
| 277 | FC_BA_RJT_UNABLE = 0x09, /* unable to perform request */ |
| 278 | FC_BA_RJT_VENDOR = 0xff, /* vendor-specific (see br_vendor) */ |
| 279 | }; |
| 280 | |
| 281 | /* |
| 282 | * BA_RJT reason code explanations. |
| 283 | */ |
| 284 | enum fc_ba_rjt_explan { |
| 285 | FC_BA_RJT_EXP_NONE = 0x00, /* no additional expanation */ |
| 286 | FC_BA_RJT_INV_XID = 0x03, /* invalid OX_ID-RX_ID combination */ |
| 287 | FC_BA_RJT_ABT = 0x05, /* sequence aborted, no seq info */ |
| 288 | }; |
| 289 | |
| 290 | /* |
| 291 | * P_RJT or F_RJT: Port Reject or Fabric Reject parameter field. |
| 292 | */ |
| 293 | struct fc_pf_rjt { |
| 294 | __u8 rj_action; /* reserved */ |
| 295 | __u8 rj_reason; /* reason code */ |
| 296 | __u8 rj_resvd; /* reserved */ |
| 297 | __u8 rj_vendor; /* vendor unique code */ |
| 298 | }; |
| 299 | |
| 300 | /* |
| 301 | * P_RJT and F_RJT reject reason codes. |
| 302 | */ |
| 303 | enum fc_pf_rjt_reason { |
| 304 | FC_RJT_NONE = 0, /* non-reject (reserved by standard) */ |
| 305 | FC_RJT_INVL_DID = 0x01, /* invalid destination ID */ |
| 306 | FC_RJT_INVL_SID = 0x02, /* invalid source ID */ |
| 307 | FC_RJT_P_UNAV_T = 0x03, /* port unavailable, temporary */ |
| 308 | FC_RJT_P_UNAV = 0x04, /* port unavailable, permanent */ |
| 309 | FC_RJT_CLS_UNSUP = 0x05, /* class not supported */ |
| 310 | FC_RJT_DEL_USAGE = 0x06, /* delimiter usage error */ |
| 311 | FC_RJT_TYPE_UNSUP = 0x07, /* type not supported */ |
| 312 | FC_RJT_LINK_CTL = 0x08, /* invalid link control */ |
| 313 | FC_RJT_R_CTL = 0x09, /* invalid R_CTL field */ |
| 314 | FC_RJT_F_CTL = 0x0a, /* invalid F_CTL field */ |
| 315 | FC_RJT_OX_ID = 0x0b, /* invalid originator exchange ID */ |
| 316 | FC_RJT_RX_ID = 0x0c, /* invalid responder exchange ID */ |
| 317 | FC_RJT_SEQ_ID = 0x0d, /* invalid sequence ID */ |
| 318 | FC_RJT_DF_CTL = 0x0e, /* invalid DF_CTL field */ |
| 319 | FC_RJT_SEQ_CNT = 0x0f, /* invalid SEQ_CNT field */ |
| 320 | FC_RJT_PARAM = 0x10, /* invalid parameter field */ |
| 321 | FC_RJT_EXCH_ERR = 0x11, /* exchange error */ |
| 322 | FC_RJT_PROTO = 0x12, /* protocol error */ |
| 323 | FC_RJT_LEN = 0x13, /* incorrect length */ |
| 324 | FC_RJT_UNEXP_ACK = 0x14, /* unexpected ACK */ |
| 325 | FC_RJT_FAB_CLASS = 0x15, /* class unsupported by fabric entity */ |
| 326 | FC_RJT_LOGI_REQ = 0x16, /* login required */ |
| 327 | FC_RJT_SEQ_XS = 0x17, /* excessive sequences attempted */ |
| 328 | FC_RJT_EXCH_EST = 0x18, /* unable to establish exchange */ |
| 329 | FC_RJT_FAB_UNAV = 0x1a, /* fabric unavailable */ |
| 330 | FC_RJT_VC_ID = 0x1b, /* invalid VC_ID (class 4) */ |
| 331 | FC_RJT_CS_CTL = 0x1c, /* invalid CS_CTL field */ |
| 332 | FC_RJT_INSUF_RES = 0x1d, /* insuff. resources for VC (Class 4) */ |
| 333 | FC_RJT_INVL_CLS = 0x1f, /* invalid class of service */ |
| 334 | FC_RJT_PREEMT_RJT = 0x20, /* preemption request rejected */ |
| 335 | FC_RJT_PREEMT_DIS = 0x21, /* preemption not enabled */ |
| 336 | FC_RJT_MCAST_ERR = 0x22, /* multicast error */ |
| 337 | FC_RJT_MCAST_ET = 0x23, /* multicast error terminate */ |
| 338 | FC_RJT_PRLI_REQ = 0x24, /* process login required */ |
| 339 | FC_RJT_INVL_ATT = 0x25, /* invalid attachment */ |
| 340 | FC_RJT_VENDOR = 0xff, /* vendor specific reject */ |
| 341 | }; |
| 342 | |
Chris Leech | 6755db1 | 2009-02-27 10:55:02 -0800 | [diff] [blame] | 343 | /* default timeout values */ |
| 344 | |
| 345 | #define FC_DEF_E_D_TOV 2000UL |
| 346 | #define FC_DEF_R_A_TOV 10000UL |
| 347 | |
Robert Love | f032c2f | 2008-12-09 15:10:11 -0800 | [diff] [blame] | 348 | #endif /* _FC_FS_H_ */ |