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