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 usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  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) 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 /*
  27  * Copyright 2019, Joyent, Inc.
  28  */
  29 
  30 #ifndef _SYS_IB_EOIB_EIB_IMPL_H
  31 #define _SYS_IB_EOIB_EIB_IMPL_H
  32 
  33 #ifdef __cplusplus
  34 extern "C" {
  35 #endif
  36 
  37 #include <sys/ddi.h>
  38 #include <sys/mac.h>
  39 #include <sys/sunddi.h>
  40 #include <sys/varargs.h>
  41 #include <sys/vlan.h>
  42 #include <sys/ib/ibtl/ibti.h>
  43 #include <sys/ib/ibtl/ibvti.h>
  44 #include <sys/ib/ib_pkt_hdrs.h>
  45 
  46 #include <sys/ib/clients/eoib/fip.h>
  47 #include <sys/ib/clients/eoib/eib.h>
  48 
  49 /*
  50  * Driver specific constants
  51  */
  52 #define EIB_E_SUCCESS                   0
  53 #define EIB_E_FAILURE                   -1
  54 #define EIB_MAX_LINE                    128
  55 #define EIB_MAX_SGL                     59
  56 #define EIB_MAX_POST_MULTIPLE           4
  57 #define EIB_MAX_PAYLOAD_HDR_SZ          160
  58 #define EIB_TX_COPY_THRESH              4096    /* greater than mtu */
  59 #define EIB_MAX_VNICS                   64      /* do not change this */
  60 #define EIB_LOGIN_TIMEOUT_USEC          8000000
  61 #define EIB_RWR_CHUNK_SZ                8
  62 #define EIB_IPHDR_ALIGN_ROOM            32
  63 #define EIB_IP_HDR_ALIGN                2
  64 #define EIB_MAX_RX_PKTS_ONINTR          0x800
  65 #define EIB_MAX_LOGIN_ATTEMPTS          3
  66 #define EIB_MAX_VHUB_TBL_ATTEMPTS       3
  67 #define EIB_MAX_KA_ATTEMPTS             3
  68 #define EIB_MAX_ATTEMPTS                10
  69 #define EIB_DELAY_HALF_SECOND           500000
  70 #define EIB_GRH_SZ                      (sizeof (ib_grh_t))
  71 
  72 /*
  73  * Debug messages
  74  */
  75 #define EIB_MSGS_CRIT           0x01
  76 #define EIB_MSGS_ERR            0x02
  77 #define EIB_MSGS_WARN           0x04
  78 #define EIB_MSGS_DEBUG          0x08
  79 #define EIB_MSGS_ARGS           0x10
  80 #define EIB_MSGS_PKT            0x20
  81 #define EIB_MSGS_VERBOSE        0x40
  82 #define EIB_MSGS_DEFAULT        (EIB_MSGS_CRIT | EIB_MSGS_ERR | EIB_MSGS_WARN)
  83 
  84 #define EIB_LOGSZ_DEFAULT       0x20000
  85 
  86 #define EIB_DPRINTF_CRIT        eib_dprintf_crit
  87 #define EIB_DPRINTF_ERR         eib_dprintf_err
  88 #define EIB_DPRINTF_WARN        eib_dprintf_warn
  89 #ifdef EIB_DEBUG
  90 #define EIB_DPRINTF_DEBUG       eib_dprintf_debug
  91 #define EIB_DPRINTF_ARGS        eib_dprintf_args
  92 #define EIB_DPRINTF_PKT         eib_dprintf_pkt
  93 #define EIB_DPRINTF_VERBOSE     eib_dprintf_verbose
  94 #else
  95 #define EIB_DPRINTF_DEBUG(...)
  96 #define EIB_DPRINTF_ARGS(...)
  97 #define EIB_DPRINTF_PKT(...)
  98 #define EIB_DPRINTF_VERBOSE(...)
  99 #endif
 100 
 101 /*
 102  *  EoIB threads to provide various services
 103  */
 104 #define EIB_EVENTS_HDLR         "eib_events_handler"
 105 #define EIB_RWQES_REFILLER      "eib_rwqes_refiller"
 106 #define EIB_VNIC_CREATOR        "eib_vnic_creator"
 107 #define EIB_TXWQES_MONITOR      "eib_txwqe_monitor"
 108 #define EIB_LSOBUFS_MONITOR     "eib_lsobufs_monitor"
 109 
 110 /*
 111  * Macro for finding the least significant bit set in a 64-bit unsigned int
 112  */
 113 #define EIB_FIND_LSB_SET(val64) eib_setbit_mod67[((-(val64) & (val64)) % 67)]
 114 
 115 /*
 116  * LSO buffers
 117  *
 118  * Under normal circumstances we should never need to use any buffer
 119  * that's larger than MTU.  Unfortunately, IB HCA has limitations
 120  * on the length of SGL that are much smaller than those for regular
 121  * ethernet NICs.  Since the network layer doesn't care to limit the
 122  * number of mblk fragments in any send mp chain, we end up having to
 123  * use these larger buffers occasionally.
 124  */
 125 #define EIB_LSO_MAXLEN                  65536
 126 #define EIB_LSO_BUFSZ                   8192
 127 #define EIB_LSO_NUM_BUFS                1024
 128 #define EIB_LSO_FREE_BUFS_THRESH        (EIB_LSO_NUM_BUFS >> 5)
 129 
 130 typedef struct eib_lsobuf_s {
 131         struct eib_lsobuf_s *lb_next;
 132         uint8_t         *lb_buf;
 133         int             lb_isfree;
 134 } eib_lsobuf_t;
 135 
 136 typedef struct eib_lsobkt_s {
 137         kmutex_t        bk_lock;
 138         kcondvar_t      bk_cv;
 139         uint_t          bk_status;
 140         uint8_t         *bk_mem;
 141         eib_lsobuf_t    *bk_bufl;
 142         eib_lsobuf_t    *bk_free_head;
 143         ibt_mr_hdl_t    bk_mr_hdl;
 144         ibt_lkey_t      bk_lkey;
 145         uint_t          bk_nelem;
 146         uint_t          bk_nfree;
 147 } eib_lsobkt_t;
 148 
 149 #define EIB_LBUF_SHORT          0x1
 150 #define EIB_LBUF_MONITOR_DIE    0x2
 151 
 152 /*
 153  * The admin partition is only used for sending login and logout messages
 154  * and receiving login acknowledgements from the gateway.  While packets
 155  * going out on several vlans at the same time could result in multiple
 156  * vnic creations happening at the same time (and therefore multiple login
 157  * packets), we serialize the vnic creation via the vnic creator thread, so
 158  * we shouldn't need a lot of send wqes or receive wqes.  Note also that we
 159  * keep the cq size request to slightly less than a 2^n boundary to allow
 160  * the alloc cq routine to return the closest 2^n boundary as the real cq
 161  * size without wasting too much memory.
 162  */
 163 #define EIB_ADMIN_MAX_SWQE      30
 164 #define EIB_ADMIN_MAX_RWQE      30
 165 #define EIB_ADMIN_CQ_SIZE       (EIB_ADMIN_MAX_SWQE + EIB_ADMIN_MAX_RWQE + 1)
 166 
 167 /*
 168  * The control qp is per vhub partition, and is used to send and receive
 169  * vhub control messages such as vhub table request/response, vhub
 170  * update response and vnic alive messages.  While the vhub table response
 171  * and vhub update messages might take a few rwqes, the vhub table request
 172  * is made only once per vnic, and the vnic alive message is periodic
 173  * and uses a single swqe as well.  Per vnic, we should certainly not need
 174  * too many swqes/rwqes.
 175  */
 176 #define EIB_CTL_MAX_SWQE        30
 177 #define EIB_CTL_MAX_RWQE        30
 178 #define EIB_CTL_CQ_SIZE         (EIB_CTL_MAX_SWQE + EIB_CTL_MAX_RWQE + 1)
 179 
 180 /*
 181  * For the vNIC's data channel, there are three items that are of importance:
 182  * the constraints defined below, the hca_max_chan_sz attribute and the value of
 183  * (hca_max_cq_sz - 1).  The maximum limit on swqe/rwqe is set to the minimum
 184  * of these three values.
 185  *
 186  * While the total number of RWQEs posted to the data channel of any vNIC will
 187  * not exceed EIB_DATA_MAX_RWQE, we also do not want to acquire and post all of
 188  * it during the data channel initialization, since that is a lot of wqes for
 189  * one vnic to consume when we don't even know if the vnic will need it at all.
 190  * We post an initial set of EIB_DATA_RWQE_BKT rwqes, and slowly post more and
 191  * more sets as we see them being consumed, until we hit the hard limit of
 192  * EIB_DATA_MAX_RWQE.
 193  */
 194 #define EIB_DATA_MAX_SWQE       4000
 195 #define EIB_DATA_MAX_RWQE       4000
 196 #define EIB_DATA_RWQE_BKT       512
 197 
 198 /*
 199  * vNIC data channel CQ moderation parameters
 200  */
 201 #define EIB_TX_COMP_COUNT               10
 202 #define EIB_TX_COMP_USEC                300
 203 #define EIB_RX_COMP_COUNT               4
 204 #define EIB_RX_COMP_USEC                10
 205 
 206 /*
 207  * qe_info masks (blk:ndx:type:flags)
 208  */
 209 #define EIB_WQEBLK_SHIFT                24
 210 #define EIB_WQEBLK_MASK                 0xFF
 211 #define EIB_WQENDX_SHIFT                16
 212 #define EIB_WQENDX_MASK                 0xFF
 213 #define EIB_WQETYP_SHIFT                8
 214 #define EIB_WQETYP_MASK                 0xFF
 215 #define EIB_WQEFLGS_SHIFT               0
 216 #define EIB_WQEFLGS_MASK                0xFF
 217 
 218 /*
 219  * Macros to get the bit fields from qe_info
 220  */
 221 #define EIB_WQE_BLK(info)       (((info) >> EIB_WQEBLK_SHIFT) & EIB_WQEBLK_MASK)
 222 #define EIB_WQE_NDX(info)       (((info) >> EIB_WQENDX_SHIFT) & EIB_WQENDX_MASK)
 223 #define EIB_WQE_TYPE(info)      (((info) >> EIB_WQETYP_SHIFT) & EIB_WQETYP_MASK)
 224 #define EIB_WQE_FLAGS(info)     ((info) & EIB_WQEFLGS_MASK)
 225 
 226 /*
 227  * Values for type and flags in qe_info
 228  */
 229 #define EIB_WQE_TX                      0x1
 230 #define EIB_WQE_RX                      0x2
 231 
 232 /*
 233  * Flags for rx wqes/buffers
 234  */
 235 #define EIB_WQE_FLG_POSTED_TO_HCA       0x1
 236 #define EIB_WQE_FLG_WITH_NW             0x2
 237 
 238 /*
 239  * Flags for tx wqes/buffers
 240  */
 241 #define EIB_WQE_FLG_BUFTYPE_LSO         0x4
 242 #define EIB_WQE_FLG_BUFTYPE_MAPPED      0x8
 243 
 244 /*
 245  * Send/Recv workq entries
 246  */
 247 typedef struct eib_wqe_s {
 248         struct eib_wqe_pool_s   *qe_pool;
 249         uint8_t                 *qe_cpbuf;
 250         uint8_t                 *qe_payload_hdr;
 251         uint_t                  qe_bufsz;
 252         uint_t                  qe_info;
 253         int                     qe_vnic_inst;
 254         ibt_ud_dest_hdl_t       qe_dest;
 255         frtn_t                  qe_frp;
 256 
 257         mblk_t                  *qe_mp;
 258         ibt_mi_hdl_t            qe_iov_hdl;
 259         ibt_all_wr_t            qe_wr;
 260         ibt_wr_ds_t             qe_sgl;
 261         ibt_wr_ds_t             qe_big_sgl[EIB_MAX_SGL];
 262         struct eib_wqe_s        *qe_nxt_post;
 263         struct eib_chan_s       *qe_chan;
 264 } eib_wqe_t;
 265 
 266 /*
 267  * The wqe in-use/free status in EoIB is managed via a 2-level bitmap
 268  * logic.
 269  *
 270  * Each set of 64 wqes (a "wqe block") is managed by a single 64-bit
 271  * integer bitmap.  The free status of a set of 64 such wqe blocks (a
 272  * "wqe pool") is managed by one 64-bit integer bitmap (if any wqe in
 273  * the wqe block is free, the bit in the map is 1, otherwise it is 0).
 274  *
 275  * The maximum pool size is 4096 wqes, but this can easily be extended
 276  * to support more wqes using additional pools of wqes.
 277  *
 278  * Note that an entire pool of wqes is allocated via a single allocation,
 279  * the wqe addresses in a pool are all contiguous.  The tx/rx copy buffers
 280  * for a wqe pool are also allocated via a single allocation.
 281  */
 282 #define EIB_BLKS_PER_POOL       64
 283 #define EIB_WQES_PER_BLK        64      /* do not change this */
 284 #define EIB_WQES_PER_POOL       (EIB_BLKS_PER_POOL * EIB_WQES_PER_BLK)
 285 
 286 #define EIB_WQE_SZ              (sizeof (eib_wqe_t))
 287 #define EIB_WQEBLK_SZ           (EIB_WQES_PER_BLK * EIB_WQE_SZ)
 288 
 289 typedef struct eib_wqe_pool_s {
 290         struct eib_wqe_pool_s   *wp_next;
 291         struct eib_s            *wp_ss;
 292         ib_vaddr_t              wp_vaddr;
 293         ib_memlen_t             wp_memsz;
 294         ibt_mr_hdl_t            wp_mr;
 295         ibt_lkey_t              wp_lkey;
 296         uint_t                  wp_nfree_lwm;
 297         int                     wp_type;
 298 
 299         kmutex_t                wp_lock;
 300         kcondvar_t              wp_cv;
 301         uint_t                  wp_status;
 302         uint_t                  wp_nfree;
 303         uint64_t                wp_free_blks;
 304         uint64_t                wp_free_wqes[EIB_BLKS_PER_POOL];
 305         struct eib_wqe_s        *wp_wqe;
 306 } eib_wqe_pool_t;
 307 
 308 /*
 309  * Values for wp_type
 310  */
 311 #define EIB_WP_TYPE_TX          0x1
 312 #define EIB_WP_TYPE_RX          0x2
 313 
 314 /*
 315  * Values for wp_status (bit fields)
 316  */
 317 #define EIB_TXWQE_SHORT         0x1     /* only for tx wqe pool */
 318 #define EIB_TXWQE_MONITOR_DIE   0x2     /* only for tx wqe pool */
 319 
 320 #define EIB_RXWQE_SHORT         0x1     /* only for rx wqe pool */
 321 
 322 /*
 323  * The low-water-mark is an indication of when wqe grabs for low-priority
 324  * qps should start to get refused (swqe grabs for control messages such
 325  * as keepalives and rwqe grabs for posting back to control qps will still
 326  * be allowed).  The high-water-mark is an indication of when normal
 327  * behavior should resume.
 328  */
 329 #define EIB_NFREE_SWQES_LWM     (EIB_WQES_PER_POOL / 64)        /* 1/64 */
 330 #define EIB_NFREE_SWQES_HWM     (EIB_WQES_PER_POOL / 32)        /* 1/32 */
 331 #define EIB_NFREE_RWQES_LWM     (EIB_WQES_PER_POOL / 10)        /* 10% */
 332 #define EIB_NFREE_RWQES_HWM     (EIB_WQES_PER_POOL / 5)         /* 20% */
 333 
 334 /*
 335  * The "rwqes low" is used to determine when we should start using allocb()
 336  * to copy and send received mblks in the rx path.  It should be a little
 337  * above the rwqes low-water-mark, but less than the high-water-mark.
 338  */
 339 #define EIB_NFREE_RWQES_LOW     \
 340         ((EIB_NFREE_RWQES_LWM + EIB_NFREE_RWQES_HWM) / 2)
 341 
 342 #define EIB_WPRI_HI             1       /* for keepalive posts */
 343 #define EIB_WPRI_LO             2       /* for all other posts */
 344 
 345 /*
 346  * Multicast GID Layout: the multicast gid is specified in big-endian
 347  * representation, as a collection of different-sized fields in the
 348  * EoIB specification.  On Solaris, the multicast gid is represented
 349  * as a collection of two 8-byte fields (in ib_gid_t).
 350  */
 351 typedef struct eib_mgid_spec_s {
 352         uint8_t                 sp_mgid_prefix[FIP_MGID_PREFIX_LEN];
 353         uint8_t                 sp_type;
 354         uint8_t                 sp_dmac[ETHERADDRL];
 355         uint8_t                 sp_rss_hash;
 356         uint8_t                 sp_vhub_id[FIP_VHUBID_LEN];
 357 } eib_mgid_spec_t;
 358 
 359 /*
 360  * Values for sp_type in mgid as per EoIB specification
 361  */
 362 #define EIB_MGID_VHUB_DATA      0x0
 363 #define EIB_MGID_VHUB_UPDATE    0x2
 364 #define EIB_MGID_VHUB_TABLE     0x3
 365 
 366 typedef union eib_mgid_s {
 367         eib_mgid_spec_t         gd_spec;
 368         ib_gid_t                gd_sol;
 369 } eib_mgid_t;
 370 
 371 /*
 372  * Gateway properties handed over to us by the EoIB nexus
 373  */
 374 typedef struct eib_gw_props_s {
 375         kmutex_t                pp_gw_lock;
 376 
 377         ib_guid_t               pp_gw_system_guid;
 378         ib_guid_t               pp_gw_guid;
 379         ib_sn_prefix_t          pp_gw_sn_prefix;
 380 
 381         uint_t                  pp_gw_adv_period;
 382         uint_t                  pp_gw_ka_period;
 383         uint_t                  pp_vnic_ka_period;
 384 
 385         ib_qpn_t                pp_gw_ctrl_qpn;
 386         ib_lid_t                pp_gw_lid;
 387         uint16_t                pp_gw_portid;
 388 
 389         uint16_t                pp_gw_num_net_vnics;
 390         uint8_t                 pp_gw_flag_available;
 391         uint8_t                 pp_gw_is_host_adm_vnics;
 392         uint8_t                 pp_gw_sl;
 393         uint8_t                 pp_gw_n_rss_qpn;
 394 
 395         uint8_t                 *pp_gw_system_name;
 396         uint8_t                 *pp_gw_port_name;
 397         uint8_t                 *pp_gw_vendor_id;
 398 
 399         clock_t                 pp_gw_ka_ticks;         /* 2.5 x gw_ka_period */
 400         clock_t                 pp_vnic_ka_ticks;       /* vnic_ka_period */
 401 } eib_gw_props_t;
 402 
 403 /*
 404  * Port-specific properties
 405  */
 406 typedef struct eib_props_s {
 407         uint64_t                ep_ifspeed;
 408         ib_guid_t               ep_hca_guid;
 409         uint8_t                 ep_port_num;
 410         ib_gid_t                ep_sgid;
 411         ib_lid_t                ep_blid;
 412         uint16_t                ep_mtu;
 413         ibt_srate_t             ep_srate;
 414 } eib_props_t;
 415 
 416 /*
 417  * Capabilities derived from HCA attributes
 418  */
 419 typedef struct eib_caps_s {
 420         uint_t                  cp_lso_maxlen;
 421         uint32_t                cp_cksum_flags;
 422         int                     cp_resv_lkey_capab;
 423         ibt_lkey_t              cp_resv_lkey;
 424 
 425         uint_t                  cp_max_swqe;
 426         uint_t                  cp_max_rwqe;
 427         uint_t                  cp_max_sgl;
 428         uint_t                  cp_hiwm_sgl;
 429 } eib_caps_t;
 430 
 431 /*
 432  * List of multicast groups the vnic joined
 433  */
 434 typedef struct eib_mcg_s {
 435         struct eib_mcg_s        *mg_next;
 436         ib_gid_t                mg_rgid;
 437         ib_gid_t                mg_mgid;
 438         uint8_t                 mg_join_state;
 439         uint8_t                 mg_mac[ETHERADDRL];
 440         ibt_mcg_info_t          *mg_mcginfo;
 441 } eib_mcg_t;
 442 
 443 /*
 444  * Admin/control/data channel information
 445  */
 446 typedef struct eib_chan_s {
 447         ibt_channel_hdl_t       ch_chan;
 448         ib_qpn_t                ch_qpn;
 449 
 450         ibt_wc_t                *ch_wc;
 451         ibt_cq_hdl_t            ch_cq_hdl;
 452         uint_t                  ch_cq_sz;
 453 
 454         ibt_wc_t                *ch_rcv_wc;
 455         ibt_cq_hdl_t            ch_rcv_cq_hdl;
 456         uint_t                  ch_rcv_cq_sz;
 457 
 458         int                     ch_vnic_inst;
 459         uint_t                  ch_max_swqes;
 460         uint_t                  ch_max_rwqes;
 461         uint_t                  ch_lwm_rwqes;
 462         uint_t                  ch_rwqe_bktsz;
 463         uint_t                  ch_ip_hdr_align;
 464         boolean_t               ch_alloc_mp;
 465         boolean_t               ch_tear_down;
 466 
 467         kmutex_t                ch_pkey_lock;
 468         ib_pkey_t               ch_pkey;
 469         uint16_t                ch_pkey_ix;
 470 
 471         kmutex_t                ch_cep_lock;
 472         kcondvar_t              ch_cep_cv;
 473         ibt_cep_state_t         ch_cep_state;
 474 
 475         kmutex_t                ch_tx_lock;
 476         kcondvar_t              ch_tx_cv;
 477         uint_t                  ch_tx_posted;
 478         boolean_t               ch_tx_busy;
 479         struct eib_wqe_s        *ch_tx;
 480         struct eib_wqe_s        *ch_tx_tail;
 481 
 482         kmutex_t                ch_rx_lock;
 483         kcondvar_t              ch_rx_cv;
 484         uint_t                  ch_rx_posted;
 485         boolean_t               ch_rx_refilling;
 486 
 487         kmutex_t                ch_vhub_lock;
 488         struct eib_mcg_s        *ch_vhub_table;
 489         struct eib_mcg_s        *ch_vhub_update;
 490         struct eib_mcg_s        *ch_vhub_data;
 491 
 492         struct eib_chan_s       *ch_rxpost_next;
 493 } eib_chan_t;
 494 
 495 /*
 496  * States for vNIC state machine during login
 497  */
 498 #define EIB_LOGIN_INIT          0
 499 #define EIB_LOGIN_ACK_WAIT      1
 500 #define EIB_LOGIN_ACK_RCVD      2
 501 #define EIB_LOGIN_NACK_RCVD     3
 502 #define EIB_LOGIN_TBL_WAIT      4
 503 #define EIB_LOGIN_TBL_INPROG    5
 504 #define EIB_LOGIN_TBL_DONE      6
 505 #define EIB_LOGIN_TBL_FAILED    7
 506 #define EIB_LOGIN_DONE          8
 507 #define EIB_LOGIN_TIMED_OUT     9
 508 #define EIB_LOGOUT_DONE         10
 509 
 510 typedef struct eib_login_data_s {
 511         ib_guid_t               ld_gw_guid;
 512         ib_lid_t                ld_gw_lid;
 513         uint_t                  ld_syndrome;
 514         uint16_t                ld_gw_port_id;
 515         ib_qpn_t                ld_gw_data_qpn;
 516         ib_qpn_t                ld_gw_ctl_qpn;
 517         uint16_t                ld_vnic_id;     /* includes set msbit */
 518         uint16_t                ld_vhub_mtu;
 519         uint16_t                ld_vhub_pkey;
 520         uint16_t                ld_assigned_vlan;
 521         uint8_t                 ld_gw_sl;
 522         uint8_t                 ld_n_rss_mcgid;
 523         uint8_t                 ld_n_mac_mcgid;
 524         uint8_t                 ld_vnic_name[FIP_VNIC_NAME_LEN];
 525         uint8_t                 ld_assigned_mac[ETHERADDRL];
 526         uint8_t                 ld_gw_mgid_prefix[FIP_MGID_PREFIX_LEN];
 527         uint8_t                 ld_vlan_in_packets;
 528         uint32_t                ld_vhub_id;
 529 } eib_login_data_t;
 530 
 531 #define EIB_UNICAST_MAC(mac)            (((mac)[0] & 0x01) == 0)
 532 
 533 /*
 534  * Map to translate between DMAC and {qpn, lid, sl}
 535  */
 536 typedef struct eib_vhub_map_s {
 537         struct eib_vhub_map_s   *mp_next;
 538         uint32_t                mp_tusn;
 539         ib_qpn_t                mp_qpn;
 540         ib_lid_t                mp_lid;
 541         uint8_t                 mp_mac[ETHERADDRL];
 542         uint8_t                 mp_sl;
 543         uint8_t                 mp_v_rss_type;
 544 } eib_vhub_map_t;
 545 
 546 /*
 547  * Per-vNIC vHUB Table
 548  */
 549 #define EIB_TB_NBUCKETS         13
 550 typedef struct eib_vhub_table_s {
 551         kmutex_t                tb_lock;
 552         struct eib_vhub_map_s   *tb_gateway;
 553         struct eib_vhub_map_s   *tb_unicast_miss;
 554         struct eib_vhub_map_s   *tb_vhub_multicast;
 555         struct eib_vhub_map_s   *tb_vnic_entry[EIB_TB_NBUCKETS];
 556         struct eib_vhub_map_s   *tb_mcast_entry[EIB_TB_NBUCKETS];
 557 
 558         uint32_t                tb_tusn;
 559         uint8_t                 tb_eport_state;
 560 
 561         uint16_t                tb_entries_seen;
 562         uint16_t                tb_entries_in_table;
 563         uint32_t                tb_checksum;
 564 } eib_vhub_table_t;
 565 
 566 typedef struct eib_vhub_update_s {
 567         kmutex_t                up_lock;
 568         eib_vhub_map_t          *up_vnic_entry;
 569         uint32_t                up_tusn;
 570         uint8_t                 up_eport_state;
 571 } eib_vhub_update_t;
 572 
 573 typedef struct eib_ether_hdr_s {
 574         int                     eh_tagless;
 575         uint16_t                eh_ether_type;
 576         uint16_t                eh_vlan;
 577         uint8_t                 eh_dmac[ETHERADDRL];
 578         uint8_t                 eh_smac[ETHERADDRL];
 579 } eib_ether_hdr_t;
 580 
 581 /*
 582  * vNIC Information
 583  */
 584 typedef struct eib_vnic_s {
 585         struct eib_s            *vn_ss;
 586         eib_chan_t              *vn_ctl_chan;
 587         eib_chan_t              *vn_data_chan;
 588         int                     vn_instance;
 589         uint16_t                vn_vlan;
 590         uint16_t                vn_id;
 591         uint8_t                 vn_macaddr[ETHERADDRL];
 592         struct eib_login_data_s vn_login_data;
 593 
 594         kmutex_t                vn_lock;
 595         kcondvar_t              vn_cv;
 596         uint_t                  vn_state;
 597         struct eib_vhub_table_s *vn_vhub_table;
 598         struct eib_vhub_update_s *vn_vhub_update;
 599 
 600         ddi_softint_handle_t    vn_ctl_si_hdl;
 601         ddi_softint_handle_t    vn_data_tx_si_hdl;
 602         ddi_softint_handle_t    vn_data_rx_si_hdl;
 603 } eib_vnic_t;
 604 
 605 
 606 /*
 607  * Base NIC's mac state flags. The lock protects the starting/stopping
 608  * bits.  Access to the rest of the mac state is protected by these
 609  * two bits.
 610  */
 611 #define EIB_NIC_STARTING        0x01
 612 #define EIB_NIC_STOPPING        0x02
 613 #define EIB_NIC_STARTED         0x80
 614 #define EIB_NIC_RESTARTING      (EIB_NIC_STARTING | EIB_NIC_STOPPING)
 615 
 616 typedef struct eib_node_state_s {
 617         kmutex_t                ns_lock;
 618         kcondvar_t              ns_cv;
 619         uint_t                  ns_nic_state;
 620         link_state_t            ns_link_state;
 621 } eib_node_state_t;
 622 
 623 /*
 624  * MIB-II statistics to report to the mac layer
 625  */
 626 typedef struct eib_stats_s {
 627         uint64_t                st_obytes;      /* bytes sent out */
 628         uint64_t                st_opkts;       /* pkts sent out */
 629         uint64_t                st_brdcstxmit;  /* broadcast pkts transmitted */
 630         uint64_t                st_multixmit;   /* multicast pkts transmitted */
 631         uint64_t                st_oerrors;     /* transmit errors */
 632         uint64_t                st_noxmitbuf;   /* transmit pkts discarded */
 633 
 634         uint64_t                st_rbytes;      /* bytes received */
 635         uint64_t                st_ipkts;       /* pkts received */
 636         uint64_t                st_brdcstrcv;   /* broadcast pkts received */
 637         uint64_t                st_multircv;    /* multicast pkts received */
 638         uint64_t                st_ierrors;     /* receive errors */
 639         uint64_t                st_norcvbuf;    /* receive pkts discarded */
 640 } eib_stats_t;
 641 
 642 #define EIB_UPDATE_COUNTER(addr, val)   (atomic_add_64((addr), (val)))
 643 #define EIB_INCR_COUNTER(addr)          (atomic_inc_64((addr)))
 644 #define EIB_DECR_COUNTER(addr)          (atomic_dec_64((addr)))
 645 
 646 /*
 647  * Cache of address vectors with dlid as the key. Currently we use
 648  * eib state structure's  ei_lock to protect the individual address
 649  * vector's fields.  This is a lock granularity that's slightly
 650  * bigger than ideal, but it should do for now.
 651  */
 652 #define EIB_AV_NBUCKETS         17
 653 typedef struct eib_avect_s {
 654         struct eib_avect_s      *av_next;
 655         ibt_adds_vect_t         av_vect;
 656         uint_t                  av_ref;
 657 } eib_avect_t;
 658 
 659 /*
 660  * vNIC creation and deletion are serialized by a non-zero value
 661  * to the ei_vnic_state member (i.e. only one vnic may be created
 662  * or deleted at a time). The code makes sure to access/update
 663  * the ei_active_vnics member only after a successful setting of
 664  * ei_vnic_state.
 665  */
 666 #define EIB_VN_BEING_CREATED    0x01
 667 #define EIB_VN_BEING_DELETED    0x02
 668 #define EIB_VN_BEING_MODIFIED   (EIB_VN_BEING_CREATED | EIB_VN_BEING_DELETED)
 669 
 670 /*
 671  * All possible EoIB event work items that need to be handled
 672  */
 673 #define EIB_EV_NONE             0
 674 #define EIB_EV_PORT_DOWN        1
 675 #define EIB_EV_PORT_UP          2
 676 #define EIB_EV_PKEY_CHANGE      3
 677 #define EIB_EV_SGID_CHANGE      4
 678 #define EIB_EV_CLNT_REREG       5
 679 #define EIB_EV_GW_EPORT_DOWN    6
 680 #define EIB_EV_GW_DOWN          7
 681 #define EIB_EV_GW_UP            8
 682 #define EIB_EV_GW_INFO_UPDATE   9
 683 #define EIB_EV_MCG_DELETED      10
 684 #define EIB_EV_MCG_CREATED      11
 685 #define EIB_EV_SHUTDOWN         12
 686 
 687 typedef struct eib_event_s {
 688         struct eib_event_s      *ev_next;
 689         uint_t                  ev_code;
 690         void                    *ev_arg;
 691 } eib_event_t;
 692 
 693 /*
 694  * Work element for new vnic creation
 695  */
 696 typedef struct eib_vnic_req_s {
 697         struct eib_vnic_req_s   *vr_next;
 698         uint_t                  vr_req;
 699         uint8_t                 vr_mac[ETHERADDRL];
 700         uint16_t                vr_vlan;
 701 } eib_vnic_req_t;
 702 
 703 /*
 704  * Values for vr_req
 705  */
 706 #define EIB_CR_REQ_NEW_VNIC     1
 707 #define EIB_CR_REQ_FLUSH        2
 708 #define EIB_CR_REQ_DIE          3
 709 
 710 /*
 711  * Work element for vnics kept alive by the keepalive manager thread
 712  * and bitfield values for ei_ka_vnics_event.
 713  */
 714 typedef struct eib_ka_vnics_s {
 715         struct eib_ka_vnics_s   *ka_next;
 716         struct eib_vnic_s       *ka_vnic;
 717 } eib_ka_vnics_t;
 718 
 719 #define EIB_KA_VNICS_DIE        0x1
 720 #define EIB_KA_VNICS_TIMED_OUT  0x2
 721 
 722 /*
 723  * EoIB per-instance state
 724  */
 725 typedef struct eib_s {
 726         ibt_clnt_hdl_t          ei_ibt_hdl;
 727         ibt_hca_hdl_t           ei_hca_hdl;
 728         ibt_pd_hdl_t            ei_pd_hdl;
 729         mac_handle_t            ei_mac_hdl;
 730 
 731         ddi_softint_handle_t    ei_admin_si_hdl;
 732         ddi_callback_id_t       ei_login_ack_cb;
 733         ddi_callback_id_t       ei_gw_alive_cb;
 734         ddi_callback_id_t       ei_gw_info_cb;
 735 
 736         ibt_hca_attr_t          *ei_hca_attrs;
 737         dev_info_t              *ei_dip;
 738         uint_t                  ei_instance;
 739 
 740         struct eib_gw_props_s   *ei_gw_props;
 741         struct eib_props_s      *ei_props;
 742         struct eib_caps_s       *ei_caps;
 743         struct eib_stats_s      *ei_stats;
 744 
 745         struct eib_node_state_s *ei_node_state;
 746         struct eib_chan_s       *ei_admin_chan;
 747 
 748         struct eib_wqe_pool_s   *ei_tx;
 749         struct eib_wqe_pool_s   *ei_rx;
 750         struct eib_lsobkt_s     *ei_lso;
 751 
 752         kmutex_t                ei_vnic_lock;
 753         kcondvar_t              ei_vnic_cv;
 754         uint_t                  ei_vnic_state;
 755         uint64_t                ei_active_vnics;
 756         uint64_t                ei_zombie_vnics;
 757         uint64_t                ei_rejoin_vnics;
 758         struct eib_vnic_s       *ei_vnic[EIB_MAX_VNICS];
 759         struct eib_vnic_s       *ei_vnic_pending;
 760         int64_t                 ei_gw_last_heartbeat;
 761         boolean_t               ei_gw_unreachable;
 762         uint8_t                 ei_gw_eport_state;
 763 
 764         kmutex_t                ei_av_lock;
 765         struct eib_avect_s      *ei_av[EIB_AV_NBUCKETS];
 766 
 767         kmutex_t                ei_ev_lock;
 768         kcondvar_t              ei_ev_cv;
 769         struct eib_event_s      *ei_event;
 770 
 771         kmutex_t                ei_rxpost_lock;
 772         kcondvar_t              ei_rxpost_cv;
 773         uint_t                  ei_rxpost_die;
 774         struct eib_chan_s       *ei_rxpost;
 775 
 776         kmutex_t                ei_vnic_req_lock;
 777         kcondvar_t              ei_vnic_req_cv;
 778         struct eib_vnic_req_s   *ei_vnic_req;
 779         struct eib_vnic_req_s   *ei_failed_vnic_req;
 780         struct eib_vnic_req_s   *ei_pending_vnic_req;
 781 
 782         kmutex_t                ei_ka_vnics_lock;
 783         kcondvar_t              ei_ka_vnics_cv;
 784         uint_t                  ei_ka_vnics_event;
 785         struct eib_ka_vnics_s   *ei_ka_vnics;
 786 
 787         kt_did_t                ei_txwqe_monitor;
 788         kt_did_t                ei_lsobufs_monitor;
 789         kt_did_t                ei_rwqes_refiller;
 790         kt_did_t                ei_vnic_creator;
 791         kt_did_t                ei_events_handler;
 792         kt_did_t                ei_keepalives_manager;
 793 } eib_t;
 794 
 795 /*
 796  * Private read-only datalink properties
 797  */
 798 #define EIB_DLPROP_GW_EPORT_STATE       "_eib_eport_state"
 799 #define EIB_DLPROP_HCA_GUID             "_eib_hca_guid"
 800 #define EIB_DLPROP_PORT_GUID            "_eib_port_guid"
 801 
 802 /*
 803  * FUNCTION PROTOTYPES FOR CROSS-FILE LINKAGE
 804  */
 805 
 806 /*
 807  * FIP protocol related
 808  */
 809 extern int eib_fip_login(eib_t *, eib_vnic_t *, int *);
 810 extern int eib_fip_heartbeat(eib_t *, eib_vnic_t *, int *);
 811 extern int eib_fip_vhub_table(eib_t *, eib_vnic_t *, int *);
 812 extern int eib_fip_logout(eib_t *, eib_vnic_t *, int *);
 813 extern int eib_fip_parse_login_ack(eib_t *, uint8_t *, eib_login_data_t *);
 814 extern int eib_fip_parse_ctl_pkt(uint8_t *, eib_vnic_t *);
 815 
 816 /*
 817  * Service threads and other handlers
 818  */
 819 extern void eib_events_handler(eib_t *);
 820 extern void eib_svc_enqueue_event(eib_t *, eib_event_t *);
 821 extern void eib_refill_rwqes(eib_t *);
 822 extern void eib_vnic_creator(eib_t *);
 823 extern void eib_monitor_tx_wqes(eib_t *);
 824 extern void eib_monitor_lso_bufs(eib_t *);
 825 extern void eib_manage_keepalives(eib_t *);
 826 extern void eib_stop_events_handler(eib_t *);
 827 extern void eib_stop_refill_rwqes(eib_t *);
 828 extern void eib_stop_vnic_creator(eib_t *);
 829 extern void eib_stop_monitor_tx_wqes(eib_t *);
 830 extern int eib_stop_monitor_lso_bufs(eib_t *, boolean_t);
 831 extern void eib_stop_manage_keepalives(eib_t *);
 832 extern void eib_flush_vnic_reqs(eib_t *);
 833 extern void eib_gw_info_cb(dev_info_t *, ddi_eventcookie_t, void *, void *);
 834 extern void eib_gw_alive_cb(dev_info_t *, ddi_eventcookie_t, void *, void *);
 835 extern void eib_login_ack_cb(dev_info_t *, ddi_eventcookie_t, void *, void *);
 836 
 837 /*
 838  * Admin QP related
 839  */
 840 extern int eib_adm_setup_qp(eib_t *, int *);
 841 extern uint_t eib_adm_comp_handler(caddr_t, caddr_t);
 842 extern void eib_rb_adm_setup_qp(eib_t *);
 843 
 844 /*
 845  * Control QP related
 846  */
 847 extern int eib_ctl_create_qp(eib_t *, eib_vnic_t *, int *);
 848 extern uint_t eib_ctl_comp_handler(caddr_t, caddr_t);
 849 extern void eib_rb_ctl_create_qp(eib_t *, eib_vnic_t *);
 850 
 851 /*
 852  * Data QP related
 853  */
 854 extern int eib_data_create_qp(eib_t *, eib_vnic_t *, int *);
 855 extern uint_t eib_data_rx_comp_handler(caddr_t, caddr_t);
 856 extern uint_t eib_data_tx_comp_handler(caddr_t, caddr_t);
 857 extern void eib_data_rx_recycle(caddr_t);
 858 extern void eib_data_post_tx(eib_vnic_t *, eib_wqe_t *);
 859 extern void eib_data_parse_ether_hdr(mblk_t *, eib_ether_hdr_t *);
 860 extern int eib_data_lookup_vnic(eib_t *, uint8_t *, uint16_t, eib_vnic_t **,
 861     boolean_t *);
 862 extern int eib_data_prepare_frame(eib_vnic_t *, eib_wqe_t *, mblk_t *,
 863     eib_ether_hdr_t *);
 864 extern void eib_rb_data_create_qp(eib_t *, eib_vnic_t *);
 865 
 866 /*
 867  * Resource related
 868  */
 869 extern int eib_rsrc_setup_bufs(eib_t *, int *);
 870 extern int eib_rsrc_grab_swqes(eib_t *, eib_wqe_t **, uint_t, uint_t *, int);
 871 extern int eib_rsrc_grab_rwqes(eib_t *, eib_wqe_t **, uint_t, uint_t *, int);
 872 extern int eib_rsrc_grab_lsobufs(eib_t *, uint_t, ibt_wr_ds_t *, uint32_t *);
 873 extern eib_wqe_t *eib_rsrc_grab_swqe(eib_t *, int);
 874 extern eib_wqe_t *eib_rsrc_grab_rwqe(eib_t *, int);
 875 extern void eib_rsrc_return_swqe(eib_t *, eib_wqe_t *, eib_chan_t *);
 876 extern void eib_rsrc_return_rwqe(eib_t *, eib_wqe_t *, eib_chan_t *);
 877 extern void eib_rsrc_return_lsobufs(eib_t *, ibt_wr_ds_t *, uint32_t);
 878 extern void eib_rsrc_decr_posted_swqe(eib_t *, eib_chan_t *);
 879 extern void eib_rsrc_decr_posted_rwqe(eib_t *, eib_chan_t *);
 880 extern void eib_rsrc_txwqes_needed(eib_t *);
 881 extern void eib_rsrc_lsobufs_needed(eib_t *);
 882 extern boolean_t eib_rsrc_rxpool_low(eib_wqe_t *);
 883 extern void eib_rb_rsrc_setup_bufs(eib_t *, boolean_t);
 884 
 885 /*
 886  * IBT related
 887  */
 888 extern int eib_ibt_hca_init(eib_t *);
 889 extern void eib_ibt_link_mod(eib_t *);
 890 extern int eib_ibt_modify_chan_pkey(eib_t *, eib_chan_t *, ib_pkey_t);
 891 extern eib_avect_t *eib_ibt_hold_avect(eib_t *, ib_lid_t, uint8_t);
 892 extern void eib_ibt_release_avect(eib_t *, eib_avect_t *);
 893 extern void eib_ibt_free_avects(eib_t *);
 894 extern void eib_ibt_async_handler(void *, ibt_hca_hdl_t, ibt_async_code_t,
 895     ibt_async_event_t *);
 896 extern void eib_ibt_record_capab(eib_t *, ibt_hca_attr_t *, eib_caps_t *);
 897 extern void eib_rb_ibt_hca_init(eib_t *, uint_t);
 898 
 899 /*
 900  * Chan related
 901  */
 902 extern eib_chan_t *eib_chan_init(void);
 903 extern void eib_chan_fini(eib_chan_t *);
 904 extern int eib_chan_post_rx(eib_t *, eib_chan_t *, uint_t *);
 905 extern int eib_chan_post_recv(eib_t *, eib_chan_t *, eib_wqe_t *);
 906 
 907 /*
 908  * Mac layer related
 909  */
 910 extern void eib_mac_set_nic_state(eib_t *, uint_t);
 911 extern void eib_mac_clr_nic_state(eib_t *, uint_t);
 912 extern void eib_mac_upd_nic_state(eib_t *, uint_t, uint_t);
 913 extern uint_t eib_mac_get_nic_state(eib_t *);
 914 extern void eib_mac_link_state(eib_t *, link_state_t, boolean_t);
 915 extern void eib_mac_link_down(eib_t *, boolean_t);
 916 extern void eib_mac_link_up(eib_t *, boolean_t);
 917 extern int eib_mac_start(eib_t *);
 918 extern void eib_mac_stop(eib_t *);
 919 extern int eib_mac_multicast(eib_t *, boolean_t, uint8_t *);
 920 extern int eib_mac_promisc(eib_t *, boolean_t);
 921 extern int eib_mac_tx(eib_t *, mblk_t *);
 922 extern int eib_mac_hca_portstate(eib_t *, ib_lid_t *, int *);
 923 
 924 /*
 925  * VNIC related
 926  */
 927 extern int eib_vnic_create(eib_t *, uint8_t *, uint16_t, eib_vnic_t **, int *);
 928 extern void eib_vnic_delete(eib_t *, eib_vnic_t *);
 929 extern int eib_vnic_wait_for_login_ack(eib_t *, eib_vnic_t *, int *);
 930 extern void eib_vnic_login_ack(eib_t *, eib_login_data_t *);
 931 extern int eib_vnic_wait_for_table(eib_t *, eib_vnic_t *, int *);
 932 extern void eib_vnic_vhub_table_done(eib_vnic_t *, uint_t);
 933 extern int eib_vnic_join_data_mcg(eib_t *, eib_vnic_t *, uint8_t *,
 934     boolean_t, int *);
 935 extern int eib_vnic_setup_dest(eib_vnic_t *, eib_wqe_t *, uint8_t *, uint16_t);
 936 extern void eib_vnic_leave_data_mcg(eib_t *, eib_vnic_t *, uint8_t *);
 937 extern void eib_vnic_init_tables(eib_t *, eib_vnic_t *);
 938 extern void eib_vnic_fini_tables(eib_t *, eib_vnic_t *, boolean_t);
 939 extern eib_chan_t *eib_vnic_get_data_chan(eib_t *, int);
 940 extern void eib_vnic_need_new(eib_t *, uint8_t *, uint16_t);
 941 extern void eib_vnic_enqueue_req(eib_t *, eib_vnic_req_t *);
 942 extern void eib_vnic_resurrect_zombies(eib_t *, uint8_t *);
 943 extern void eib_vnic_restart(eib_t *, int, uint8_t *);
 944 extern void eib_vnic_rejoin_mcgs(eib_t *);
 945 extern void eib_rb_vnic_create(eib_t *, eib_vnic_t *, uint_t);
 946 
 947 /*
 948  * Logging and other stuff
 949  */
 950 extern void eib_debug_init(void);
 951 extern void eib_debug_fini(void);
 952 extern void eib_dprintf_crit(int, const char *fmt, ...);
 953 extern void eib_dprintf_err(int, const char *fmt, ...);
 954 extern void eib_dprintf_warn(int, const char *fmt, ...);
 955 #ifdef EIB_DEBUG
 956 extern void eib_dprintf_debug(int, const char *fmt, ...);
 957 extern void eib_dprintf_args(int, const char *fmt, ...);
 958 extern void eib_dprintf_pkt(int, uint8_t *, uint_t);
 959 extern void eib_dprintf_verbose(int, const char *fmt, ...);
 960 #endif
 961 extern int eib_get_props(eib_t *);
 962 extern void eib_update_props(eib_t *, eib_gw_info_t *);
 963 extern void eib_rb_get_props(eib_t *);
 964 
 965 /*
 966  * EoIB specific global variables
 967  */
 968 extern ib_gid_t eib_reserved_gid;
 969 extern uint8_t eib_zero_mac[];
 970 extern uint8_t eib_broadcast_mac[];
 971 extern int eib_setbit_mod67[];
 972 extern char *eib_pvt_props[];
 973 
 974 /*
 975  * HW/FW workarounds
 976  */
 977 extern int eib_wa_no_desc_list_len;
 978 extern int eib_wa_no_cksum_offload;
 979 extern int eib_wa_no_lso;
 980 extern int eib_wa_no_mcast_entries;
 981 extern int eib_wa_no_av_discover;
 982 extern int eib_wa_no_good_vp_flag;
 983 extern int eib_wa_no_good_vhub_cksum;
 984 
 985 /*
 986  * Miscellaneous externs
 987  */
 988 extern void freemsgchain(mblk_t *);
 989 extern pri_t minclsyspri;
 990 
 991 #ifdef __cplusplus
 992 }
 993 #endif
 994 
 995 #endif  /* _SYS_IB_EOIB_EIB_IMPL_H */