linux/drivers/scsi/bfa/bfa_fc.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
   3 * All rights reserved
   4 * www.brocade.com
   5 *
   6 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
   7 *
   8 * This program is free software; you can redistribute it and/or modify it
   9 * under the terms of the GNU General Public License (GPL) Version 2 as
  10 * published by the Free Software Foundation
  11 *
  12 * This program is distributed in the hope that it will be useful, but
  13 * WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * General Public License for more details.
  16 */
  17
  18#ifndef __BFA_FC_H__
  19#define __BFA_FC_H__
  20
  21#include "bfad_drv.h"
  22
  23typedef u64 wwn_t;
  24
  25#define WWN_NULL        (0)
  26#define FC_SYMNAME_MAX  256     /*  max name server symbolic name size */
  27#define FC_ALPA_MAX     128
  28
  29#pragma pack(1)
  30
  31#define MAC_ADDRLEN     (6)
  32struct mac_s { u8 mac[MAC_ADDRLEN]; };
  33#define mac_t struct mac_s
  34
  35/*
  36 * generic SCSI cdb definition
  37 */
  38#define SCSI_MAX_CDBLEN     16
  39struct scsi_cdb_s {
  40        u8         scsi_cdb[SCSI_MAX_CDBLEN];
  41};
  42
  43/* ------------------------------------------------------------
  44 * SCSI status byte values
  45 * ------------------------------------------------------------
  46 */
  47#define SCSI_STATUS_GOOD                   0x00
  48#define SCSI_STATUS_CHECK_CONDITION        0x02
  49#define SCSI_STATUS_CONDITION_MET          0x04
  50#define SCSI_STATUS_BUSY                   0x08
  51#define SCSI_STATUS_INTERMEDIATE           0x10
  52#define SCSI_STATUS_ICM                    0x14 /* intermediate condition met */
  53#define SCSI_STATUS_RESERVATION_CONFLICT   0x18
  54#define SCSI_STATUS_COMMAND_TERMINATED     0x22
  55#define SCSI_STATUS_QUEUE_FULL             0x28
  56#define SCSI_STATUS_ACA_ACTIVE             0x30
  57
  58#define SCSI_MAX_ALLOC_LEN      0xFF    /* maximum allocarion length */
  59
  60/*
  61 * Fibre Channel Header Structure (FCHS) definition
  62 */
  63struct fchs_s {
  64#ifdef __BIG_ENDIAN
  65        u32        routing:4;   /* routing bits */
  66        u32        cat_info:4;  /* category info */
  67#else
  68        u32        cat_info:4;  /* category info */
  69        u32        routing:4;   /* routing bits */
  70#endif
  71        u32        d_id:24;     /* destination identifier */
  72
  73        u32        cs_ctl:8;    /* class specific control */
  74        u32        s_id:24;     /* source identifier */
  75
  76        u32        type:8;      /* data structure type */
  77        u32        f_ctl:24;    /* initial frame control */
  78
  79        u8         seq_id;      /* sequence identifier */
  80        u8         df_ctl;      /* data field control */
  81        u16        seq_cnt;     /* sequence count */
  82
  83        __be16     ox_id;       /* originator exchange ID */
  84        u16        rx_id;       /* responder exchange ID */
  85
  86        u32        ro;          /* relative offset */
  87};
  88
  89/*
  90 * routing bit definitions
  91 */
  92enum {
  93        FC_RTG_FC4_DEV_DATA     = 0x0,  /* FC-4 Device Data */
  94        FC_RTG_EXT_LINK         = 0x2,  /* Extended Link Data */
  95        FC_RTG_FC4_LINK_DATA    = 0x3,  /* FC-4 Link Data */
  96        FC_RTG_VIDEO_DATA       = 0x4,  /* Video Data */
  97        FC_RTG_EXT_HDR          = 0x5,  /* VFT, IFR or Encapsuled */
  98        FC_RTG_BASIC_LINK       = 0x8,  /* Basic Link data */
  99        FC_RTG_LINK_CTRL        = 0xC,  /* Link Control */
 100};
 101
 102/*
 103 * information category for extended link data and FC-4 Link Data
 104 */
 105enum {
 106        FC_CAT_LD_REQUEST       = 0x2,  /* Request */
 107        FC_CAT_LD_REPLY         = 0x3,  /* Reply */
 108        FC_CAT_LD_DIAG          = 0xF,  /* for DIAG use only */
 109};
 110
 111/*
 112 * information category for extended headers (VFT, IFR or encapsulation)
 113 */
 114enum {
 115        FC_CAT_VFT_HDR = 0x0,   /* Virtual fabric tagging header */
 116        FC_CAT_IFR_HDR = 0x1,   /* Inter-Fabric routing header */
 117        FC_CAT_ENC_HDR = 0x2,   /* Encapsulation header */
 118};
 119
 120/*
 121 * information category for FC-4 device data
 122 */
 123enum {
 124        FC_CAT_UNCATEG_INFO     = 0x0,  /* Uncategorized information */
 125        FC_CAT_SOLICIT_DATA     = 0x1,  /* Solicited Data */
 126        FC_CAT_UNSOLICIT_CTRL   = 0x2,  /* Unsolicited Control */
 127        FC_CAT_SOLICIT_CTRL     = 0x3,  /* Solicited Control */
 128        FC_CAT_UNSOLICIT_DATA   = 0x4,  /* Unsolicited Data */
 129        FC_CAT_DATA_DESC        = 0x5,  /* Data Descriptor */
 130        FC_CAT_UNSOLICIT_CMD    = 0x6,  /* Unsolicited Command */
 131        FC_CAT_CMD_STATUS       = 0x7,  /* Command Status */
 132};
 133
 134/*
 135 * Type Field Definitions. FC-PH Section 18.5 pg. 165
 136 */
 137enum {
 138        FC_TYPE_BLS             = 0x0,  /* Basic Link Service */
 139        FC_TYPE_ELS             = 0x1,  /* Extended Link Service */
 140        FC_TYPE_IP              = 0x5,  /* IP */
 141        FC_TYPE_FCP             = 0x8,  /* SCSI-FCP */
 142        FC_TYPE_GPP             = 0x9,  /* SCSI_GPP */
 143        FC_TYPE_SERVICES        = 0x20, /* Fibre Channel Services */
 144        FC_TYPE_FC_FSS          = 0x22, /* Fabric Switch Services */
 145        FC_TYPE_FC_AL           = 0x23, /* FC-AL */
 146        FC_TYPE_FC_SNMP         = 0x24, /* FC-SNMP */
 147        FC_TYPE_FC_SPINFAB      = 0xEE, /* SPINFAB */
 148        FC_TYPE_FC_DIAG         = 0xEF, /* DIAG */
 149        FC_TYPE_MAX             = 256,  /* 256 FC-4 types */
 150};
 151
 152/*
 153 * Frame Control Definitions. FC-PH Table-45. pg. 168
 154 */
 155enum {
 156        FCTL_EC_ORIG = 0x000000,        /* exchange originator */
 157        FCTL_EC_RESP = 0x800000,        /* exchange responder */
 158        FCTL_SEQ_INI = 0x000000,        /* sequence initiator */
 159        FCTL_SEQ_REC = 0x400000,        /* sequence recipient */
 160        FCTL_FS_EXCH = 0x200000,        /* first sequence of xchg */
 161        FCTL_LS_EXCH = 0x100000,        /* last sequence of xchg */
 162        FCTL_END_SEQ = 0x080000,        /* last frame of sequence */
 163        FCTL_SI_XFER = 0x010000,        /* seq initiative transfer */
 164        FCTL_RO_PRESENT = 0x000008,     /* relative offset present */
 165        FCTL_FILLBYTE_MASK = 0x000003   /* , fill byte mask */
 166};
 167
 168/*
 169 * Fabric Well Known Addresses
 170 */
 171enum {
 172        FC_MIN_WELL_KNOWN_ADDR          = 0xFFFFF0,
 173        FC_DOMAIN_CONTROLLER_MASK       = 0xFFFC00,
 174        FC_ALIAS_SERVER                 = 0xFFFFF8,
 175        FC_MGMT_SERVER                  = 0xFFFFFA,
 176        FC_TIME_SERVER                  = 0xFFFFFB,
 177        FC_NAME_SERVER                  = 0xFFFFFC,
 178        FC_FABRIC_CONTROLLER            = 0xFFFFFD,
 179        FC_FABRIC_PORT                  = 0xFFFFFE,
 180        FC_BROADCAST_SERVER             = 0xFFFFFF
 181};
 182
 183/*
 184 * domain/area/port defines
 185 */
 186#define FC_DOMAIN_MASK  0xFF0000
 187#define FC_DOMAIN_SHIFT 16
 188#define FC_AREA_MASK    0x00FF00
 189#define FC_AREA_SHIFT   8
 190#define FC_PORT_MASK    0x0000FF
 191#define FC_PORT_SHIFT   0
 192
 193#define FC_GET_DOMAIN(p)        (((p) & FC_DOMAIN_MASK) >> FC_DOMAIN_SHIFT)
 194#define FC_GET_AREA(p)          (((p) & FC_AREA_MASK) >> FC_AREA_SHIFT)
 195#define FC_GET_PORT(p)          (((p) & FC_PORT_MASK) >> FC_PORT_SHIFT)
 196
 197#define FC_DOMAIN_CTRLR(p)      (FC_DOMAIN_CONTROLLER_MASK | (FC_GET_DOMAIN(p)))
 198
 199enum {
 200        FC_RXID_ANY = 0xFFFFU,
 201};
 202
 203/*
 204 * generic ELS command
 205 */
 206struct fc_els_cmd_s {
 207        u32        els_code:8;  /* ELS Command Code */
 208        u32        reserved:24;
 209};
 210
 211/*
 212 * ELS Command Codes. FC-PH Table-75. pg. 223
 213 */
 214enum {
 215        FC_ELS_LS_RJT = 0x1,    /* Link Service Reject. */
 216        FC_ELS_ACC = 0x02,      /* Accept */
 217        FC_ELS_PLOGI = 0x03,    /* N_Port Login. */
 218        FC_ELS_FLOGI = 0x04,    /* F_Port Login. */
 219        FC_ELS_LOGO = 0x05,     /* Logout. */
 220        FC_ELS_ABTX = 0x06,     /* Abort Exchange */
 221        FC_ELS_RES = 0x08,      /* Read Exchange status */
 222        FC_ELS_RSS = 0x09,      /* Read sequence status block */
 223        FC_ELS_RSI = 0x0A,      /* Request Sequence Initiative */
 224        FC_ELS_ESTC = 0x0C,     /* Estimate Credit. */
 225        FC_ELS_RTV = 0x0E,      /* Read Timeout Value. */
 226        FC_ELS_RLS = 0x0F,      /* Read Link Status. */
 227        FC_ELS_ECHO = 0x10,     /* Echo */
 228        FC_ELS_TEST = 0x11,     /* Test */
 229        FC_ELS_RRQ = 0x12,      /* Reinstate Recovery Qualifier. */
 230        FC_ELS_REC = 0x13,      /* Add this for TAPE support in FCR */
 231        FC_ELS_PRLI = 0x20,     /* Process Login */
 232        FC_ELS_PRLO = 0x21,     /* Process Logout. */
 233        FC_ELS_SCN = 0x22,      /* State Change Notification. */
 234        FC_ELS_TPRLO = 0x24,    /* Third Party Process Logout. */
 235        FC_ELS_PDISC = 0x50,    /* Discover N_Port Parameters. */
 236        FC_ELS_FDISC = 0x51,    /* Discover F_Port Parameters. */
 237        FC_ELS_ADISC = 0x52,    /* Discover Address. */
 238        FC_ELS_FARP_REQ = 0x54, /* FARP Request. */
 239        FC_ELS_FARP_REP = 0x55, /* FARP Reply. */
 240        FC_ELS_FAN = 0x60,      /* Fabric Address Notification */
 241        FC_ELS_RSCN = 0x61,     /* Reg State Change Notification */
 242        FC_ELS_SCR = 0x62,      /* State Change Registration. */
 243        FC_ELS_RTIN = 0x77,     /* Mangement server request */
 244        FC_ELS_RNID = 0x78,     /* Mangement server request */
 245        FC_ELS_RLIR = 0x79,     /* Registered Link Incident Record */
 246
 247        FC_ELS_RPSC = 0x7D,     /* Report Port Speed Capabilities */
 248        FC_ELS_QSA = 0x7E,      /* Query Security Attributes. Ref FC-SP */
 249        FC_ELS_E2E_LBEACON = 0x81,
 250                                /* End-to-End Link Beacon */
 251        FC_ELS_AUTH = 0x90,     /* Authentication. Ref FC-SP */
 252        FC_ELS_RFCN = 0x97,     /* Request Fabric Change Notification. Ref
 253                                 *FC-SP */
 254};
 255
 256/*
 257 *  Version numbers for FC-PH standards,
 258 *  used in login to indicate what port
 259 *  supports. See FC-PH-X table 158.
 260 */
 261enum {
 262        FC_PH_VER_4_3 = 0x09,
 263        FC_PH_VER_PH_3 = 0x20,
 264};
 265
 266/*
 267 * PDU size defines
 268 */
 269enum {
 270        FC_MIN_PDUSZ = 512,
 271        FC_MAX_PDUSZ = 2112,
 272};
 273
 274/*
 275 * N_Port PLOGI Common Service Parameters.
 276 * FC-PH-x. Figure-76. pg. 308.
 277 */
 278struct fc_plogi_csp_s {
 279        u8              verhi;          /* FC-PH high version */
 280        u8              verlo;          /* FC-PH low version */
 281        __be16          bbcred;         /* BB_Credit */
 282
 283#ifdef __BIG_ENDIAN
 284        u8              ciro:1,         /* continuously increasing RO */
 285                        rro:1,          /* random relative offset */
 286                        npiv_supp:1,    /* NPIV supported */
 287                        port_type:1,    /* N_Port/F_port */
 288                        altbbcred:1,    /* alternate BB_Credit */
 289                        resolution:1,   /* ms/ns ED_TOV resolution */
 290                        vvl_info:1,     /* VVL Info included */
 291                        reserved1:1;
 292
 293        u8              hg_supp:1,
 294                        query_dbc:1,
 295                        security:1,
 296                        sync_cap:1,
 297                        r_t_tov:1,
 298                        dh_dup_supp:1,
 299                        cisc:1,         /* continuously increasing seq count */
 300                        payload:1;
 301#else
 302        u8              reserved2:2,
 303                        resolution:1,   /* ms/ns ED_TOV resolution */
 304                        altbbcred:1,    /* alternate BB_Credit */
 305                        port_type:1,    /* N_Port/F_port */
 306                        npiv_supp:1,    /* NPIV supported */
 307                        rro:1,          /* random relative offset */
 308                        ciro:1;         /* continuously increasing RO */
 309
 310        u8              payload:1,
 311                        cisc:1,         /* continuously increasing seq count */
 312                        dh_dup_supp:1,
 313                        r_t_tov:1,
 314                        sync_cap:1,
 315                        security:1,
 316                        query_dbc:1,
 317                        hg_supp:1;
 318#endif
 319        __be16          rxsz;           /* receive data_field size */
 320        __be16          conseq;
 321        __be16          ro_bitmap;
 322        __be32          e_d_tov;
 323};
 324
 325/*
 326 * N_Port PLOGI Class Specific Parameters.
 327 * FC-PH-x. Figure 78. pg. 318.
 328 */
 329struct fc_plogi_clp_s {
 330#ifdef __BIG_ENDIAN
 331        u32        class_valid:1;
 332        u32        intermix:1;  /* class intermix supported if set =1.
 333                                 * valid only for class1. Reserved for
 334                                 * class2 & class3 */
 335        u32        reserved1:2;
 336        u32        sequential:1;
 337        u32        reserved2:3;
 338#else
 339        u32        reserved2:3;
 340        u32        sequential:1;
 341        u32        reserved1:2;
 342        u32        intermix:1;  /* class intermix supported if set =1.
 343                                 * valid only for class1. Reserved for
 344                                 * class2 & class3 */
 345        u32        class_valid:1;
 346#endif
 347        u32        reserved3:24;
 348
 349        u32        reserved4:16;
 350        u32        rxsz:16;     /* Receive data_field size */
 351
 352        u32        reserved5:8;
 353        u32        conseq:8;
 354        u32        e2e_credit:16; /* end to end credit */
 355
 356        u32        reserved7:8;
 357        u32        ospx:8;
 358        u32        reserved8:16;
 359};
 360
 361/* ASCII value for each character in string "BRCD" */
 362#define FLOGI_VVL_BRCD    0x42524344
 363
 364/*
 365 * PLOGI els command and reply payload
 366 */
 367struct fc_logi_s {
 368        struct fc_els_cmd_s     els_cmd;        /* ELS command code */
 369        struct fc_plogi_csp_s   csp;            /* common service params */
 370        wwn_t                   port_name;
 371        wwn_t                   node_name;
 372        struct fc_plogi_clp_s   class1;         /* class 1 service parameters */
 373        struct fc_plogi_clp_s   class2;         /* class 2 service parameters */
 374        struct fc_plogi_clp_s   class3;         /* class 3 service parameters */
 375        struct fc_plogi_clp_s   class4;         /* class 4 service parameters */
 376        u8                      vvl[16];        /* vendor version level */
 377};
 378
 379/*
 380 * LOGO els command payload
 381 */
 382struct fc_logo_s {
 383        struct fc_els_cmd_s     els_cmd;        /* ELS command code */
 384        u32                     res1:8;
 385        u32             nport_id:24;    /* N_Port identifier of source */
 386        wwn_t           orig_port_name; /* Port name of the LOGO originator */
 387};
 388
 389/*
 390 * ADISC els command payload
 391 */
 392struct fc_adisc_s {
 393        struct fc_els_cmd_s els_cmd;    /* ELS command code */
 394        u32             res1:8;
 395        u32             orig_HA:24;     /* originator hard address */
 396        wwn_t           orig_port_name; /* originator port name */
 397        wwn_t           orig_node_name; /* originator node name */
 398        u32             res2:8;
 399        u32             nport_id:24;    /* originator NPortID */
 400};
 401
 402/*
 403 * Exchange status block
 404 */
 405struct fc_exch_status_blk_s {
 406        u32        oxid:16;
 407        u32        rxid:16;
 408        u32        res1:8;
 409        u32        orig_np:24;  /* originator NPortID */
 410        u32        res2:8;
 411        u32        resp_np:24;  /* responder NPortID */
 412        u32        es_bits;
 413        u32        res3;
 414        /*
 415         * un modified section of the fields
 416         */
 417};
 418
 419/*
 420 * RES els command payload
 421 */
 422struct fc_res_s {
 423        struct fc_els_cmd_s els_cmd;    /* ELS command code */
 424        u32        res1:8;
 425        u32        nport_id:24;         /* N_Port identifier of source */
 426        u32        oxid:16;
 427        u32        rxid:16;
 428        u8         assoc_hdr[32];
 429};
 430
 431/*
 432 * RES els accept payload
 433 */
 434struct fc_res_acc_s {
 435        struct fc_els_cmd_s             els_cmd;        /* ELS command code */
 436        struct fc_exch_status_blk_s     fc_exch_blk; /* Exchange status block */
 437};
 438
 439/*
 440 * REC els command payload
 441 */
 442struct fc_rec_s {
 443        struct fc_els_cmd_s els_cmd;    /* ELS command code */
 444        u32        res1:8;
 445        u32        nport_id:24; /* N_Port identifier of source */
 446        u32        oxid:16;
 447        u32        rxid:16;
 448};
 449
 450#define FC_REC_ESB_OWN_RSP      0x80000000      /* responder owns */
 451#define FC_REC_ESB_SI           0x40000000      /* SI is owned  */
 452#define FC_REC_ESB_COMP         0x20000000      /* exchange is complete */
 453#define FC_REC_ESB_ENDCOND_ABN  0x10000000      /* abnormal ending      */
 454#define FC_REC_ESB_RQACT        0x04000000      /* recovery qual active */
 455#define FC_REC_ESB_ERRP_MSK     0x03000000
 456#define FC_REC_ESB_OXID_INV     0x00800000      /* invalid OXID         */
 457#define FC_REC_ESB_RXID_INV     0x00400000      /* invalid RXID         */
 458#define FC_REC_ESB_PRIO_INUSE   0x00200000
 459
 460/*
 461 * REC els accept payload
 462 */
 463struct fc_rec_acc_s {
 464        struct fc_els_cmd_s els_cmd;    /* ELS command code */
 465        u32        oxid:16;
 466        u32        rxid:16;
 467        u32        res1:8;
 468        u32        orig_id:24;  /* N_Port id of exchange originator */
 469        u32        res2:8;
 470        u32        resp_id:24;  /* N_Port id of exchange responder */
 471        u32        count;       /* data transfer count */
 472        u32        e_stat;      /* exchange status */
 473};
 474
 475/*
 476 * RSI els payload
 477 */
 478struct fc_rsi_s {
 479        struct fc_els_cmd_s els_cmd;
 480        u32        res1:8;
 481        u32        orig_sid:24;
 482        u32        oxid:16;
 483        u32        rxid:16;
 484};
 485
 486/*
 487 * structure for PRLI paramater pages, both request & response
 488 * see FC-PH-X table 113 & 115 for explanation also FCP table 8
 489 */
 490struct fc_prli_params_s {
 491        u32        reserved:16;
 492#ifdef __BIG_ENDIAN
 493        u32        reserved1:5;
 494        u32        rec_support:1;
 495        u32        task_retry_id:1;
 496        u32        retry:1;
 497
 498        u32        confirm:1;
 499        u32        doverlay:1;
 500        u32        initiator:1;
 501        u32        target:1;
 502        u32        cdmix:1;
 503        u32        drmix:1;
 504        u32        rxrdisab:1;
 505        u32        wxrdisab:1;
 506#else
 507        u32        retry:1;
 508        u32        task_retry_id:1;
 509        u32        rec_support:1;
 510        u32        reserved1:5;
 511
 512        u32        wxrdisab:1;
 513        u32        rxrdisab:1;
 514        u32        drmix:1;
 515        u32        cdmix:1;
 516        u32        target:1;
 517        u32        initiator:1;
 518        u32        doverlay:1;
 519        u32        confirm:1;
 520#endif
 521};
 522
 523/*
 524 * valid values for rspcode in PRLI ACC payload
 525 */
 526enum {
 527        FC_PRLI_ACC_XQTD = 0x1,         /* request executed */
 528        FC_PRLI_ACC_PREDEF_IMG = 0x5,   /* predefined image - no prli needed */
 529};
 530
 531struct fc_prli_params_page_s {
 532        u32        type:8;
 533        u32        codext:8;
 534#ifdef __BIG_ENDIAN
 535        u32        origprocasv:1;
 536        u32        rsppav:1;
 537        u32        imagepair:1;
 538        u32        reserved1:1;
 539        u32        rspcode:4;
 540#else
 541        u32        rspcode:4;
 542        u32        reserved1:1;
 543        u32        imagepair:1;
 544        u32        rsppav:1;
 545        u32        origprocasv:1;
 546#endif
 547        u32        reserved2:8;
 548
 549        u32        origprocas;
 550        u32        rspprocas;
 551        struct fc_prli_params_s servparams;
 552};
 553
 554/*
 555 * PRLI request and accept payload, FC-PH-X tables 112 & 114
 556 */
 557struct fc_prli_s {
 558        u32        command:8;
 559        u32        pglen:8;
 560        u32        pagebytes:16;
 561        struct fc_prli_params_page_s parampage;
 562};
 563
 564/*
 565 * PRLO logout params page
 566 */
 567struct fc_prlo_params_page_s {
 568        u32        type:8;
 569        u32        type_ext:8;
 570#ifdef __BIG_ENDIAN
 571        u32        opa_valid:1; /* originator process associator valid */
 572        u32        rpa_valid:1; /* responder process associator valid */
 573        u32        res1:14;
 574#else
 575        u32        res1:14;
 576        u32        rpa_valid:1; /* responder process associator valid */
 577        u32        opa_valid:1; /* originator process associator valid */
 578#endif
 579        u32        orig_process_assc;
 580        u32        resp_process_assc;
 581
 582        u32        res2;
 583};
 584
 585/*
 586 * PRLO els command payload
 587 */
 588struct fc_prlo_s {
 589        u32     command:8;
 590        u32     page_len:8;
 591        u32     payload_len:16;
 592        struct fc_prlo_params_page_s    prlo_params[1];
 593};
 594
 595/*
 596 * PRLO Logout response parameter page
 597 */
 598struct fc_prlo_acc_params_page_s {
 599        u32        type:8;
 600        u32        type_ext:8;
 601
 602#ifdef __BIG_ENDIAN
 603        u32        opa_valid:1; /* originator process associator valid */
 604        u32        rpa_valid:1; /* responder process associator valid */
 605        u32        res1:14;
 606#else
 607        u32        res1:14;
 608        u32        rpa_valid:1; /* responder process associator valid */
 609        u32        opa_valid:1; /* originator process associator valid */
 610#endif
 611        u32        orig_process_assc;
 612        u32        resp_process_assc;
 613
 614        u32        fc4type_csp;
 615};
 616
 617/*
 618 * PRLO els command ACC payload
 619 */
 620struct fc_prlo_acc_s {
 621        u32        command:8;
 622        u32        page_len:8;
 623        u32        payload_len:16;
 624        struct fc_prlo_acc_params_page_s prlo_acc_params[1];
 625};
 626
 627/*
 628 * SCR els command payload
 629 */
 630enum {
 631        FC_SCR_REG_FUNC_FABRIC_DETECTED = 0x01,
 632        FC_SCR_REG_FUNC_N_PORT_DETECTED = 0x02,
 633        FC_SCR_REG_FUNC_FULL = 0x03,
 634        FC_SCR_REG_FUNC_CLEAR_REG = 0xFF,
 635};
 636
 637/* SCR VU registrations */
 638enum {
 639        FC_VU_SCR_REG_FUNC_FABRIC_NAME_CHANGE = 0x01
 640};
 641
 642struct fc_scr_s {
 643        u32 command:8;
 644        u32 res:24;
 645        u32 vu_reg_func:8; /* Vendor Unique Registrations */
 646        u32 res1:16;
 647        u32 reg_func:8;
 648};
 649
 650/*
 651 * Information category for Basic link data
 652 */
 653enum {
 654        FC_CAT_NOP      = 0x0,
 655        FC_CAT_ABTS     = 0x1,
 656        FC_CAT_RMC      = 0x2,
 657        FC_CAT_BA_ACC   = 0x4,
 658        FC_CAT_BA_RJT   = 0x5,
 659        FC_CAT_PRMT     = 0x6,
 660};
 661
 662/*
 663 * LS_RJT els reply payload
 664 */
 665struct fc_ls_rjt_s {
 666        struct fc_els_cmd_s els_cmd;    /* ELS command code */
 667        u32        res1:8;
 668        u32        reason_code:8;       /* Reason code for reject */
 669        u32        reason_code_expl:8;  /* Reason code explanation */
 670        u32        vendor_unique:8;     /* Vendor specific */
 671};
 672
 673/*
 674 * LS_RJT reason codes
 675 */
 676enum {
 677        FC_LS_RJT_RSN_INV_CMD_CODE      = 0x01,
 678        FC_LS_RJT_RSN_LOGICAL_ERROR     = 0x03,
 679        FC_LS_RJT_RSN_LOGICAL_BUSY      = 0x05,
 680        FC_LS_RJT_RSN_PROTOCOL_ERROR    = 0x07,
 681        FC_LS_RJT_RSN_UNABLE_TO_PERF_CMD = 0x09,
 682        FC_LS_RJT_RSN_CMD_NOT_SUPP      = 0x0B,
 683};
 684
 685/*
 686 * LS_RJT reason code explanation
 687 */
 688enum {
 689        FC_LS_RJT_EXP_NO_ADDL_INFO              = 0x00,
 690        FC_LS_RJT_EXP_SPARMS_ERR_OPTIONS        = 0x01,
 691        FC_LS_RJT_EXP_SPARMS_ERR_INI_CTL        = 0x03,
 692        FC_LS_RJT_EXP_SPARMS_ERR_REC_CTL        = 0x05,
 693        FC_LS_RJT_EXP_SPARMS_ERR_RXSZ           = 0x07,
 694        FC_LS_RJT_EXP_SPARMS_ERR_CONSEQ         = 0x09,
 695        FC_LS_RJT_EXP_SPARMS_ERR_CREDIT         = 0x0B,
 696        FC_LS_RJT_EXP_INV_PORT_NAME             = 0x0D,
 697        FC_LS_RJT_EXP_INV_NODE_FABRIC_NAME      = 0x0E,
 698        FC_LS_RJT_EXP_INV_CSP                   = 0x0F,
 699        FC_LS_RJT_EXP_INV_ASSOC_HDR             = 0x11,
 700        FC_LS_RJT_EXP_ASSOC_HDR_REQD            = 0x13,
 701        FC_LS_RJT_EXP_INV_ORIG_S_ID             = 0x15,
 702        FC_LS_RJT_EXP_INV_OXID_RXID_COMB        = 0x17,
 703        FC_LS_RJT_EXP_CMD_ALREADY_IN_PROG       = 0x19,
 704        FC_LS_RJT_EXP_LOGIN_REQUIRED            = 0x1E,
 705        FC_LS_RJT_EXP_INVALID_NPORT_ID          = 0x1F,
 706        FC_LS_RJT_EXP_INSUFF_RES                = 0x29,
 707        FC_LS_RJT_EXP_CMD_NOT_SUPP              = 0x2C,
 708        FC_LS_RJT_EXP_INV_PAYLOAD_LEN           = 0x2D,
 709};
 710
 711/*
 712 * RRQ els command payload
 713 */
 714struct fc_rrq_s {
 715        struct fc_els_cmd_s els_cmd;    /* ELS command code */
 716        u32        res1:8;
 717        u32        s_id:24;     /* exchange originator S_ID */
 718
 719        u32        ox_id:16;    /* originator exchange ID */
 720        u32        rx_id:16;    /* responder exchange ID */
 721
 722        u32        res2[8];     /* optional association header */
 723};
 724
 725/*
 726 * ABTS BA_ACC reply payload
 727 */
 728struct fc_ba_acc_s {
 729        u32        seq_id_valid:8;      /* set to 0x00 for Abort Exchange */
 730        u32        seq_id:8;            /* invalid for Abort Exchange */
 731        u32        res2:16;
 732        u32        ox_id:16;            /* OX_ID from ABTS frame */
 733        u32        rx_id:16;            /* RX_ID from ABTS frame */
 734        u32        low_seq_cnt:16;      /* set to 0x0000 for Abort Exchange */
 735        u32        high_seq_cnt:16;     /* set to 0xFFFF for Abort Exchange */
 736};
 737
 738/*
 739 * ABTS BA_RJT reject payload
 740 */
 741struct fc_ba_rjt_s {
 742        u32        res1:8;              /* Reserved */
 743        u32        reason_code:8;       /* reason code for reject */
 744        u32        reason_expl:8;       /* reason code explanation */
 745        u32        vendor_unique:8; /* vendor unique reason code,set to 0 */
 746};
 747
 748/*
 749 * TPRLO logout parameter page
 750 */
 751struct fc_tprlo_params_page_s {
 752        u32        type:8;
 753        u32        type_ext:8;
 754
 755#ifdef __BIG_ENDIAN
 756        u32        opa_valid:1;
 757        u32        rpa_valid:1;
 758        u32        tpo_nport_valid:1;
 759        u32        global_process_logout:1;
 760        u32        res1:12;
 761#else
 762        u32        res1:12;
 763        u32        global_process_logout:1;
 764        u32        tpo_nport_valid:1;
 765        u32        rpa_valid:1;
 766        u32        opa_valid:1;
 767#endif
 768
 769        u32        orig_process_assc;
 770        u32        resp_process_assc;
 771
 772        u32        res2:8;
 773        u32        tpo_nport_id;
 774};
 775
 776/*
 777 * TPRLO ELS command payload
 778 */
 779struct fc_tprlo_s {
 780        u32        command:8;
 781        u32        page_len:8;
 782        u32        payload_len:16;
 783
 784        struct fc_tprlo_params_page_s tprlo_params[1];
 785};
 786
 787enum fc_tprlo_type {
 788        FC_GLOBAL_LOGO = 1,
 789        FC_TPR_LOGO
 790};
 791
 792/*
 793 * TPRLO els command ACC payload
 794 */
 795struct fc_tprlo_acc_s {
 796        u32     command:8;
 797        u32     page_len:8;
 798        u32     payload_len:16;
 799        struct fc_prlo_acc_params_page_s tprlo_acc_params[1];
 800};
 801
 802/*
 803 * RSCN els command req payload
 804 */
 805#define FC_RSCN_PGLEN   0x4
 806
 807enum fc_rscn_format {
 808        FC_RSCN_FORMAT_PORTID   = 0x0,
 809        FC_RSCN_FORMAT_AREA     = 0x1,
 810        FC_RSCN_FORMAT_DOMAIN   = 0x2,
 811        FC_RSCN_FORMAT_FABRIC   = 0x3,
 812};
 813
 814struct fc_rscn_event_s {
 815        u32     format:2;
 816        u32     qualifier:4;
 817        u32     resvd:2;
 818        u32     portid:24;
 819};
 820
 821struct fc_rscn_pl_s {
 822        u8      command;
 823        u8      pagelen;
 824        __be16  payldlen;
 825        struct fc_rscn_event_s event[1];
 826};
 827
 828/*
 829 * ECHO els command req payload
 830 */
 831struct fc_echo_s {
 832        struct fc_els_cmd_s els_cmd;
 833};
 834
 835/*
 836 * RNID els command
 837 */
 838#define RNID_NODEID_DATA_FORMAT_COMMON                  0x00
 839#define RNID_NODEID_DATA_FORMAT_FCP3                    0x08
 840#define RNID_NODEID_DATA_FORMAT_DISCOVERY               0xDF
 841
 842#define RNID_ASSOCIATED_TYPE_UNKNOWN                    0x00000001
 843#define RNID_ASSOCIATED_TYPE_OTHER                      0x00000002
 844#define RNID_ASSOCIATED_TYPE_HUB                        0x00000003
 845#define RNID_ASSOCIATED_TYPE_SWITCH                     0x00000004
 846#define RNID_ASSOCIATED_TYPE_GATEWAY                    0x00000005
 847#define RNID_ASSOCIATED_TYPE_STORAGE_DEVICE             0x00000009
 848#define RNID_ASSOCIATED_TYPE_HOST                       0x0000000A
 849#define RNID_ASSOCIATED_TYPE_STORAGE_SUBSYSTEM          0x0000000B
 850#define RNID_ASSOCIATED_TYPE_STORAGE_ACCESS_DEVICE      0x0000000E
 851#define RNID_ASSOCIATED_TYPE_NAS_SERVER                 0x00000011
 852#define RNID_ASSOCIATED_TYPE_BRIDGE                     0x00000002
 853#define RNID_ASSOCIATED_TYPE_VIRTUALIZATION_DEVICE      0x00000003
 854#define RNID_ASSOCIATED_TYPE_MULTI_FUNCTION_DEVICE      0x000000FF
 855
 856/*
 857 * RNID els command payload
 858 */
 859struct fc_rnid_cmd_s {
 860        struct fc_els_cmd_s els_cmd;
 861        u32        node_id_data_format:8;
 862        u32        reserved:24;
 863};
 864
 865/*
 866 * RNID els response payload
 867 */
 868
 869struct fc_rnid_common_id_data_s {
 870        wwn_t           port_name;
 871        wwn_t           node_name;
 872};
 873
 874struct fc_rnid_general_topology_data_s {
 875        u32        vendor_unique[4];
 876        __be32     asso_type;
 877        u32        phy_port_num;
 878        __be32     num_attached_nodes;
 879        u32        node_mgmt:8;
 880        u32        ip_version:8;
 881        u32        udp_tcp_port_num:16;
 882        u32        ip_address[4];
 883        u32        reserved:16;
 884        u32        vendor_specific:16;
 885};
 886
 887struct fc_rnid_acc_s {
 888        struct fc_els_cmd_s els_cmd;
 889        u32        node_id_data_format:8;
 890        u32        common_id_data_length:8;
 891        u32        reserved:8;
 892        u32        specific_id_data_length:8;
 893        struct fc_rnid_common_id_data_s common_id_data;
 894        struct fc_rnid_general_topology_data_s gen_topology_data;
 895};
 896
 897#define RNID_ASSOCIATED_TYPE_UNKNOWN                    0x00000001
 898#define RNID_ASSOCIATED_TYPE_OTHER                      0x00000002
 899#define RNID_ASSOCIATED_TYPE_HUB                        0x00000003
 900#define RNID_ASSOCIATED_TYPE_SWITCH                     0x00000004
 901#define RNID_ASSOCIATED_TYPE_GATEWAY                    0x00000005
 902#define RNID_ASSOCIATED_TYPE_STORAGE_DEVICE             0x00000009
 903#define RNID_ASSOCIATED_TYPE_HOST                       0x0000000A
 904#define RNID_ASSOCIATED_TYPE_STORAGE_SUBSYSTEM          0x0000000B
 905#define RNID_ASSOCIATED_TYPE_STORAGE_ACCESS_DEVICE      0x0000000E
 906#define RNID_ASSOCIATED_TYPE_NAS_SERVER                 0x00000011
 907#define RNID_ASSOCIATED_TYPE_BRIDGE                     0x00000002
 908#define RNID_ASSOCIATED_TYPE_VIRTUALIZATION_DEVICE      0x00000003
 909#define RNID_ASSOCIATED_TYPE_MULTI_FUNCTION_DEVICE      0x000000FF
 910
 911enum fc_rpsc_speed_cap {
 912        RPSC_SPEED_CAP_1G = 0x8000,
 913        RPSC_SPEED_CAP_2G = 0x4000,
 914        RPSC_SPEED_CAP_4G = 0x2000,
 915        RPSC_SPEED_CAP_10G = 0x1000,
 916        RPSC_SPEED_CAP_8G = 0x0800,
 917        RPSC_SPEED_CAP_16G = 0x0400,
 918
 919        RPSC_SPEED_CAP_UNKNOWN = 0x0001,
 920};
 921
 922enum fc_rpsc_op_speed {
 923        RPSC_OP_SPEED_1G = 0x8000,
 924        RPSC_OP_SPEED_2G = 0x4000,
 925        RPSC_OP_SPEED_4G = 0x2000,
 926        RPSC_OP_SPEED_10G = 0x1000,
 927        RPSC_OP_SPEED_8G = 0x0800,
 928        RPSC_OP_SPEED_16G = 0x0400,
 929
 930        RPSC_OP_SPEED_NOT_EST = 0x0001, /* speed not established */
 931};
 932
 933struct fc_rpsc_speed_info_s {
 934        __be16        port_speed_cap;   /* see enum fc_rpsc_speed_cap */
 935        __be16        port_op_speed;    /* see enum fc_rpsc_op_speed */
 936};
 937
 938/*
 939 * If RPSC request is sent to the Domain Controller, the request is for
 940 * all the ports within that domain.
 941 */
 942struct fc_rpsc_cmd_s {
 943        struct fc_els_cmd_s els_cmd;
 944};
 945
 946/*
 947 * RPSC Acc
 948 */
 949struct fc_rpsc_acc_s {
 950        u32        command:8;
 951        u32        rsvd:8;
 952        u32        num_entries:16;
 953
 954        struct fc_rpsc_speed_info_s speed_info[1];
 955};
 956
 957/*
 958 * If RPSC2 request is sent to the Domain Controller,
 959 */
 960#define FC_BRCD_TOKEN    0x42524344
 961
 962struct fc_rpsc2_cmd_s {
 963        struct fc_els_cmd_s els_cmd;
 964        __be32  token;
 965        u16     resvd;
 966        __be16  num_pids;               /* Number of pids in the request */
 967        struct  {
 968                u32     rsvd1:8;
 969                u32     pid:24;         /* port identifier */
 970        } pid_list[1];
 971};
 972
 973enum fc_rpsc2_port_type {
 974        RPSC2_PORT_TYPE_UNKNOWN = 0,
 975        RPSC2_PORT_TYPE_NPORT   = 1,
 976        RPSC2_PORT_TYPE_NLPORT  = 2,
 977        RPSC2_PORT_TYPE_NPIV_PORT  = 0x5f,
 978        RPSC2_PORT_TYPE_NPORT_TRUNK  = 0x6f,
 979};
 980
 981/*
 982 * RPSC2 portInfo entry structure
 983 */
 984struct fc_rpsc2_port_info_s {
 985        __be32  pid;            /* PID */
 986        u16     resvd1;
 987        __be16  index;          /* port number / index */
 988        u8      resvd2;
 989        u8      type;           /* port type N/NL/... */
 990        __be16  speed;          /* port Operating Speed */
 991};
 992
 993/*
 994 * RPSC2 Accept payload
 995 */
 996struct fc_rpsc2_acc_s {
 997        u8        els_cmd;
 998        u8        resvd;
 999        __be16    num_pids; /* Number of pids in the request */
1000        struct fc_rpsc2_port_info_s port_info[1]; /* port information */
1001};
1002
1003/*
1004 * bit fields so that multiple classes can be specified
1005 */
1006enum fc_cos {
1007        FC_CLASS_2      = 0x04,
1008        FC_CLASS_3      = 0x08,
1009        FC_CLASS_2_3    = 0x0C,
1010};
1011
1012/*
1013 * symbolic name
1014 */
1015struct fc_symname_s {
1016        u8         symname[FC_SYMNAME_MAX];
1017};
1018
1019struct fc_alpabm_s {
1020        u8      alpa_bm[FC_ALPA_MAX / 8];
1021};
1022
1023/*
1024 * protocol default timeout values
1025 */
1026#define FC_ED_TOV       2
1027#define FC_REC_TOV      (FC_ED_TOV + 1)
1028#define FC_RA_TOV       10
1029#define FC_ELS_TOV      (2 * FC_RA_TOV)
1030#define FC_FCCT_TOV     (3 * FC_RA_TOV)
1031
1032/*
1033 * virtual fabric related defines
1034 */
1035#define FC_VF_ID_NULL    0      /*  must not be used as VF_ID */
1036#define FC_VF_ID_MIN     1
1037#define FC_VF_ID_MAX     0xEFF
1038#define FC_VF_ID_CTL     0xFEF  /*  control VF_ID */
1039
1040/*
1041 * Virtual Fabric Tagging header format
1042 * @caution This is defined only in BIG ENDIAN format.
1043 */
1044struct fc_vft_s {
1045        u32        r_ctl:8;
1046        u32        ver:2;
1047        u32        type:4;
1048        u32        res_a:2;
1049        u32        priority:3;
1050        u32        vf_id:12;
1051        u32        res_b:1;
1052        u32        hopct:8;
1053        u32        res_c:24;
1054};
1055
1056/*
1057 * FCP_CMND definitions
1058 */
1059#define FCP_CMND_CDB_LEN    16
1060#define FCP_CMND_LUN_LEN    8
1061
1062struct fcp_cmnd_s {
1063        struct scsi_lun lun;            /* 64-bit LU number */
1064        u8              crn;            /* command reference number */
1065#ifdef __BIG_ENDIAN
1066        u8              resvd:1,
1067                        priority:4,     /* FCP-3: SAM-3 priority */
1068                        taskattr:3;     /* scsi task attribute */
1069#else
1070        u8              taskattr:3,     /* scsi task attribute */
1071                        priority:4,     /* FCP-3: SAM-3 priority */
1072                        resvd:1;
1073#endif
1074        u8              tm_flags;       /* task management flags */
1075#ifdef __BIG_ENDIAN
1076        u8              addl_cdb_len:6, /* additional CDB length words */
1077                        iodir:2;        /* read/write FCP_DATA IUs */
1078#else
1079        u8              iodir:2,        /* read/write FCP_DATA IUs */
1080                        addl_cdb_len:6; /* additional CDB length */
1081#endif
1082        struct scsi_cdb_s      cdb;
1083
1084        __be32        fcp_dl;   /* bytes to be transferred */
1085};
1086
1087#define fcp_cmnd_cdb_len(_cmnd) ((_cmnd)->addl_cdb_len * 4 + FCP_CMND_CDB_LEN)
1088#define fcp_cmnd_fcpdl(_cmnd)   ((&(_cmnd)->fcp_dl)[(_cmnd)->addl_cdb_len])
1089
1090/*
1091 * struct fcp_cmnd_s .iodir field values
1092 */
1093enum fcp_iodir {
1094        FCP_IODIR_NONE  = 0,
1095        FCP_IODIR_WRITE = 1,
1096        FCP_IODIR_READ  = 2,
1097        FCP_IODIR_RW    = 3,
1098};
1099
1100/*
1101 * Task management flags field - only one bit shall be set
1102 */
1103enum fcp_tm_cmnd {
1104        FCP_TM_ABORT_TASK_SET   = BIT(1),
1105        FCP_TM_CLEAR_TASK_SET   = BIT(2),
1106        FCP_TM_LUN_RESET        = BIT(4),
1107        FCP_TM_TARGET_RESET     = BIT(5),       /* obsolete in FCP-3 */
1108        FCP_TM_CLEAR_ACA        = BIT(6),
1109};
1110
1111/*
1112 * FCP_RSP residue flags
1113 */
1114enum fcp_residue {
1115        FCP_NO_RESIDUE = 0,     /* no residue */
1116        FCP_RESID_OVER = 1,     /* more data left that was not sent */
1117        FCP_RESID_UNDER = 2,    /* less data than requested */
1118};
1119
1120struct fcp_rspinfo_s {
1121        u32        res0:24;
1122        u32        rsp_code:8;          /* response code (as above) */
1123        u32        res1;
1124};
1125
1126struct fcp_resp_s {
1127        u32        reserved[2];         /* 2 words reserved */
1128        u16        reserved2;
1129#ifdef __BIG_ENDIAN
1130        u8         reserved3:3;
1131        u8         fcp_conf_req:1;      /* FCP_CONF is requested */
1132        u8         resid_flags:2;       /* underflow/overflow */
1133        u8         sns_len_valid:1;     /* sense len is valid */
1134        u8         rsp_len_valid:1;     /* response len is valid */
1135#else
1136        u8         rsp_len_valid:1;     /* response len is valid */
1137        u8         sns_len_valid:1;     /* sense len is valid */
1138        u8         resid_flags:2;       /* underflow/overflow */
1139        u8         fcp_conf_req:1;      /* FCP_CONF is requested */
1140        u8         reserved3:3;
1141#endif
1142        u8         scsi_status;         /* one byte SCSI status */
1143        u32        residue;             /* residual data bytes */
1144        u32        sns_len;             /* length od sense info */
1145        u32        rsp_len;             /* length of response info */
1146};
1147
1148#define fcp_snslen(__fcprsp)    ((__fcprsp)->sns_len_valid ?            \
1149                                        (__fcprsp)->sns_len : 0)
1150#define fcp_rsplen(__fcprsp)    ((__fcprsp)->rsp_len_valid ?            \
1151                                        (__fcprsp)->rsp_len : 0)
1152#define fcp_rspinfo(__fcprsp)   ((struct fcp_rspinfo_s *)((__fcprsp) + 1))
1153#define fcp_snsinfo(__fcprsp)   (((u8 *)fcp_rspinfo(__fcprsp)) +        \
1154                                                fcp_rsplen(__fcprsp))
1155/*
1156 * CT
1157 */
1158struct ct_hdr_s {
1159        u32     rev_id:8;       /* Revision of the CT */
1160        u32     in_id:24;       /* Initiator Id */
1161        u32     gs_type:8;      /* Generic service Type */
1162        u32     gs_sub_type:8;  /* Generic service sub type */
1163        u32     options:8;      /* options */
1164        u32     rsvrd:8;        /* reserved */
1165        u32     cmd_rsp_code:16;/* ct command/response code */
1166        u32     max_res_size:16;/* maximum/residual size */
1167        u32     frag_id:8;      /* fragment ID */
1168        u32     reason_code:8;  /* reason code */
1169        u32     exp_code:8;     /* explanation code */
1170        u32     vendor_unq:8;   /* vendor unique */
1171};
1172
1173/*
1174 * defines for the Revision
1175 */
1176enum {
1177        CT_GS3_REVISION = 0x01,
1178};
1179
1180/*
1181 * defines for gs_type
1182 */
1183enum {
1184        CT_GSTYPE_KEYSERVICE    = 0xF7,
1185        CT_GSTYPE_ALIASSERVICE  = 0xF8,
1186        CT_GSTYPE_MGMTSERVICE   = 0xFA,
1187        CT_GSTYPE_TIMESERVICE   = 0xFB,
1188        CT_GSTYPE_DIRSERVICE    = 0xFC,
1189};
1190
1191/*
1192 * defines for gs_sub_type for gs type directory service
1193 */
1194enum {
1195        CT_GSSUBTYPE_NAMESERVER = 0x02,
1196};
1197
1198/*
1199 * defines for gs_sub_type for gs type management service
1200 */
1201enum {
1202        CT_GSSUBTYPE_CFGSERVER  = 0x01,
1203        CT_GSSUBTYPE_UNZONED_NS = 0x02,
1204        CT_GSSUBTYPE_ZONESERVER = 0x03,
1205        CT_GSSUBTYPE_LOCKSERVER = 0x04,
1206        CT_GSSUBTYPE_HBA_MGMTSERVER = 0x10,     /* for FDMI */
1207};
1208
1209/*
1210 * defines for CT response code field
1211 */
1212enum {
1213        CT_RSP_REJECT = 0x8001,
1214        CT_RSP_ACCEPT = 0x8002,
1215};
1216
1217/*
1218 * defintions for CT reason code
1219 */
1220enum {
1221        CT_RSN_INV_CMD          = 0x01,
1222        CT_RSN_INV_VER          = 0x02,
1223        CT_RSN_LOGIC_ERR        = 0x03,
1224        CT_RSN_INV_SIZE         = 0x04,
1225        CT_RSN_LOGICAL_BUSY     = 0x05,
1226        CT_RSN_PROTO_ERR        = 0x07,
1227        CT_RSN_UNABLE_TO_PERF   = 0x09,
1228        CT_RSN_NOT_SUPP         = 0x0B,
1229        CT_RSN_SERVER_NOT_AVBL  = 0x0D,
1230        CT_RSN_SESSION_COULD_NOT_BE_ESTBD = 0x0E,
1231        CT_RSN_VENDOR_SPECIFIC  = 0xFF,
1232
1233};
1234
1235/*
1236 * definitions for explanations code for Name server
1237 */
1238enum {
1239        CT_NS_EXP_NOADDITIONAL  = 0x00,
1240        CT_NS_EXP_ID_NOT_REG    = 0x01,
1241        CT_NS_EXP_PN_NOT_REG    = 0x02,
1242        CT_NS_EXP_NN_NOT_REG    = 0x03,
1243        CT_NS_EXP_CS_NOT_REG    = 0x04,
1244        CT_NS_EXP_IPN_NOT_REG   = 0x05,
1245        CT_NS_EXP_IPA_NOT_REG   = 0x06,
1246        CT_NS_EXP_FT_NOT_REG    = 0x07,
1247        CT_NS_EXP_SPN_NOT_REG   = 0x08,
1248        CT_NS_EXP_SNN_NOT_REG   = 0x09,
1249        CT_NS_EXP_PT_NOT_REG    = 0x0A,
1250        CT_NS_EXP_IPP_NOT_REG   = 0x0B,
1251        CT_NS_EXP_FPN_NOT_REG   = 0x0C,
1252        CT_NS_EXP_HA_NOT_REG    = 0x0D,
1253        CT_NS_EXP_FD_NOT_REG    = 0x0E,
1254        CT_NS_EXP_FF_NOT_REG    = 0x0F,
1255        CT_NS_EXP_ACCESSDENIED  = 0x10,
1256        CT_NS_EXP_UNACCEPTABLE_ID = 0x11,
1257        CT_NS_EXP_DATABASEEMPTY         = 0x12,
1258        CT_NS_EXP_NOT_REG_IN_SCOPE      = 0x13,
1259        CT_NS_EXP_DOM_ID_NOT_PRESENT    = 0x14,
1260        CT_NS_EXP_PORT_NUM_NOT_PRESENT  = 0x15,
1261        CT_NS_EXP_NO_DEVICE_ATTACHED    = 0x16
1262};
1263
1264/*
1265 * defintions for the explanation code for all servers
1266 */
1267enum {
1268        CT_EXP_AUTH_EXCEPTION           = 0xF1,
1269        CT_EXP_DB_FULL                  = 0xF2,
1270        CT_EXP_DB_EMPTY                 = 0xF3,
1271        CT_EXP_PROCESSING_REQ           = 0xF4,
1272        CT_EXP_UNABLE_TO_VERIFY_CONN    = 0xF5,
1273        CT_EXP_DEVICES_NOT_IN_CMN_ZONE  = 0xF6
1274};
1275
1276/*
1277 * Command codes for Name server
1278 */
1279enum {
1280        GS_GID_PN       = 0x0121,       /* Get Id on port name */
1281        GS_GPN_ID       = 0x0112,       /* Get port name on ID */
1282        GS_GNN_ID       = 0x0113,       /* Get node name on ID */
1283        GS_GID_FT       = 0x0171,       /* Get Id on FC4 type */
1284        GS_GSPN_ID      = 0x0118,       /* Get symbolic PN on ID */
1285        GS_RFT_ID       = 0x0217,       /* Register fc4type on ID */
1286        GS_RSPN_ID      = 0x0218,       /* Register symbolic PN on ID */
1287        GS_RSNN_NN      = 0x0239,       /* Register symbolic NN on NN */
1288        GS_RPN_ID       = 0x0212,       /* Register port name */
1289        GS_RNN_ID       = 0x0213,       /* Register node name */
1290        GS_RCS_ID       = 0x0214,       /* Register class of service */
1291        GS_RPT_ID       = 0x021A,       /* Register port type */
1292        GS_GA_NXT       = 0x0100,       /* Get all next */
1293        GS_RFF_ID       = 0x021F,       /* Register FC4 Feature         */
1294};
1295
1296struct fcgs_id_req_s {
1297        u32 rsvd:8;
1298        u32 dap:24; /* port identifier */
1299};
1300#define fcgs_gpnid_req_t struct fcgs_id_req_s
1301#define fcgs_gnnid_req_t struct fcgs_id_req_s
1302#define fcgs_gspnid_req_t struct fcgs_id_req_s
1303
1304struct fcgs_gidpn_req_s {
1305        wwn_t   port_name;      /* port wwn */
1306};
1307
1308struct fcgs_gidpn_resp_s {
1309        u32     rsvd:8;
1310        u32     dap:24;         /* port identifier */
1311};
1312
1313/*
1314 * RFT_ID
1315 */
1316struct fcgs_rftid_req_s {
1317        u32     rsvd:8;
1318        u32     dap:24;         /* port identifier */
1319        __be32  fc4_type[8];    /* fc4 types */
1320};
1321
1322/*
1323 * RFF_ID : Register FC4 features.
1324 */
1325#define FC_GS_FCP_FC4_FEATURE_INITIATOR  0x02
1326#define FC_GS_FCP_FC4_FEATURE_TARGET     0x01
1327
1328struct fcgs_rffid_req_s {
1329        u32     rsvd:8;
1330        u32     dap:24;         /* port identifier */
1331        u32     rsvd1:16;
1332        u32     fc4ftr_bits:8;  /* fc4 feature bits */
1333        u32     fc4_type:8;             /* corresponding FC4 Type */
1334};
1335
1336/*
1337 * GID_FT Request
1338 */
1339struct fcgs_gidft_req_s {
1340        u8      reserved;
1341        u8      domain_id;      /* domain, 0 - all fabric */
1342        u8      area_id;        /* area, 0 - whole domain */
1343        u8      fc4_type;       /* FC_TYPE_FCP for SCSI devices */
1344};
1345
1346/*
1347 * GID_FT Response
1348 */
1349struct fcgs_gidft_resp_s {
1350        u8      last:1;         /* last port identifier flag */
1351        u8      reserved:7;
1352        u32     pid:24;         /* port identifier */
1353};
1354
1355/*
1356 * RSPN_ID
1357 */
1358struct fcgs_rspnid_req_s {
1359        u32     rsvd:8;
1360        u32     dap:24;         /* port identifier */
1361        u8      spn_len;        /* symbolic port name length */
1362        u8      spn[256];       /* symbolic port name */
1363};
1364
1365/*
1366 * RSNN_NN
1367 */
1368struct fcgs_rsnn_nn_req_s {
1369        wwn_t   node_name;      /* Node name */
1370        u8      snn_len;        /* symbolic node name length */
1371        u8      snn[256];       /* symbolic node name */
1372};
1373
1374/*
1375 * RPN_ID
1376 */
1377struct fcgs_rpnid_req_s {
1378        u32     rsvd:8;
1379        u32     port_id:24;
1380        wwn_t   port_name;
1381};
1382
1383/*
1384 * RNN_ID
1385 */
1386struct fcgs_rnnid_req_s {
1387        u32     rsvd:8;
1388        u32     port_id:24;
1389        wwn_t   node_name;
1390};
1391
1392/*
1393 * RCS_ID
1394 */
1395struct fcgs_rcsid_req_s {
1396        u32     rsvd:8;
1397        u32     port_id:24;
1398        u32     cos;
1399};
1400
1401/*
1402 * RPT_ID
1403 */
1404struct fcgs_rptid_req_s {
1405        u32     rsvd:8;
1406        u32     port_id:24;
1407        u32     port_type:8;
1408        u32     rsvd1:24;
1409};
1410
1411/*
1412 * GA_NXT Request
1413 */
1414struct fcgs_ganxt_req_s {
1415        u32     rsvd:8;
1416        u32     port_id:24;
1417};
1418
1419/*
1420 * GA_NXT Response
1421 */
1422struct fcgs_ganxt_rsp_s {
1423        u32             port_type:8;    /* Port Type */
1424        u32             port_id:24;     /* Port Identifier */
1425        wwn_t           port_name;      /* Port Name */
1426        u8              spn_len;        /* Length of Symbolic Port Name */
1427        char            spn[255];       /* Symbolic Port Name */
1428        wwn_t           node_name;      /* Node Name */
1429        u8              snn_len;        /* Length of Symbolic Node Name */
1430        char            snn[255];       /* Symbolic Node Name */
1431        u8              ipa[8];         /* Initial Process Associator */
1432        u8              ip[16];         /* IP Address */
1433        u32             cos;            /* Class of Service */
1434        u32             fc4types[8];    /* FC-4 TYPEs */
1435        wwn_t           fabric_port_name; /* Fabric Port Name */
1436        u32             rsvd:8;         /* Reserved */
1437        u32             hard_addr:24;   /* Hard Address */
1438};
1439
1440/*
1441 * Command codes for Fabric Configuration Server
1442 */
1443enum {
1444        GS_FC_GFN_CMD   = 0x0114,       /* GS FC Get Fabric Name  */
1445        GS_FC_GMAL_CMD  = 0x0116,       /* GS FC GMAL  */
1446        GS_FC_TRACE_CMD = 0x0400,       /* GS FC Trace Route */
1447        GS_FC_PING_CMD  = 0x0401,       /* GS FC Ping */
1448};
1449
1450/*
1451 * GMAL Command ( Get ( interconnect Element) Management Address List)
1452 * To retrieve the IP Address of a Switch.
1453 */
1454#define CT_GMAL_RESP_PREFIX_TELNET       "telnet://"
1455#define CT_GMAL_RESP_PREFIX_HTTP         "http://"
1456
1457/*  GMAL/GFN request */
1458struct fcgs_req_s {
1459        wwn_t    wwn;   /* PWWN/NWWN */
1460};
1461
1462#define fcgs_gmal_req_t struct fcgs_req_s
1463#define fcgs_gfn_req_t struct fcgs_req_s
1464
1465/* Accept Response to GMAL */
1466struct fcgs_gmal_resp_s {
1467        __be32  ms_len;   /* Num of entries */
1468        u8      ms_ma[256];
1469};
1470
1471struct fcgs_gmal_entry_s {
1472        u8  len;
1473        u8  prefix[7]; /* like "http://" */
1474        u8  ip_addr[248];
1475};
1476
1477/*
1478 * FDMI Command Codes
1479 */
1480#define FDMI_GRHL               0x0100
1481#define FDMI_GHAT               0x0101
1482#define FDMI_GRPL               0x0102
1483#define FDMI_GPAT               0x0110
1484#define FDMI_RHBA               0x0200
1485#define FDMI_RHAT               0x0201
1486#define FDMI_RPRT               0x0210
1487#define FDMI_RPA                0x0211
1488#define FDMI_DHBA               0x0300
1489#define FDMI_DPRT               0x0310
1490
1491/*
1492 * FDMI reason codes
1493 */
1494#define FDMI_NO_ADDITIONAL_EXP          0x00
1495#define FDMI_HBA_ALREADY_REG            0x10
1496#define FDMI_HBA_ATTRIB_NOT_REG         0x11
1497#define FDMI_HBA_ATTRIB_MULTIPLE        0x12
1498#define FDMI_HBA_ATTRIB_LENGTH_INVALID  0x13
1499#define FDMI_HBA_ATTRIB_NOT_PRESENT     0x14
1500#define FDMI_PORT_ORIG_NOT_IN_LIST      0x15
1501#define FDMI_PORT_HBA_NOT_IN_LIST       0x16
1502#define FDMI_PORT_ATTRIB_NOT_REG        0x20
1503#define FDMI_PORT_NOT_REG               0x21
1504#define FDMI_PORT_ATTRIB_MULTIPLE       0x22
1505#define FDMI_PORT_ATTRIB_LENGTH_INVALID 0x23
1506#define FDMI_PORT_ALREADY_REGISTEREED   0x24
1507
1508/*
1509 * FDMI Transmission Speed Mask values
1510 */
1511#define FDMI_TRANS_SPEED_1G             0x00000001
1512#define FDMI_TRANS_SPEED_2G             0x00000002
1513#define FDMI_TRANS_SPEED_10G            0x00000004
1514#define FDMI_TRANS_SPEED_4G             0x00000008
1515#define FDMI_TRANS_SPEED_8G             0x00000010
1516#define FDMI_TRANS_SPEED_16G            0x00000020
1517#define FDMI_TRANS_SPEED_UNKNOWN        0x00008000
1518
1519/*
1520 * FDMI HBA attribute types
1521 */
1522enum fdmi_hba_attribute_type {
1523        FDMI_HBA_ATTRIB_NODENAME = 1,   /* 0x0001 */
1524        FDMI_HBA_ATTRIB_MANUFACTURER,   /* 0x0002 */
1525        FDMI_HBA_ATTRIB_SERIALNUM,      /* 0x0003 */
1526        FDMI_HBA_ATTRIB_MODEL,          /* 0x0004 */
1527        FDMI_HBA_ATTRIB_MODEL_DESC,     /* 0x0005 */
1528        FDMI_HBA_ATTRIB_HW_VERSION,     /* 0x0006 */
1529        FDMI_HBA_ATTRIB_DRIVER_VERSION, /* 0x0007 */
1530        FDMI_HBA_ATTRIB_ROM_VERSION,    /* 0x0008 */
1531        FDMI_HBA_ATTRIB_FW_VERSION,     /* 0x0009 */
1532        FDMI_HBA_ATTRIB_OS_NAME,        /* 0x000A */
1533        FDMI_HBA_ATTRIB_MAX_CT,         /* 0x000B */
1534        FDMI_HBA_ATTRIB_NODE_SYM_NAME,  /* 0x000C */
1535        FDMI_HBA_ATTRIB_VENDOR_INFO,    /* 0x000D */
1536        FDMI_HBA_ATTRIB_NUM_PORTS,  /* 0x000E */
1537        FDMI_HBA_ATTRIB_FABRIC_NAME,    /* 0x000F */
1538        FDMI_HBA_ATTRIB_BIOS_VER,   /* 0x0010 */
1539        FDMI_HBA_ATTRIB_VENDOR_ID = 0x00E0,
1540
1541        FDMI_HBA_ATTRIB_MAX_TYPE
1542};
1543
1544/*
1545 * FDMI Port attribute types
1546 */
1547enum fdmi_port_attribute_type {
1548        FDMI_PORT_ATTRIB_FC4_TYPES = 1, /* 0x0001 */
1549        FDMI_PORT_ATTRIB_SUPP_SPEED,    /* 0x0002 */
1550        FDMI_PORT_ATTRIB_PORT_SPEED,    /* 0x0003 */
1551        FDMI_PORT_ATTRIB_FRAME_SIZE,    /* 0x0004 */
1552        FDMI_PORT_ATTRIB_DEV_NAME,      /* 0x0005 */
1553        FDMI_PORT_ATTRIB_HOST_NAME,     /* 0x0006 */
1554        FDMI_PORT_ATTRIB_NODE_NAME,     /* 0x0007 */
1555        FDMI_PORT_ATTRIB_PORT_NAME,     /* 0x0008 */
1556        FDMI_PORT_ATTRIB_PORT_SYM_NAME, /* 0x0009 */
1557        FDMI_PORT_ATTRIB_PORT_TYPE,     /* 0x000A */
1558        FDMI_PORT_ATTRIB_SUPP_COS,      /* 0x000B */
1559        FDMI_PORT_ATTRIB_PORT_FAB_NAME, /* 0x000C */
1560        FDMI_PORT_ATTRIB_PORT_FC4_TYPE, /* 0x000D */
1561        FDMI_PORT_ATTRIB_PORT_STATE = 0x101,    /* 0x0101 */
1562        FDMI_PORT_ATTRIB_PORT_NUM_RPRT = 0x102, /* 0x0102 */
1563
1564        FDMI_PORT_ATTR_MAX_TYPE
1565};
1566
1567/*
1568 * FDMI attribute
1569 */
1570struct fdmi_attr_s {
1571        __be16        type;
1572        __be16        len;
1573        u8         value[1];
1574};
1575
1576/*
1577 * HBA Attribute Block
1578 */
1579struct fdmi_hba_attr_s {
1580        __be32        attr_count;       /* # of attributes */
1581        struct fdmi_attr_s hba_attr;    /* n attributes */
1582};
1583
1584/*
1585 * Registered Port List
1586 */
1587struct fdmi_port_list_s {
1588        __be32          num_ports;      /* number Of Port Entries */
1589        wwn_t           port_entry;     /* one or more */
1590};
1591
1592/*
1593 * Port Attribute Block
1594 */
1595struct fdmi_port_attr_s {
1596        __be32        attr_count;       /* # of attributes */
1597        struct fdmi_attr_s port_attr;   /* n attributes */
1598};
1599
1600/*
1601 * FDMI Register HBA Attributes
1602 */
1603struct fdmi_rhba_s {
1604        wwn_t                   hba_id;         /* HBA Identifier */
1605        struct fdmi_port_list_s port_list;      /* Registered Port List */
1606        struct fdmi_hba_attr_s hba_attr_blk;    /* HBA attribute block */
1607};
1608
1609/*
1610 * FDMI Register Port
1611 */
1612struct fdmi_rprt_s {
1613        wwn_t                   hba_id;         /* HBA Identifier */
1614        wwn_t                   port_name;      /* Port wwn */
1615        struct fdmi_port_attr_s port_attr_blk;  /* Port Attr Block */
1616};
1617
1618/*
1619 * FDMI Register Port Attributes
1620 */
1621struct fdmi_rpa_s {
1622        wwn_t                   port_name;      /* port wwn */
1623        struct fdmi_port_attr_s port_attr_blk;  /* Port Attr Block */
1624};
1625
1626#pragma pack()
1627
1628#endif  /* __BFA_FC_H__ */
1629