1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at
   9  * http://www.opensource.org/licenses/cddl1.txt.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2004-2012 Emulex. All rights reserved.
  24  * Use is subject to license terms.
  25  * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
  26  */
  27 
  28 #ifndef _EMLXS_FCF_H
  29 #define _EMLXS_FCF_H
  30 
  31 #ifdef  __cplusplus
  32 extern "C" {
  33 #endif
  34 
  35 #define FCFTAB_MAX_FCFI_COUNT           1
  36 #define FCFI_MAX_VFI_COUNT              1
  37 
  38 /* Internal generic events */
  39 #define FCF_EVENT_STATE_ENTER           0
  40 
  41 /* External async fabric events */
  42 #define FCF_EVENT_SHUTDOWN              1
  43 #define FCF_EVENT_LINKUP                2
  44 #define FCF_EVENT_LINKDOWN              3
  45 #define FCF_EVENT_CVL                   4
  46 #define FCF_EVENT_FCFTAB_FULL           5
  47 #define FCF_EVENT_FCF_FOUND             6
  48 #define FCF_EVENT_FCF_LOST              7
  49 #define FCF_EVENT_FCF_CHANGED           8
  50 
  51 /* Internal async events */
  52 #define FCF_EVENT_FCFTAB_ONLINE         9
  53 #define FCF_EVENT_FCFTAB_OFFLINE        10
  54 
  55 #define FCF_EVENT_FCFI_ONLINE           11
  56 #define FCF_EVENT_FCFI_OFFLINE          12
  57 #define FCF_EVENT_FCFI_PAUSE            13
  58 
  59 #define FCF_EVENT_VFI_ONLINE            14
  60 #define FCF_EVENT_VFI_OFFLINE           15
  61 #define FCF_EVENT_VFI_PAUSE             16
  62 
  63 #define FCF_EVENT_VPI_ONLINE            17
  64 #define FCF_EVENT_VPI_OFFLINE           18
  65 #define FCF_EVENT_VPI_PAUSE             19
  66 
  67 #define FCF_EVENT_RPI_ONLINE            20
  68 #define FCF_EVENT_RPI_OFFLINE           21
  69 #define FCF_EVENT_RPI_PAUSE             22
  70 #define FCF_EVENT_RPI_RESUME            23
  71 
  72 /* State change reason codes */           /* explan */
  73 #define FCF_REASON_NONE                 0
  74 #define FCF_REASON_REENTER              1
  75 #define FCF_REASON_EVENT                2 /* evt */
  76 #define FCF_REASON_REQUESTED            3
  77 #define FCF_REASON_NO_MBOX              4
  78 #define FCF_REASON_NO_BUFFER            5
  79 #define FCF_REASON_SEND_FAILED          6 /* status */
  80 #define FCF_REASON_MBOX_FAILED          7 /* status */
  81 #define FCF_REASON_MBOX_BUSY            8 /* status */
  82 #define FCF_REASON_NO_FCFI              9
  83 #define FCF_REASON_NO_VFI               10
  84 #define FCF_REASON_ONLINE_FAILED        11
  85 #define FCF_REASON_OFFLINE_FAILED       12
  86 #define FCF_REASON_OP_FAILED            13 /* attempts */
  87 #define FCF_REASON_NO_PKT               14
  88 #define FCF_REASON_NO_NODE              15
  89 #define FCF_REASON_NOT_ALLOWED          16
  90 #define FCF_REASON_UNUSED               17
  91 #define FCF_REASON_INVALID              18
  92 
  93 typedef struct XRIobj
  94 {
  95         struct XRIobj   *_f;
  96         struct XRIobj   *_b;
  97         uint16_t        XRI;
  98         uint16_t        state;
  99 #define XRI_STATE_FREE                  0
 100 #define XRI_STATE_ALLOCATED             1
 101 
 102         uint16_t        sge_count;
 103         uint16_t        iotag;
 104         MATCHMAP        *SGList;
 105         uint32_t        SGSeg;
 106         struct RPIobj   *rpip;
 107         struct RPIobj   *reserved_rpip;
 108         emlxs_buf_t     *sbp;
 109         uint32_t        rx_id; /* Used for unsol exchanges */
 110         uint32_t        flag;
 111 #define EMLXS_XRI_RESERVED              0x00000001
 112 #define EMLXS_XRI_PENDING_IO            0x00000002
 113 #define EMLXS_XRI_BUSY                  0x00000004
 114 
 115         uint32_t        type;
 116 #define EMLXS_XRI_SOL_FCP_TYPE          1
 117 #define EMLXS_XRI_UNSOL_FCP_TYPE        2
 118 #define EMLXS_XRI_SOL_CT_TYPE           3
 119 #define EMLXS_XRI_UNSOL_CT_TYPE         4
 120 #define EMLXS_XRI_SOL_ELS_TYPE          5
 121 #define EMLXS_XRI_UNSOL_ELS_TYPE        6
 122 #define EMLXS_XRI_SOL_BLS_TYPE          7
 123 
 124 } XRIobj_t;
 125 
 126 
 127 typedef struct emlxs_deferred_cmpl
 128 {
 129         struct emlxs_port *port;
 130         struct emlxs_node *node;
 131 
 132         void *arg1;
 133         void *arg2;
 134         void *arg3;
 135 
 136 } emlxs_deferred_cmpl_t;
 137 
 138 
 139 #define FABRIC_RPI              0xffff
 140 
 141 typedef struct RPIobj
 142 {
 143         uint16_t        index;
 144         uint16_t        RPI;
 145 
 146         uint16_t        prev_reason;
 147         uint16_t        prev_state;
 148 
 149         uint16_t        reason;
 150         uint16_t        state;
 151 #define RPI_STATE_FREE                  0
 152 
 153 #define RPI_STATE_RESERVED              1
 154 #define RPI_STATE_OFFLINE               2
 155 
 156 #define RPI_STATE_UNREG_CMPL            3
 157 #define RPI_STATE_UNREG_FAILED          4
 158 #define RPI_STATE_UNREG                 5
 159 
 160 #define RPI_STATE_REG                   6
 161 #define RPI_STATE_REG_FAILED            7
 162 #define RPI_STATE_REG_CMPL              8
 163 
 164 #define RPI_STATE_PAUSED                9
 165 
 166 #define RPI_STATE_RESUME                10
 167 #define RPI_STATE_RESUME_FAILED         11
 168 #define RPI_STATE_RESUME_CMPL           12
 169 
 170 #define RPI_STATE_ONLINE                13
 171 
 172 
 173         uint32_t        flag;
 174 #define EMLXS_RPI_VPI                   0x00000010 /* rpi_online set */
 175 #define EMLXS_RPI_PAUSED                0x00000020 /* rpi_paused set */
 176 #define EMLXS_RPI_REG                   0x00000040
 177 
 178 #define EMLXS_RPI_FIRST                 0x80000000
 179 
 180         uint32_t        attempts;
 181         uint32_t        xri_count;  /* Managed by XRIobj_t */
 182 
 183         uint32_t        idle_timer;
 184 
 185         struct VPIobj   *vpip;
 186 
 187         /* Node info */
 188         struct emlxs_node       *node;
 189         uint32_t        did;
 190         SERV_PARM       sparam;
 191 
 192         emlxs_deferred_cmpl_t *cmpl;
 193 
 194 } RPIobj_t;
 195 
 196 
 197 typedef struct VPIobj
 198 {
 199         uint16_t        index;
 200         uint16_t        VPI;
 201 
 202         uint16_t        prev_reason;
 203         uint16_t        prev_state;
 204 
 205         uint16_t        reason;
 206         uint16_t        state;
 207 #define VPI_STATE_OFFLINE               0
 208 
 209 #define VPI_STATE_INIT                  1
 210 #define VPI_STATE_INIT_FAILED           2
 211 #define VPI_STATE_INIT_CMPL             3
 212 
 213 #define VPI_STATE_UNREG_CMPL            4
 214 #define VPI_STATE_UNREG_FAILED          5
 215 #define VPI_STATE_UNREG                 6
 216 
 217 #define VPI_STATE_LOGO_CMPL             7
 218 #define VPI_STATE_LOGO_FAILED           8
 219 #define VPI_STATE_LOGO                  9
 220 
 221 #define VPI_STATE_PORT_OFFLINE          10
 222 #define VPI_STATE_PORT_ONLINE           11
 223 
 224 #define VPI_STATE_LOGI                  12
 225 #define VPI_STATE_LOGI_FAILED           13
 226 #define VPI_STATE_LOGI_CMPL             14
 227 
 228 #define VPI_STATE_REG                   15
 229 #define VPI_STATE_REG_FAILED            16
 230 #define VPI_STATE_REG_CMPL              17
 231 
 232 #define VPI_STATE_PAUSED                18
 233 #define VPI_STATE_ONLINE                19
 234 
 235 
 236         uint32_t        flag;
 237 #define EMLXS_VPI_ONLINE_REQ            0x00000001
 238 #define EMLXS_VPI_OFFLINE_REQ           0x00000002
 239 #define EMLXS_VPI_PAUSE_REQ             0x00000004
 240 #define EMLXS_VPI_REQ_MASK              0x0000000F
 241 
 242 #define EMLXS_VPI_VFI                   0x00000010 /* vpi_online set */
 243 #define EMLXS_VPI_VFI_LOGI              0x00000020 /* logi_count set */
 244 #define EMLXS_VPI_INIT                  0x00000040
 245 #define EMLXS_VPI_REG                   0x00000080
 246 #define EMLXS_VPI_PORT_ONLINE           0x00000100
 247 #define EMLXS_VPI_LOGI                  0x00000200
 248 #define EMLXS_VPI_PORT_UNBIND           0x40000000
 249 #define EMLXS_VPI_PORT_ENABLED          0x80000000
 250 
 251         uint32_t        attempts;
 252 
 253         RPIobj_t        fabric_rpi;     /* Reserved Fabric RPI object */
 254         RPIobj_t        *fabric_rpip;   /* Fabric RPI pointer (&fabric_rpi) */
 255         RPIobj_t        *p2p_rpip;
 256 
 257         struct emlxs_port *port;
 258 
 259         struct VFIobj   *vfip; /* Managed by VFIobj_t */
 260         uint32_t        rpi_online; /* Managed by RPIobj_t */
 261         uint32_t        rpi_paused; /* Managed by RPIobj_t */
 262 
 263 } VPIobj_t;
 264 
 265 
 266 typedef struct VFIobj
 267 {
 268         uint16_t        index;
 269         uint16_t        VFI;
 270 
 271         uint16_t        prev_reason;
 272         uint16_t        prev_state;
 273 
 274         uint16_t        reason;
 275         uint16_t        state;
 276 #define VFI_STATE_OFFLINE               0
 277 
 278 #define VFI_STATE_INIT                  1
 279 #define VFI_STATE_INIT_FAILED           2
 280 #define VFI_STATE_INIT_CMPL             3
 281 
 282 #define VFI_STATE_VPI_OFFLINE_CMPL      4
 283 #define VFI_STATE_VPI_OFFLINE           5
 284 
 285 #define VFI_STATE_VPI_ONLINE            6
 286 #define VFI_STATE_VPI_ONLINE_CMPL       7
 287 
 288 #define VFI_STATE_UNREG_CMPL            8
 289 #define VFI_STATE_UNREG_FAILED          9
 290 #define VFI_STATE_UNREG                 10
 291 
 292 #define VFI_STATE_REG                   11
 293 #define VFI_STATE_REG_FAILED            12
 294 #define VFI_STATE_REG_CMPL              13
 295 
 296 #define VFI_STATE_PAUSED                14
 297 #define VFI_STATE_ONLINE                15
 298 
 299         uint32_t        flag;
 300 #define EMLXS_VFI_ONLINE_REQ            0x00000001
 301 #define EMLXS_VFI_OFFLINE_REQ           0x00000002
 302 #define EMLXS_VFI_PAUSE_REQ             0x00000004
 303 #define EMLXS_VFI_REQ_MASK              0x0000000F
 304 
 305 #define EMLXS_VFI_FCFI                  0x00000010 /* vfi_online set */
 306 #define EMLXS_VFI_INIT                  0x00000020
 307 #define EMLXS_VFI_REG                   0x00000040
 308 
 309         SERV_PARM       sparam;         /* Last registered sparams */
 310 
 311         uint32_t        attempts;
 312 
 313         struct FCFIobj  *fcfp;          /* Managed by FCFIobj_t */
 314 
 315         uint32_t        vpi_online;     /* Managed by VPIobj_t */
 316         uint32_t        logi_count;     /* Managed by VPIobj_t */
 317         struct VPIobj   *flogi_vpip;    /* Managed by VPIobj_t */
 318 
 319 } VFIobj_t;
 320 
 321 
 322 typedef struct FCFIobj
 323 {
 324         uint16_t        index;
 325         uint16_t        FCFI;
 326 
 327         uint16_t        fcf_index;
 328         uint16_t        vlan_id;
 329 
 330         uint16_t        prev_reason;
 331         uint16_t        prev_state;
 332 
 333         uint16_t        reason;
 334         uint16_t        state;
 335 #define FCFI_STATE_FREE                 0
 336 
 337 #define FCFI_STATE_OFFLINE              1
 338 
 339 #define FCFI_STATE_UNREG_CMPL           2
 340 #define FCFI_STATE_UNREG_FAILED         3
 341 #define FCFI_STATE_UNREG                4
 342 
 343 #define FCFI_STATE_REG                  5
 344 #define FCFI_STATE_REG_FAILED           6
 345 #define FCFI_STATE_REG_CMPL             7
 346 
 347 #define FCFI_STATE_VFI_OFFLINE_CMPL     8
 348 #define FCFI_STATE_VFI_OFFLINE          9
 349 
 350 #define FCFI_STATE_VFI_ONLINE           10
 351 #define FCFI_STATE_VFI_ONLINE_CMPL      11
 352 
 353 #define FCFI_STATE_PAUSED               12
 354 #define FCFI_STATE_ONLINE               13
 355 
 356 
 357         uint16_t        pad;
 358         uint16_t        generation;
 359 
 360         uint32_t        offline_timer;
 361         uint32_t        attempts;
 362 
 363         uint32_t        event_tag;
 364         uint32_t        flag;
 365 #define EMLXS_FCFI_ONLINE_REQ           0x00000001
 366 #define EMLXS_FCFI_OFFLINE_REQ          0x00000002
 367 #define EMLXS_FCFI_PAUSE_REQ            0x00000004
 368 #define EMLXS_FCFI_REQ_MASK             0x0000000F
 369 
 370 #define EMLXS_FCFI_FCFTAB               0x00000010 /* fcfi_online set */
 371 #define EMLXS_FCFI_REG                  0x00000020
 372 
 373 #define EMLXS_FCFI_VALID                0x00000100
 374 #define EMLXS_FCFI_AVAILABLE            0x00000200
 375 #define EMLXS_FCFI_CONFIGURED           0x00000400
 376 #define EMLXS_FCFI_FRESH                0x00000800
 377 #define EMLXS_FCFI_FAILED               0x00001000
 378 #define EMLXS_FCFI_SELECTED             0x00002000 /* in use */
 379 
 380 #define EMLXS_FCFI_VLAN_ID              0x00010000
 381 #define EMLXS_FCFI_BOOT                 0x00020000
 382 #define EMLXS_FCFI_PRIMARY              0x00040000
 383 
 384 #define EMLXS_FCFI_TAGGED               0x80000000
 385 
 386         /* struct VFTable       vftab */
 387 
 388         FCF_RECORD_t    fcf_rec;
 389         uint32_t        priority;
 390 
 391         uint32_t        vfi_online;  /* Managed by VFIobj_t */
 392 
 393 } FCFIobj_t;
 394 
 395 
 396 typedef struct VFTable
 397 {
 398         uint16_t        prev_reason;
 399         uint16_t        prev_state;
 400 
 401         uint16_t        reason;
 402         uint16_t        state;
 403 #define VFTAB_STATE_DISABLED            0
 404 
 405         uint32_t        vfi_active;
 406         uint32_t        vfi_count;
 407         VFIobj_t        *table;
 408 
 409 } VFTable_t;
 410 
 411 typedef struct FCFTable
 412 {
 413 
 414         uint16_t        prev_reason;
 415         uint16_t        prev_state;
 416 
 417         uint16_t        reason;
 418         uint16_t        state;
 419 /* Common states */
 420 #define FCFTAB_STATE_SHUTDOWN                   0
 421 #define FCFTAB_STATE_OFFLINE                    1
 422 
 423 /* FCOE states */
 424 #define FCOE_FCFTAB_STATE_SHUTDOWN              FCFTAB_STATE_SHUTDOWN
 425 #define FCOE_FCFTAB_STATE_OFFLINE               FCFTAB_STATE_OFFLINE
 426 
 427 #define FCOE_FCFTAB_STATE_SOLICIT               2
 428 #define FCOE_FCFTAB_STATE_SOLICIT_FAILED        3
 429 #define FCOE_FCFTAB_STATE_SOLICIT_CMPL          4
 430 
 431 #define FCOE_FCFTAB_STATE_READ                  5
 432 #define FCOE_FCFTAB_STATE_READ_FAILED           6
 433 #define FCOE_FCFTAB_STATE_READ_CMPL             7
 434 
 435 #define FCOE_FCFTAB_STATE_FCFI_OFFLINE_CMPL     8
 436 #define FCOE_FCFTAB_STATE_FCFI_OFFLINE          9
 437 
 438 #define FCOE_FCFTAB_STATE_FCFI_ONLINE           10
 439 #define FCOE_FCFTAB_STATE_FCFI_ONLINE_CMPL      11
 440 
 441 #define FCOE_FCFTAB_STATE_ONLINE                12
 442 
 443 
 444 /* FC states */
 445 #define FC_FCFTAB_STATE_SHUTDOWN                FCFTAB_STATE_SHUTDOWN
 446 #define FC_FCFTAB_STATE_OFFLINE                 FCFTAB_STATE_OFFLINE
 447 
 448 #define FC_FCFTAB_STATE_TOPO                    2
 449 #define FC_FCFTAB_STATE_TOPO_FAILED             3
 450 #define FC_FCFTAB_STATE_TOPO_CMPL               4
 451 
 452 #define FC_FCFTAB_STATE_CFGLINK                 5
 453 #define FC_FCFTAB_STATE_CFGLINK_FAILED          6
 454 #define FC_FCFTAB_STATE_CFGLINK_CMPL            7
 455 
 456 #define FC_FCFTAB_STATE_SPARM                   8
 457 #define FC_FCFTAB_STATE_SPARM_FAILED            9
 458 #define FC_FCFTAB_STATE_SPARM_CMPL              10
 459 
 460 #define FC_FCFTAB_STATE_FCFI_OFFLINE_CMPL       11
 461 #define FC_FCFTAB_STATE_FCFI_OFFLINE            12
 462 
 463 #define FC_FCFTAB_STATE_FCFI_ONLINE             13
 464 #define FC_FCFTAB_STATE_FCFI_ONLINE_CMPL        14
 465 
 466 #define FC_FCFTAB_STATE_ONLINE                  15
 467 
 468 
 469         uint16_t        TID;
 470         uint16_t        generation;
 471 
 472         uint32_t        flag;
 473 /* Common flags */
 474 #define EMLXS_FCFTAB_REQ_MASK                   0x0000000F
 475 #define EMLXS_FCFTAB_SHUTDOWN                   0x80000000
 476 
 477 /* FCOE flags */
 478 #define EMLXS_FCOE_FCFTAB_SOL_REQ               0x00000001
 479 #define EMLXS_FCOE_FCFTAB_READ_REQ              0x00000002
 480 #define EMLXS_FCOE_FCFTAB_OFFLINE_REQ           0x00000004
 481 
 482 /* FC flags */
 483 #define EMLXS_FC_FCFTAB_TOPO_REQ                0x00000001
 484 #define EMLXS_FC_FCFTAB_CFGLINK_REQ             0x00000002
 485 #define EMLXS_FC_FCFTAB_SPARM_REQ               0x00000004
 486 #define EMLXS_FC_FCFTAB_OFFLINE_REQ             0x00000008
 487 
 488         uint32_t        attempts;
 489 
 490         uint32_t        fcfi_online;  /* Managed by FCFIobj_t */
 491 
 492         FCFIobj_t       *fcfi[FCFTAB_MAX_FCFI_COUNT];
 493         uint32_t        fcfi_count;
 494 
 495         FCFIobj_t       *table;
 496         uint16_t        table_count;
 497 
 498         uint32_t        online_timer;   /* FC */
 499 
 500         uint32_t        sol_timer;      /* FCOE */
 501         uint32_t        read_timer;     /* FCOE */
 502 
 503 } FCFTable_t;
 504 #define FCFTAB_READ_ALL         (void*)0xffff
 505 
 506 #ifdef  __cplusplus
 507 }
 508 #endif
 509 
 510 #endif  /* _EMLXS_FCF_H */