1331766Sken/*- 2331766Sken * Copyright (c) 2017 Broadcom. All rights reserved. 3331766Sken * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 4331766Sken * 5331766Sken * Redistribution and use in source and binary forms, with or without 6331766Sken * modification, are permitted provided that the following conditions are met: 7331766Sken * 8331766Sken * 1. Redistributions of source code must retain the above copyright notice, 9331766Sken * this list of conditions and the following disclaimer. 10331766Sken * 11331766Sken * 2. Redistributions in binary form must reproduce the above copyright notice, 12331766Sken * this list of conditions and the following disclaimer in the documentation 13331766Sken * and/or other materials provided with the distribution. 14331766Sken * 15331766Sken * 3. Neither the name of the copyright holder nor the names of its contributors 16331766Sken * may be used to endorse or promote products derived from this software 17331766Sken * without specific prior written permission. 18331766Sken * 19331766Sken * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20331766Sken * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21331766Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22331766Sken * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23331766Sken * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24331766Sken * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25331766Sken * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26331766Sken * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27331766Sken * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28331766Sken * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29331766Sken * POSSIBILITY OF SUCH DAMAGE. 30331766Sken * 31331766Sken * $FreeBSD: stable/11/sys/dev/ocs_fc/ocs_fcp.h 331766 2018-03-30 15:28:25Z ken $ 32331766Sken */ 33331766Sken 34331766Sken/** 35331766Sken * @file 36331766Sken * Define Fibre Channel types and structures. 37331766Sken */ 38331766Sken 39331766Sken#ifndef _OCS_FCP_H 40331766Sken#define _OCS_FCP_H 41331766Sken 42331766Sken#define FC_ELS_CMD_RJT 0x01 43331766Sken#define FC_ELS_CMD_ACC 0x02 44331766Sken#define FC_ELS_CMD_PLOGI 0x03 45331766Sken#define FC_ELS_CMD_FLOGI 0x04 46331766Sken#define FC_ELS_CMD_LOGO 0x05 47331766Sken#define FC_ELS_CMD_RRQ 0x12 48331766Sken#define FC_ELS_CMD_PRLI 0x20 49331766Sken#define FC_ELS_CMD_PRLO 0x21 50331766Sken#define FC_ELS_CMD_PDISC 0x50 51331766Sken#define FC_ELS_CMD_FDISC 0x51 52331766Sken#define FC_ELS_CMD_ADISC 0x52 53331766Sken#define FC_ELS_CMD_RSCN 0x61 54331766Sken#define FC_ELS_CMD_SCR 0x62 55331766Sken 56331766Sken#define FC_TYPE_BASIC_LINK 0 57331766Sken#define FC_TYPE_FCP 0x08 58331766Sken#define FC_TYPE_GS 0x20 59331766Sken#define FC_TYPE_SW 0x22 60331766Sken 61331766Sken#define FC_ADDR_FABRIC 0xfffffe /** well known fabric address */ 62331766Sken#define FC_ADDR_CONTROLLER 0xfffffd /** well known fabric controller address */ 63331766Sken#define FC_ADDR_IS_DOMAIN_CTRL(x) (((x) & 0xffff00) == 0xfffc00) /** is well known domain controller */ 64331766Sken#define FC_ADDR_GET_DOMAIN_CTRL(x) ((x) & 0x0000ff) /** get domain controller number */ 65331766Sken#define FC_ADDR_NAMESERVER 0xfffffc /** well known directory server address */ 66331766Sken 67331766Sken#define FC_GS_TYPE_ALIAS_SERVICE 0xf8 68331766Sken#define FC_GS_TYPE_MANAGEMENT_SERVICE 0xfa 69331766Sken#define FC_GS_TYPE_DIRECTORY_SERVICE 0xfc 70331766Sken 71331766Sken#define FC_GS_SUBTYPE_NAME_SERVER 0x02 72331766Sken 73331766Sken/** 74331766Sken * Generic Services FC Type Bit mask macros: 75331766Sken */ 76331766Sken#define FC_GS_TYPE_WORD(type) ((type) >> 5) 77331766Sken#define FC_GS_TYPE_BIT(type) ((type) & 0x1f) 78331766Sken 79331766Sken/** 80331766Sken * Generic Services Name Server Request Command codes: 81331766Sken */ 82331766Sken#define FC_GS_NAMESERVER_GPN_ID 0x0112 83331766Sken#define FC_GS_NAMESERVER_GNN_ID 0x0113 84331766Sken#define FC_GS_NAMESERVER_GFPN_ID 0x011c 85331766Sken#define FC_GS_NAMESERVER_GFF_ID 0x011f 86331766Sken#define FC_GS_NAMESERVER_GID_FT 0x0171 87331766Sken#define FC_GS_NAMESERVER_GID_PT 0x01a1 88331766Sken#define FC_GS_NAMESERVER_RHBA 0x0200 89331766Sken#define FC_GS_NAMESERVER_RPA 0x0211 90331766Sken#define FC_GS_NAMESERVER_RPN_ID 0x0212 91331766Sken#define FC_GS_NAMESERVER_RNN_ID 0x0213 92331766Sken#define FC_GS_NAMESERVER_RCS_ID 0x0214 93331766Sken#define FC_GS_NAMESERVER_RFT_ID 0x0217 94331766Sken#define FC_GS_NAMESERVER_RFF_ID 0x021f 95331766Sken#define FC_GS_NAMESERVER_RSNN_NN 0x0239 96331766Sken#define FC_GS_NAMESERVER_RSPN_ID 0x0218 97331766Sken 98331766Sken 99331766Sken#define FC_GS_REVISION 0x03 100331766Sken 101331766Sken#define FC_GS_IO_PARAMS { .fc_ct.r_ctl = 0x02, \ 102331766Sken .fc_ct.type = FC_TYPE_GS, \ 103331766Sken .fc_ct.df_ctl = 0x00 } 104331766Sken 105331766Skentypedef struct fc_vft_header_s { 106331766Sken uint32_t :1, 107331766Sken vf_id:12, 108331766Sken priority:3, 109331766Sken e:1, 110331766Sken :1, 111331766Sken type:4, 112331766Sken ver:2, 113331766Sken r_ctl:8; 114331766Sken uint32_t :24, 115331766Sken hopct:8; 116331766Sken} fc_vft_header_t; 117331766Sken 118331766Sken 119331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 120331766Skenstatic inline uint32_t fc_be24toh(uint32_t x) { return (ocs_be32toh(x) >> 8); } 121331766Sken#else 122331766Skenstatic inline uint32_t fc_be24toh(uint32_t x) { } 123331766Sken#endif 124331766Skenstatic inline uint32_t fc_htobe24(uint32_t x) { return fc_be24toh(x); } 125331766Sken 126331766Sken#define FC_SOFI3 0x2e 127331766Sken#define FC_SOFn3 0x36 128331766Sken#define FC_EOFN 0x41 129331766Sken#define FC_EOFT 0x42 130331766Sken 131331766Sken/** 132331766Sken * @brief FC header in big-endian order 133331766Sken */ 134331766Skentypedef struct fc_header_s { 135331766Sken uint32_t info:4, 136331766Sken r_ctl:4, 137331766Sken d_id:24; 138331766Sken uint32_t cs_ctl:8, 139331766Sken s_id:24; 140331766Sken uint32_t type:8, 141331766Sken f_ctl:24; 142331766Sken uint32_t seq_id:8, 143331766Sken df_ctl:8, 144331766Sken seq_cnt:16; 145331766Sken uint32_t ox_id:16, 146331766Sken rx_id:16; 147331766Sken uint32_t parameter; 148331766Sken} fc_header_t; 149331766Sken 150331766Sken 151331766Sken/** 152331766Sken * @brief FC header in little-endian order 153331766Sken */ 154331766Skentypedef struct fc_header_le_s { 155331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 156331766Sken uint32_t d_id:24, 157331766Sken info:4, 158331766Sken r_ctl:4; 159331766Sken uint32_t s_id:24, 160331766Sken cs_ctl:8; 161331766Sken uint32_t f_ctl:24, 162331766Sken type:8; 163331766Sken uint32_t seq_cnt:16, 164331766Sken df_ctl:8, 165331766Sken seq_id:8; 166331766Sken uint32_t rx_id:16, 167331766Sken ox_id:16; 168331766Sken uint32_t parameter; 169331766Sken#else 170331766Sken#error big endian version not defined 171331766Sken#endif 172331766Sken} fc_header_le_t; 173331766Sken 174331766Sken/** 175331766Sken * @brief FC VM header in big-endian order 176331766Sken */ 177331766Skentypedef struct fc_vm_header_s { 178331766Sken uint32_t dst_vmid; 179331766Sken uint32_t src_vmid; 180331766Sken uint32_t rsvd0; 181331766Sken uint32_t rsvd1; 182331766Sken} fc_vm_header_t; 183331766Sken 184331766Sken#define FC_DFCTL_DEVICE_HDR_16_MASK 0x1 185331766Sken#define FC_DFCTL_NETWORK_HDR_MASK 0x20 186331766Sken#define FC_DFCTL_ESP_HDR_MASK 0x40 187331766Sken#define FC_DFCTL_NETWORK_HDR_SIZE 16 188331766Sken#define FC_DFCTL_ESP_HDR_SIZE 0 //FIXME 189331766Sken 190331766Sken#define FC_RCTL_FC4_DATA 0 191331766Sken#define FC_RCTL_ELS 2 192331766Sken#define FC_RCTL_BLS 8 193331766Sken 194331766Sken#define FC_RCTL_INFO_UNCAT 0 195331766Sken#define FC_RCTL_INFO_SOL_DATA 1 196331766Sken#define FC_RCTL_INFO_UNSOL_CTRL 2 197331766Sken#define FC_RCTL_INFO_SOL_CTRL 3 198331766Sken#define FC_RCTL_INFO_UNSOL_DATA 4 199331766Sken#define FC_RCTL_INFO_DATA_DESC 5 200331766Sken#define FC_RCTL_INFO_UNSOL_CMD 6 201331766Sken#define FC_RCTL_INFO_CMD_STATUS 7 202331766Sken 203331766Sken#define FC_FCTL_EXCHANGE_RESPONDER 0x800000 204331766Sken#define FC_FCTL_SEQUENCE_CONTEXT 0x400000 205331766Sken#define FC_FCTL_FIRST_SEQUENCE 0x200000 206331766Sken#define FC_FCTL_LAST_SEQUENCE 0x100000 207331766Sken#define FC_FCTL_END_SEQUENCE 0x080000 208331766Sken#define FC_FCTL_END_CONNECTION 0x040000 209331766Sken#define FC_FCTL_PRIORITY_ENABLE 0x020000 210331766Sken#define FC_FCTL_SEQUENCE_INITIATIVE 0x010000 211331766Sken#define FC_FCTL_FILL_DATA_BYTES_MASK 0x000003 212331766Sken 213331766Sken/** 214331766Sken * Common BLS definitions: 215331766Sken */ 216331766Sken#define FC_INFO_NOP 0x0 217331766Sken#define FC_INFO_ABTS 0x1 218331766Sken#define FC_INFO_RMC 0x2 219331766Sken/* reserved 0x3 */ 220331766Sken#define FC_INFO_BA_ACC 0x4 221331766Sken#define FC_INFO_BA_RJT 0x5 222331766Sken#define FC_INFO_PRMT 0x6 223331766Sken 224331766Sken/* (FC-LS) LS_RJT Reason Codes */ 225331766Sken#define FC_REASON_INVALID_COMMAND_CODE 0x01 226331766Sken#define FC_REASON_LOGICAL_ERROR 0x03 227331766Sken#define FC_REASON_LOGICAL_BUSY 0x05 228331766Sken#define FC_REASON_PROTOCOL_ERROR 0x07 229331766Sken#define FC_REASON_UNABLE_TO_PERFORM 0x09 230331766Sken#define FC_REASON_COMMAND_NOT_SUPPORTED 0x0b 231331766Sken#define FC_REASON_COMMAND_IN_PROGRESS 0x0e 232331766Sken#define FC_REASON_VENDOR_SPECIFIC 0xff 233331766Sken 234331766Sken/* (FC-LS) LS_RJT Reason Codes Explanations */ 235331766Sken#define FC_EXPL_NO_ADDITIONAL 0x00 236331766Sken#define FC_EXPL_SPARAM_OPTIONS 0x01 237331766Sken#define FC_EXPL_SPARAM_INITIATOR 0x03 238331766Sken#define FC_EXPL_SPARAM_RECPIENT 0x05 239331766Sken#define FC_EXPL_SPARM_DATA_SIZE 0x07 240331766Sken#define FC_EXPL_SPARM_CONCURRENT 0x09 241331766Sken#define FC_EXPL_SPARM_CREDIT 0x0b 242331766Sken#define FC_EXPL_INV_PORT_NAME 0x0d 243331766Sken#define FC_EXPL_INV_NODE_NAME 0x0e 244331766Sken#define FC_EXPL_INV_COMMON_SPARAMS 0x0f 245331766Sken#define FC_EXPL_INV_ASSOC_HEADER 0x11 246331766Sken#define FC_EXPL_ASSOC_HDR_REQUIRED 0x13 247331766Sken#define FC_EXPL_INV_ORIGINATOR_S_ID 0x15 248331766Sken#define FC_EXPL_INV_X_ID_COMBINATION 0x17 249331766Sken#define FC_EXPL_COMMAND_IN_PROGRESS 0x19 250331766Sken#define FC_EXPL_NPORT_LOGIN_REQUIRED 0x1e 251331766Sken#define FC_EXPL_N_PORT_ID 0x1f 252331766Sken#define FC_EXPL_INSUFFICIENT_RESOURCES 0x29 253331766Sken#define FC_EXPL_UNABLE_TO_SUPPLY_DATA 0x2a 254331766Sken#define FC_EXPL_REQUEST_NOT_SUPPORTED 0x2c 255331766Sken#define FC_EXPL_INV_PAYLOAD_LEN 0x1d 256331766Sken#define FC_EXPL_INV_PORT_NODE_NAME 0x44 257331766Sken#define FC_EXPL_LOGIN_EXT_NOT_SUPPORTED 0x46 258331766Sken#define FC_EXPL_AUTH_REQUIRED 0x48 259331766Sken#define FC_EXPL_SCAN_VALUE_NOT_ALLOWED 0x50 260331766Sken#define FC_EXPL_SCAN_VALUE_NOT_SUPPORTED 0x51 261331766Sken#define FC_EXPL_NO_RESOURCES_ASSIGNED 0x52 262331766Sken#define FC_EXPL_MAC_ADDR_MODE_NOT_SUPPORTED 0x60 263331766Sken#define FC_EXPL_MAC_ADDR_INCORRECTLY_FORMED 0x61 264331766Sken#define FC_EXPL_VN2VN_PORT_NOT_IN_NEIGHBOR_SET 0x62 265331766Sken 266331766Sken#define FC_EXPL_INV_X_ID 0x03 /* invalid OX_ID - RX_ID combination */ 267331766Sken#define FC_EXPL_SEQUENCE_ABORTED 0x05 268331766Sken 269331766Skentypedef struct fc_ba_acc_payload_s { 270331766Sken#define FC_SEQ_ID_VALID 0x80 271331766Sken#define FC_SEQ_ID_INVALID 0x00 272331766Sken uint32_t seq_id_validity:8, 273331766Sken seq_id:8, 274331766Sken :16; 275331766Sken uint32_t ox_id:16, 276331766Sken rx_id:16; 277331766Sken uint32_t low_seq_cnt:16, 278331766Sken high_seq_cnt:16; 279331766Sken} fc_ba_acc_payload_t; 280331766Sken 281331766Skentypedef struct fc_ba_rjt_payload_s { 282331766Sken uint32_t vendor_unique:8, 283331766Sken reason_explanation:8, 284331766Sken reason_code:8, 285331766Sken :8; 286331766Sken} fc_ba_rjt_payload_t; 287331766Sken 288331766Skentypedef struct fc_els_gen_s { 289331766Sken uint32_t command_code: 8, 290331766Sken resv1: 24; 291331766Sken} fc_els_gen_t; 292331766Sken 293331766Skentypedef struct fc_plogi_playload_s { 294331766Sken uint32_t command_code: 8, 295331766Sken resv1: 24; 296331766Sken uint32_t common_service_parameters[4]; 297331766Sken uint32_t port_name_hi; 298331766Sken uint32_t port_name_lo; 299331766Sken uint32_t node_name_hi; 300331766Sken uint32_t node_name_lo; 301331766Sken uint32_t class1_service_parameters[4]; 302331766Sken uint32_t class2_service_parameters[4]; 303331766Sken uint32_t class3_service_parameters[4]; 304331766Sken uint32_t class4_service_parameters[4]; 305331766Sken uint32_t vendor_version_level[4]; 306331766Sken} fc_plogi_payload_t; 307331766Sken 308331766Skentypedef fc_plogi_payload_t fc_sparms_t; 309331766Sken 310331766Skentypedef struct fc_logo_payload_s { 311331766Sken uint32_t command_code: 8, 312331766Sken resv1:24; 313331766Sken uint32_t :8, 314331766Sken port_id:24; 315331766Sken uint32_t port_name_hi; 316331766Sken uint32_t port_name_lo; 317331766Sken} fc_logo_payload_t; 318331766Sken 319331766Skentypedef struct fc_acc_payload_s { 320331766Sken uint32_t command_code: 8, 321331766Sken resv1:24; 322331766Sken} fc_acc_payload_t; 323331766Sken 324331766Sken 325331766Skentypedef struct fc_ls_rjt_payload_s { 326331766Sken uint32_t command_code:8, 327331766Sken resv1:24; 328331766Sken uint32_t resv2:8, 329331766Sken reason_code:8, 330331766Sken reason_code_exp:8, 331331766Sken vendor_unique:8; 332331766Sken} fc_ls_rjt_payload_t; 333331766Sken 334331766Skentypedef struct fc_prli_payload_s { 335331766Sken uint32_t command_code:8, 336331766Sken page_length:8, 337331766Sken payload_length:16; 338331766Sken uint32_t type:8, 339331766Sken type_ext:8, 340331766Sken flags:16; 341331766Sken uint32_t originator_pa; 342331766Sken uint32_t responder_pa; 343331766Sken uint32_t :16, 344331766Sken service_params:16; 345331766Sken} fc_prli_payload_t; 346331766Sken 347331766Skentypedef struct fc_prlo_payload_s { 348331766Sken uint32_t command_code:8, 349331766Sken page_length:8, 350331766Sken payload_length:16; 351331766Sken uint32_t type:8, 352331766Sken type_ext:8, 353331766Sken :16; 354331766Sken uint32_t :32; 355331766Sken uint32_t :32; 356331766Sken uint32_t :32; 357331766Sken} fc_prlo_payload_t; 358331766Sken 359331766Skentypedef struct fc_prlo_acc_payload_s { 360331766Sken uint32_t command_code:8, 361331766Sken page_length:8, 362331766Sken payload_length:16; 363331766Sken uint32_t type:8, 364331766Sken type_ext:8, 365331766Sken :4, 366331766Sken response_code:4, 367331766Sken :8; 368331766Sken uint32_t :32; 369331766Sken uint32_t :32; 370331766Sken uint32_t :32; 371331766Sken} fc_prlo_acc_payload_t; 372331766Sken 373331766Skentypedef struct fc_adisc_payload_s { 374331766Sken uint32_t command_code:8, 375331766Sken payload_length:24; 376331766Sken uint32_t :8, 377331766Sken hard_address:24; 378331766Sken uint32_t port_name_hi; 379331766Sken uint32_t port_name_lo; 380331766Sken uint32_t node_name_hi; 381331766Sken uint32_t node_name_lo; 382331766Sken uint32_t :8, 383331766Sken port_id:24; 384331766Sken} fc_adisc_payload_t; 385331766Sken 386331766Sken/* PRLI flags */ 387331766Sken#define FC_PRLI_ORIGINATOR_PA_VALID 0x8000 388331766Sken#define FC_PRLI_RESPONDER_PA_VALID 0x4000 389331766Sken#define FC_PRLI_ESTABLISH_IMAGE_PAIR 0x2000 390331766Sken#define FC_PRLI_SERVICE_PARAM_INVALID 0x0800 391331766Sken#define FC_PRLI_REQUEST_EXECUTED 0x0100 392331766Sken 393331766Sken/* PRLI Service Parameters */ 394331766Sken#define FC_PRLI_REC_SUPPORT 0x0400 395331766Sken#define FC_PRLI_TASK_RETRY_ID_REQ 0x0200 396331766Sken#define FC_PRLI_RETRY 0x0100 397331766Sken#define FC_PRLI_CONFIRMED_COMPLETION 0x0080 398331766Sken#define FC_PRLI_DATA_OVERLAY 0x0040 399331766Sken#define FC_PRLI_INITIATOR_FUNCTION 0x0020 400331766Sken#define FC_PRLI_TARGET_FUNCTION 0x0010 401331766Sken#define FC_PRLI_READ_XRDY_DISABLED 0x0002 402331766Sken#define FC_PRLI_WRITE_XRDY_DISABLED 0x0001 403331766Sken 404331766Sken/* PRLO Logout flags */ 405331766Sken#define FC_PRLO_REQUEST_EXECUTED 0x0001 406331766Sken 407331766Skentypedef struct fc_scr_payload_s { 408331766Sken uint32_t command_code:8, 409331766Sken :24; 410331766Sken uint32_t :24, 411331766Sken function:8; 412331766Sken} fc_scr_payload_t; 413331766Sken 414331766Sken#define FC_SCR_REG_FABRIC 1 415331766Sken#define FC_SCR_REG_NPORT 2 416331766Sken#define FC_SCR_REG_FULL 3 417331766Sken 418331766Skentypedef struct { 419331766Sken uint32_t :2, 420331766Sken rscn_event_qualifier:4, 421331766Sken address_format:2, 422331766Sken port_id:24; 423331766Sken} fc_rscn_affected_port_id_page_t; 424331766Sken 425331766Skentypedef struct fc_rscn_payload_s { 426331766Sken uint32_t command_code:8, 427331766Sken page_length:8, 428331766Sken payload_length:16; 429331766Sken fc_rscn_affected_port_id_page_t port_list[1]; 430331766Sken} fc_rscn_payload_t; 431331766Sken 432331766Skentypedef struct fcct_iu_header_s { 433331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 434331766Sken uint32_t revision:8, 435331766Sken in_id:24; 436331766Sken uint32_t gs_type:8, 437331766Sken gs_subtype:8, 438331766Sken options:8, 439331766Sken resv1:8; 440331766Sken uint32_t cmd_rsp_code:16, 441331766Sken max_residual_size:16; 442331766Sken uint32_t fragment_id:8, 443331766Sken reason_code:8, 444331766Sken reason_code_explanation:8, 445331766Sken vendor_specific:8; 446331766Sken#else 447331766Sken#error big endian version not defined 448331766Sken#endif 449331766Sken} fcct_iu_header_t; 450331766Sken 451331766Sken#define FCCT_REJECT_INVALID_COMMAND_CODE 1 452331766Sken#define FCCT_REJECT_INVALID_VERSION_LEVEL 2 453331766Sken#define FCCT_LOGICAL_ERROR 3 454331766Sken#define FCCT_INVALID_CT_IU_SIZE 4 455331766Sken#define FCCT_LOGICAL_BUSY 5 456331766Sken#define FCCT_PROTOCOL_ERROR 7 457331766Sken#define FCCT_UNABLE_TO_PERFORM 9 458331766Sken#define FCCT_COMMAND_NOT_SUPPORTED 0x0b 459331766Sken#define FCCT_FABRIC_PORT_NAME_NOT_REGISTERED 0x0c 460331766Sken#define FCCT_SERVER_NOT_AVAILABLE 0x0d 461331766Sken#define FCCT_SESSION_COULD_NOT_BE_ESTABLISHED 0x0e 462331766Sken#define FCCT_VENDOR_SPECIFIC_ERROR 0xff 463331766Sken 464331766Sken#define FCCT_NO_ADDITIONAL_EXPLANATION 0 465331766Sken#define FCCT_AUTHORIZATION_EXCEPTION 0xf0 466331766Sken#define FCCT_AUTHENTICATION_EXCEPTION 0xf1 467331766Sken#define FCCT_DATA_BASE_FULL 0xf2 468331766Sken#define FCCT_DATA_BASE_EMPTY 0xf3 469331766Sken#define FCCT_PROCESSING_REQUEST 0xf4 470331766Sken#define FCCT_UNABLE_TO_VERIFY_CONNECTION 0xf5 471331766Sken#define FCCT_DEVICES_NOT_IN_COMMON_ZONE 0xf6 472331766Sken 473331766Skentypedef struct { 474331766Sken fcct_iu_header_t hdr; 475331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 476331766Sken uint32_t port_id; 477331766Sken uint32_t fc4_types; 478331766Sken#else 479331766Sken#error big endian version not defined 480331766Sken#endif 481331766Sken} fcgs_rft_id_t; 482331766Sken 483331766Skentypedef struct { 484331766Sken fcct_iu_header_t hdr; 485331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 486331766Sken uint32_t port_id; 487331766Sken uint32_t :16, 488331766Sken fc4_features:8, 489331766Sken type_code:8; 490331766Sken#else 491331766Sken#error big endian version not defined 492331766Sken#endif 493331766Sken} fcgs_rff_id_t; 494331766Sken 495331766Sken#pragma pack(1) 496331766Skentypedef struct { 497331766Sken fcct_iu_header_t hdr; 498331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 499331766Sken uint32_t port_id; 500331766Sken uint64_t port_name; 501331766Sken#else 502331766Sken#error big endian version not defined 503331766Sken#endif 504331766Sken} fcgs_rpn_id_t; 505331766Sken#pragma pack() 506331766Sken 507331766Sken#pragma pack(1) 508331766Skentypedef struct { 509331766Sken fcct_iu_header_t hdr; 510331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 511331766Sken uint32_t port_id; 512331766Sken uint64_t node_name; 513331766Sken#else 514331766Sken#error big endian version not defined 515331766Sken#endif 516331766Sken} fcgs_rnn_id_t; 517331766Sken#pragma pack() 518331766Sken 519331766Sken#define FCCT_CLASS_OF_SERVICE_F 0x1 520331766Sken#define FCCT_CLASS_OF_SERVICE_2 0x4 521331766Sken#define FCCT_CLASS_OF_SERVICE_3 0x8 522331766Sken#pragma pack(1) 523331766Skentypedef struct { 524331766Sken fcct_iu_header_t hdr; 525331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 526331766Sken uint32_t port_id; 527331766Sken uint32_t class_of_srvc; 528331766Sken#else 529331766Sken#error big endian version not defined 530331766Sken#endif 531331766Sken} fcgs_rcs_id_t; 532331766Sken#pragma pack() 533331766Sken 534331766Sken#pragma pack(1) 535331766Skentypedef struct { 536331766Sken fcct_iu_header_t hdr; 537331766Sken#if BYTE_ORDER == LITTLE_ENDIAN 538331766Sken uint64_t node_name; 539331766Sken uint8_t name_len; 540331766Sken char sym_node_name[1]; 541331766Sken/*TODO: need name length and symbolic name */ 542331766Sken#else 543331766Sken#error big endian version not defined 544331766Sken#endif 545331766Sken} fcgs_rsnn_nn_t; 546331766Sken#pragma pack() 547331766Sken 548331766Sken#define FCCT_HDR_CMDRSP_ACCEPT 0x8002 549331766Sken#define FCCT_HDR_CMDRSP_REJECT 0x8001 550331766Sken 551331766Skenstatic inline void fcct_build_req_header(fcct_iu_header_t *hdr, uint16_t cmd, uint16_t max_size) 552331766Sken{ 553331766Sken /* use old rev (1) to accommodate older switches */ 554331766Sken hdr->revision = 1; 555331766Sken hdr->in_id = 0; 556331766Sken hdr->gs_type = FC_GS_TYPE_DIRECTORY_SERVICE; 557331766Sken hdr->gs_subtype = FC_GS_SUBTYPE_NAME_SERVER; 558331766Sken hdr->options = 0; 559331766Sken hdr->resv1 = 0; 560331766Sken hdr->cmd_rsp_code = ocs_htobe16(cmd); 561331766Sken hdr->max_residual_size = ocs_htobe16(max_size/(sizeof(uint32_t))); /* words */ 562331766Sken hdr->fragment_id = 0; 563331766Sken hdr->reason_code = 0; 564331766Sken hdr->reason_code_explanation = 0; 565331766Sken hdr->vendor_specific = 0; 566331766Sken} 567331766Sken 568331766Skentypedef struct fcct_rftid_req_s { 569331766Sken fcct_iu_header_t hdr; 570331766Sken uint32_t port_id; 571331766Sken uint32_t fc4_types[8]; 572331766Sken} fcct_rftid_req_t; 573331766Sken 574331766Sken#define FC4_FEATURE_TARGET (1U << 0) 575331766Sken#define FC4_FEATURE_INITIATOR (1U << 1) 576331766Sken 577331766Skentypedef struct fcct_rffid_req_s { 578331766Sken fcct_iu_header_t hdr; 579331766Sken uint32_t port_id; 580331766Sken uint32_t :16, 581331766Sken fc4_feature_bits:8, 582331766Sken type:8; 583331766Sken} fcct_rffid_req_t; 584331766Sken 585331766Skentypedef struct fcct_gnnid_req_s { 586331766Sken fcct_iu_header_t hdr; 587331766Sken uint32_t :8, 588331766Sken port_id:24; 589331766Sken} fcct_gnnid_req_t; 590331766Sken 591331766Skentypedef struct fcct_gpnid_req_s { 592331766Sken fcct_iu_header_t hdr; 593331766Sken uint32_t :8, 594331766Sken port_id:24; 595331766Sken} fcct_gpnid_req_t; 596331766Sken 597331766Skentypedef struct fcct_gffid_req_s { 598331766Sken fcct_iu_header_t hdr; 599331766Sken uint32_t :8, 600331766Sken port_id:24; 601331766Sken} fcct_gffid_req_t; 602331766Sken 603331766Skentypedef struct fcct_gidft_req_s { 604331766Sken fcct_iu_header_t hdr; 605331766Sken uint32_t :8, 606331766Sken domain_id_scope:8, 607331766Sken area_id_scope:8, 608331766Sken type:8; 609331766Sken} fcct_gidft_req_t; 610331766Sken 611331766Skentypedef struct fcct_gidpt_req_s { 612331766Sken fcct_iu_header_t hdr; 613331766Sken uint32_t port_type:8, 614331766Sken domain_id_scope:8, 615331766Sken area_id_scope:8, 616331766Sken flags:8; 617331766Sken} fcct_gidpt_req_t; 618331766Sken 619331766Skentypedef struct fcct_gnnid_acc_s { 620331766Sken fcct_iu_header_t hdr; 621331766Sken uint64_t node_name; 622331766Sken} fcct_gnnid_acc_t; 623331766Sken 624331766Skentypedef struct fcct_gpnid_acc_s { 625331766Sken fcct_iu_header_t hdr; 626331766Sken uint64_t port_name; 627331766Sken} fcct_gpnid_acc_t; 628331766Sken 629331766Skentypedef struct fcct_gffid_acc_s { 630331766Sken fcct_iu_header_t hdr; 631331766Sken uint8_t fc4_feature_bits; 632331766Sken} fcct_gffid_acc_t; 633331766Sken 634331766Skentypedef struct fcct_gidft_acc_s { 635331766Sken fcct_iu_header_t hdr; 636331766Sken struct { 637331766Sken uint32_t ctl:8, 638331766Sken port_id:24; 639331766Sken } port_list[1]; 640331766Sken} fcct_gidft_acc_t; 641331766Sken 642331766Skentypedef struct fcct_gidpt_acc_s { 643331766Sken fcct_iu_header_t hdr; 644331766Sken struct { 645331766Sken uint32_t ctl:8, 646331766Sken port_id:24; 647331766Sken } port_list[1]; 648331766Sken} fcct_gidpt_acc_t; 649331766Sken 650331766Sken#define FCCT_GID_PT_LAST_ID 0x80 651331766Sken#define FCCT_GIDPT_ID_MASK 0x00ffffff 652331766Sken 653331766Skentypedef struct fcp_cmnd_iu_s { 654331766Sken uint8_t fcp_lun[8]; 655331766Sken uint8_t command_reference_number; 656331766Sken uint8_t task_attribute:3, 657331766Sken command_priority:4, 658331766Sken :1; 659331766Sken uint8_t task_management_flags; 660331766Sken uint8_t wrdata:1, 661331766Sken rddata:1, 662331766Sken additional_fcp_cdb_length:6; 663331766Sken uint8_t fcp_cdb[16]; 664331766Sken uint8_t fcp_cdb_and_dl[20]; /* < May contain up to 16 bytes of CDB, followed by fcp_dl */ 665331766Sken} fcp_cmnd_iu_t; 666331766Sken 667331766Sken#define FCP_LUN_ADDRESS_METHOD_SHIFT 6 668331766Sken#define FCP_LUN_ADDRESS_METHOD_MASK 0xc0 669331766Sken#define FCP_LUN_ADDR_METHOD_PERIPHERAL 0x0 670331766Sken#define FCP_LUN_ADDR_METHOD_FLAT 0x1 671331766Sken#define FCP_LUN_ADDR_METHOD_LOGICAL 0x2 672331766Sken#define FCP_LUN_ADDR_METHOD_EXTENDED 0x3 673331766Sken 674331766Sken#define FCP_LUN_ADDR_SIMPLE_MAX 0xff 675331766Sken#define FCP_LUN_ADDR_FLAT_MAX 0x3fff 676331766Sken 677331766Sken#define FCP_TASK_ATTR_SIMPLE 0x0 678331766Sken#define FCP_TASK_ATTR_HEAD_OF_QUEUE 0x1 679331766Sken#define FCP_TASK_ATTR_ORDERED 0x2 680331766Sken#define FCP_TASK_ATTR_ACA 0x4 681331766Sken#define FCP_TASK_ATTR_UNTAGGED 0x5 682331766Sken 683331766Sken#define FCP_QUERY_TASK_SET BIT(0) 684331766Sken#define FCP_ABORT_TASK_SET BIT(1) 685331766Sken#define FCP_CLEAR_TASK_SET BIT(2) 686331766Sken#define FCP_QUERY_ASYNCHRONOUS_EVENT BIT(3) 687331766Sken#define FCP_LOGICAL_UNIT_RESET BIT(4) 688331766Sken#define FCP_TARGET_RESET BIT(5) 689331766Sken#define FCP_CLEAR_ACA BIT(6) 690331766Sken 691331766Sken/* SPC-4 says that the maximum length of sense data is 252 bytes */ 692331766Sken#define FCP_MAX_SENSE_LEN 252 693331766Sken#define FCP_MAX_RSP_LEN 8 694331766Sken/* 695331766Sken * FCP_RSP buffer will either have sense or response data, but not both 696331766Sken * so pick the larger. 697331766Sken */ 698331766Sken#define FCP_MAX_RSP_INFO_LEN FCP_MAX_SENSE_LEN 699331766Sken 700331766Skentypedef struct fcp_rsp_iu_s { 701331766Sken uint8_t rsvd[8]; 702331766Sken uint8_t status_qualifier[2]; 703331766Sken uint8_t flags; 704331766Sken uint8_t scsi_status; 705331766Sken uint8_t fcp_resid[4]; 706331766Sken uint8_t fcp_sns_len[4]; 707331766Sken uint8_t fcp_rsp_len[4]; 708331766Sken uint8_t data[FCP_MAX_RSP_INFO_LEN]; 709331766Sken} fcp_rsp_iu_t; 710331766Sken 711331766Sken/** Flag field defines: */ 712331766Sken#define FCP_RSP_LEN_VALID BIT(0) 713331766Sken#define FCP_SNS_LEN_VALID BIT(1) 714331766Sken#define FCP_RESID_OVER BIT(2) 715331766Sken#define FCP_RESID_UNDER BIT(3) 716331766Sken#define FCP_CONF_REQ BIT(4) 717331766Sken#define FCP_BIDI_READ_RESID_OVER BIT(5) 718331766Sken#define FCP_BIDI_READ_RESID_UNDER BIT(6) 719331766Sken#define FCP_BIDI_RSP BIT(7) 720331766Sken 721331766Sken/** Status values: */ 722331766Sken#define FCP_TMF_COMPLETE 0x00 723331766Sken#define FCP_DATA_LENGTH_MISMATCH 0x01 724331766Sken#define FCP_INVALID_FIELD 0x02 725331766Sken#define FCP_DATA_RO_MISMATCH 0x03 726331766Sken#define FCP_TMF_REJECTED 0x04 727331766Sken#define FCP_TMF_FAILED 0x05 728331766Sken#define FCP_TMF_SUCCEEDED 0x08 729331766Sken#define FCP_TMF_INCORRECT_LUN 0x09 730331766Sken 731331766Sken/** FCP-4 Table 28, TMF response information: */ 732331766Skentypedef struct fc_rsp_info_s { 733331766Sken uint8_t addl_rsp_info[3]; 734331766Sken uint8_t rsp_code; 735331766Sken uint32_t :32; 736331766Sken} fcp_rsp_info_t; 737331766Sken 738331766Skentypedef struct fcp_xfer_rdy_iu_s { 739331766Sken uint8_t fcp_data_ro[4]; 740331766Sken uint8_t fcp_burst_len[4]; 741331766Sken uint8_t rsvd[4]; 742331766Sken} fcp_xfer_rdy_iu_t; 743331766Sken 744331766Sken#define MAX_ACC_REJECT_PAYLOAD (sizeof(fc_ls_rjt_payload_t) > sizeof(fc_acc_payload_t) ? sizeof(fc_ls_rjt_payload_t) : sizeof(fc_acc_payload_t)) 745331766Sken 746331766Sken 747331766Sken#endif /* !_OCS_FCP_H */ 748