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_ENX_IMPL_H 27*13101SVenki.Rajagopalan@Sun.COM #define _SYS_IB_EOIB_ENX_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/sunddi.h> 35*13101SVenki.Rajagopalan@Sun.COM #include <sys/varargs.h> 36*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ibtl/ibti.h> 37*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ibtl/ibvti.h> 38*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ib_pkt_hdrs.h> 39*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/ibtl/impl/ibtl_ibnex.h> 40*13101SVenki.Rajagopalan@Sun.COM #include <sys/ib/mgt/sm_attr.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 ENX_E_SUCCESS 0 49*13101SVenki.Rajagopalan@Sun.COM #define ENX_E_FAILURE -1 50*13101SVenki.Rajagopalan@Sun.COM #define ENX_MAX_LINE 128 51*13101SVenki.Rajagopalan@Sun.COM #define ENX_GRH_SZ (sizeof (ib_grh_t)) 52*13101SVenki.Rajagopalan@Sun.COM 53*13101SVenki.Rajagopalan@Sun.COM /* 54*13101SVenki.Rajagopalan@Sun.COM * Debug messages 55*13101SVenki.Rajagopalan@Sun.COM */ 56*13101SVenki.Rajagopalan@Sun.COM #define ENX_MSGS_CRIT 0x01 57*13101SVenki.Rajagopalan@Sun.COM #define ENX_MSGS_ERR 0x02 58*13101SVenki.Rajagopalan@Sun.COM #define ENX_MSGS_WARN 0x04 59*13101SVenki.Rajagopalan@Sun.COM #define ENX_MSGS_DEBUG 0x08 60*13101SVenki.Rajagopalan@Sun.COM #define ENX_MSGS_ARGS 0x10 61*13101SVenki.Rajagopalan@Sun.COM #define ENX_MSGS_VERBOSE 0x20 62*13101SVenki.Rajagopalan@Sun.COM #define ENX_MSGS_DEFAULT (ENX_MSGS_CRIT | ENX_MSGS_ERR | ENX_MSGS_WARN) 63*13101SVenki.Rajagopalan@Sun.COM 64*13101SVenki.Rajagopalan@Sun.COM #define ENX_LOGSZ_DEFAULT 0x20000 65*13101SVenki.Rajagopalan@Sun.COM 66*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_CRIT eibnx_dprintf_crit 67*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_ERR eibnx_dprintf_err 68*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_WARN eibnx_dprintf_warn 69*13101SVenki.Rajagopalan@Sun.COM #ifdef ENX_DEBUG 70*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_DEBUG eibnx_dprintf_debug 71*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_ARGS eibnx_dprintf_args 72*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_VERBOSE eibnx_dprintf_verbose 73*13101SVenki.Rajagopalan@Sun.COM #else 74*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_DEBUG 0 && 75*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_ARGS 0 && 76*13101SVenki.Rajagopalan@Sun.COM #define ENX_DPRINTF_VERBOSE 0 && 77*13101SVenki.Rajagopalan@Sun.COM #endif 78*13101SVenki.Rajagopalan@Sun.COM 79*13101SVenki.Rajagopalan@Sun.COM /* 80*13101SVenki.Rajagopalan@Sun.COM * EoIB Nexus service threads 81*13101SVenki.Rajagopalan@Sun.COM */ 82*13101SVenki.Rajagopalan@Sun.COM #define ENX_PORT_MONITOR "eibnx_port_%d_monitor" 83*13101SVenki.Rajagopalan@Sun.COM #define ENX_NODE_CREATOR "eibnx_node_creator" 84*13101SVenki.Rajagopalan@Sun.COM 85*13101SVenki.Rajagopalan@Sun.COM /* 86*13101SVenki.Rajagopalan@Sun.COM * Default period (us) for unicast solicitations to discovered gateways. 87*13101SVenki.Rajagopalan@Sun.COM * EoIB specification requires that hosts send solicitation atleast every 88*13101SVenki.Rajagopalan@Sun.COM * 4 * GW_ADV_PERIOD. 89*13101SVenki.Rajagopalan@Sun.COM */ 90*13101SVenki.Rajagopalan@Sun.COM #define ENX_DFL_SOLICIT_PERIOD_USEC 32000000 91*13101SVenki.Rajagopalan@Sun.COM 92*13101SVenki.Rajagopalan@Sun.COM /* 93*13101SVenki.Rajagopalan@Sun.COM * Portinfo list per HCA 94*13101SVenki.Rajagopalan@Sun.COM */ 95*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_port_s { 96*13101SVenki.Rajagopalan@Sun.COM struct eibnx_port_s *po_next; 97*13101SVenki.Rajagopalan@Sun.COM ibt_hca_portinfo_t *po_pi; 98*13101SVenki.Rajagopalan@Sun.COM uint_t po_pi_size; 99*13101SVenki.Rajagopalan@Sun.COM } eibnx_port_t; 100*13101SVenki.Rajagopalan@Sun.COM 101*13101SVenki.Rajagopalan@Sun.COM /* 102*13101SVenki.Rajagopalan@Sun.COM * HCA details 103*13101SVenki.Rajagopalan@Sun.COM */ 104*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_hca_s { 105*13101SVenki.Rajagopalan@Sun.COM struct eibnx_hca_s *hc_next; 106*13101SVenki.Rajagopalan@Sun.COM ib_guid_t hc_guid; 107*13101SVenki.Rajagopalan@Sun.COM ibt_hca_hdl_t hc_hdl; 108*13101SVenki.Rajagopalan@Sun.COM ibt_pd_hdl_t hc_pd; 109*13101SVenki.Rajagopalan@Sun.COM eibnx_port_t *hc_port; 110*13101SVenki.Rajagopalan@Sun.COM } eibnx_hca_t; 111*13101SVenki.Rajagopalan@Sun.COM 112*13101SVenki.Rajagopalan@Sun.COM /* 113*13101SVenki.Rajagopalan@Sun.COM * The port_monitor thread in EoIB nexus driver only sends two types of 114*13101SVenki.Rajagopalan@Sun.COM * packets: multicast solicitation the first time around, and periodic 115*13101SVenki.Rajagopalan@Sun.COM * unicast solicitations later to gateways that have been discovered. So 116*13101SVenki.Rajagopalan@Sun.COM * we need a couple of send wqes for the multicast solicitation and 117*13101SVenki.Rajagopalan@Sun.COM * probably as many send wqes as the number of gateways that may be 118*13101SVenki.Rajagopalan@Sun.COM * discovered from each port, for sending the unicast solicitations. 119*13101SVenki.Rajagopalan@Sun.COM * For unicast solicitations though, the UD destination needs to be set 120*13101SVenki.Rajagopalan@Sun.COM * up at the time we receive the advertisement from the gateway, using 121*13101SVenki.Rajagopalan@Sun.COM * ibt_modify_reply_ud_dest(), so we'll assign one send wqe for each 122*13101SVenki.Rajagopalan@Sun.COM * gateway that we discover. This means that we need to acquire these 123*13101SVenki.Rajagopalan@Sun.COM * send wqe entries during rx processing in the completion handler, which 124*13101SVenki.Rajagopalan@Sun.COM * means we must avoid sleeping in trying to acquire the swqe. Therefore, 125*13101SVenki.Rajagopalan@Sun.COM * we'll pre-allocate these unicast solication send wqes to be atleast 126*13101SVenki.Rajagopalan@Sun.COM * twice the number of recv wqes. 127*13101SVenki.Rajagopalan@Sun.COM * 128*13101SVenki.Rajagopalan@Sun.COM * The receive packets expected by the EoIB nexus driver are the multicast 129*13101SVenki.Rajagopalan@Sun.COM * and unicast messages on the SOLICIT and ADVERTISE groups. These 130*13101SVenki.Rajagopalan@Sun.COM * shouldn't be too many, and should be tuned as we gain experience on 131*13101SVenki.Rajagopalan@Sun.COM * the traffic pattern. We'll start with 16. 132*13101SVenki.Rajagopalan@Sun.COM */ 133*13101SVenki.Rajagopalan@Sun.COM #define ENX_NUM_SWQE 46 134*13101SVenki.Rajagopalan@Sun.COM #define ENX_NUM_RWQE 16 135*13101SVenki.Rajagopalan@Sun.COM #define ENX_CQ_SIZE (ENX_NUM_SWQE + ENX_NUM_RWQE + 2) 136*13101SVenki.Rajagopalan@Sun.COM 137*13101SVenki.Rajagopalan@Sun.COM /* 138*13101SVenki.Rajagopalan@Sun.COM * qe_type values 139*13101SVenki.Rajagopalan@Sun.COM */ 140*13101SVenki.Rajagopalan@Sun.COM #define ENX_QETYP_RWQE 0x1 141*13101SVenki.Rajagopalan@Sun.COM #define ENX_QETYP_SWQE 0x2 142*13101SVenki.Rajagopalan@Sun.COM 143*13101SVenki.Rajagopalan@Sun.COM /* 144*13101SVenki.Rajagopalan@Sun.COM * qe_flags bitmasks (protected by qe_lock). None of the 145*13101SVenki.Rajagopalan@Sun.COM * flag values may be zero. 146*13101SVenki.Rajagopalan@Sun.COM */ 147*13101SVenki.Rajagopalan@Sun.COM #define ENX_QEFL_INUSE 0x01 148*13101SVenki.Rajagopalan@Sun.COM #define ENX_QEFL_POSTED 0x02 149*13101SVenki.Rajagopalan@Sun.COM #define ENX_QEFL_RELONCOMP 0x04 150*13101SVenki.Rajagopalan@Sun.COM 151*13101SVenki.Rajagopalan@Sun.COM /* 152*13101SVenki.Rajagopalan@Sun.COM * Recv and send workq entries 153*13101SVenki.Rajagopalan@Sun.COM */ 154*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_wqe_s { 155*13101SVenki.Rajagopalan@Sun.COM uint_t qe_type; 156*13101SVenki.Rajagopalan@Sun.COM uint_t qe_bufsz; 157*13101SVenki.Rajagopalan@Sun.COM ibt_wr_ds_t qe_sgl; 158*13101SVenki.Rajagopalan@Sun.COM ibt_all_wr_t qe_wr; 159*13101SVenki.Rajagopalan@Sun.COM kmutex_t qe_lock; 160*13101SVenki.Rajagopalan@Sun.COM uint_t qe_flags; 161*13101SVenki.Rajagopalan@Sun.COM } eibnx_wqe_t; 162*13101SVenki.Rajagopalan@Sun.COM 163*13101SVenki.Rajagopalan@Sun.COM /* 164*13101SVenki.Rajagopalan@Sun.COM * Tx descriptor 165*13101SVenki.Rajagopalan@Sun.COM */ 166*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_tx_s { 167*13101SVenki.Rajagopalan@Sun.COM ib_vaddr_t tx_vaddr; 168*13101SVenki.Rajagopalan@Sun.COM ibt_mr_hdl_t tx_mr; 169*13101SVenki.Rajagopalan@Sun.COM ibt_lkey_t tx_lkey; 170*13101SVenki.Rajagopalan@Sun.COM eibnx_wqe_t tx_wqe[ENX_NUM_SWQE]; 171*13101SVenki.Rajagopalan@Sun.COM } eibnx_tx_t; 172*13101SVenki.Rajagopalan@Sun.COM 173*13101SVenki.Rajagopalan@Sun.COM /* 174*13101SVenki.Rajagopalan@Sun.COM * Rx descriptor 175*13101SVenki.Rajagopalan@Sun.COM */ 176*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_rx_s { 177*13101SVenki.Rajagopalan@Sun.COM ib_vaddr_t rx_vaddr; 178*13101SVenki.Rajagopalan@Sun.COM ibt_mr_hdl_t rx_mr; 179*13101SVenki.Rajagopalan@Sun.COM ibt_lkey_t rx_lkey; 180*13101SVenki.Rajagopalan@Sun.COM eibnx_wqe_t rx_wqe[ENX_NUM_RWQE]; 181*13101SVenki.Rajagopalan@Sun.COM } eibnx_rx_t; 182*13101SVenki.Rajagopalan@Sun.COM 183*13101SVenki.Rajagopalan@Sun.COM /* 184*13101SVenki.Rajagopalan@Sun.COM * Details about the address of each gateway we discover. 185*13101SVenki.Rajagopalan@Sun.COM */ 186*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_gw_addr_s { 187*13101SVenki.Rajagopalan@Sun.COM ibt_adds_vect_t *ga_vect; 188*13101SVenki.Rajagopalan@Sun.COM ib_gid_t ga_gid; 189*13101SVenki.Rajagopalan@Sun.COM ib_qpn_t ga_qpn; 190*13101SVenki.Rajagopalan@Sun.COM ib_qkey_t ga_qkey; 191*13101SVenki.Rajagopalan@Sun.COM ib_pkey_t ga_pkey; 192*13101SVenki.Rajagopalan@Sun.COM } eibnx_gw_addr_t; 193*13101SVenki.Rajagopalan@Sun.COM 194*13101SVenki.Rajagopalan@Sun.COM /* 195*13101SVenki.Rajagopalan@Sun.COM * States for each GW 196*13101SVenki.Rajagopalan@Sun.COM */ 197*13101SVenki.Rajagopalan@Sun.COM #define ENX_GW_STATE_UNAVAILABLE 1 /* GW nackd availability */ 198*13101SVenki.Rajagopalan@Sun.COM #define ENX_GW_STATE_AVAILABLE 2 /* GW mcasted availability */ 199*13101SVenki.Rajagopalan@Sun.COM #define ENX_GW_STATE_READY_TO_LOGIN 3 /* GW ucasted availability */ 200*13101SVenki.Rajagopalan@Sun.COM 201*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_gw_info_s { 202*13101SVenki.Rajagopalan@Sun.COM struct eibnx_gw_info_s *gw_next; 203*13101SVenki.Rajagopalan@Sun.COM eibnx_wqe_t *gw_swqe; 204*13101SVenki.Rajagopalan@Sun.COM uint_t gw_state; 205*13101SVenki.Rajagopalan@Sun.COM 206*13101SVenki.Rajagopalan@Sun.COM kmutex_t gw_adv_lock; 207*13101SVenki.Rajagopalan@Sun.COM uint_t gw_adv_flag; 208*13101SVenki.Rajagopalan@Sun.COM int64_t gw_adv_last_lbolt; 209*13101SVenki.Rajagopalan@Sun.COM int64_t gw_adv_timeout_ticks; 210*13101SVenki.Rajagopalan@Sun.COM 211*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_addr_t gw_addr; 212*13101SVenki.Rajagopalan@Sun.COM 213*13101SVenki.Rajagopalan@Sun.COM ib_guid_t gw_system_guid; 214*13101SVenki.Rajagopalan@Sun.COM ib_guid_t gw_guid; 215*13101SVenki.Rajagopalan@Sun.COM 216*13101SVenki.Rajagopalan@Sun.COM uint32_t gw_adv_period; 217*13101SVenki.Rajagopalan@Sun.COM uint32_t gw_ka_period; 218*13101SVenki.Rajagopalan@Sun.COM uint32_t gw_vnic_ka_period; 219*13101SVenki.Rajagopalan@Sun.COM ib_qpn_t gw_ctrl_qpn; 220*13101SVenki.Rajagopalan@Sun.COM 221*13101SVenki.Rajagopalan@Sun.COM ib_lid_t gw_lid; 222*13101SVenki.Rajagopalan@Sun.COM uint16_t gw_portid; 223*13101SVenki.Rajagopalan@Sun.COM uint16_t gw_num_net_vnics; 224*13101SVenki.Rajagopalan@Sun.COM 225*13101SVenki.Rajagopalan@Sun.COM uint8_t gw_is_host_adm_vnics; 226*13101SVenki.Rajagopalan@Sun.COM uint8_t gw_sl; 227*13101SVenki.Rajagopalan@Sun.COM uint8_t gw_n_rss_qpn; 228*13101SVenki.Rajagopalan@Sun.COM uint8_t gw_flag_ucast_advt; 229*13101SVenki.Rajagopalan@Sun.COM uint8_t gw_flag_available; 230*13101SVenki.Rajagopalan@Sun.COM 231*13101SVenki.Rajagopalan@Sun.COM uint8_t gw_system_name[EIB_GW_SYSNAME_LEN]; 232*13101SVenki.Rajagopalan@Sun.COM uint8_t gw_port_name[EIB_GW_PORTNAME_LEN]; 233*13101SVenki.Rajagopalan@Sun.COM uint8_t gw_vendor_id[EIB_GW_VENDOR_LEN]; 234*13101SVenki.Rajagopalan@Sun.COM } eibnx_gw_info_t; 235*13101SVenki.Rajagopalan@Sun.COM 236*13101SVenki.Rajagopalan@Sun.COM /* 237*13101SVenki.Rajagopalan@Sun.COM * Values for gw_adv_flag (non-zero only) 238*13101SVenki.Rajagopalan@Sun.COM */ 239*13101SVenki.Rajagopalan@Sun.COM #define ENX_GW_DEAD 1 240*13101SVenki.Rajagopalan@Sun.COM #define ENX_GW_ALIVE 2 241*13101SVenki.Rajagopalan@Sun.COM #define ENX_GW_AWARE 3 242*13101SVenki.Rajagopalan@Sun.COM 243*13101SVenki.Rajagopalan@Sun.COM /* 244*13101SVenki.Rajagopalan@Sun.COM * Currently, we only expect the advertisement type of packets 245*13101SVenki.Rajagopalan@Sun.COM * from the gw. But we do get login acks from the gateway also 246*13101SVenki.Rajagopalan@Sun.COM * here in the nexus, so we'll need an identifier for that. 247*13101SVenki.Rajagopalan@Sun.COM */ 248*13101SVenki.Rajagopalan@Sun.COM typedef enum { 249*13101SVenki.Rajagopalan@Sun.COM FIP_GW_ADVERTISE_MCAST = 0, 250*13101SVenki.Rajagopalan@Sun.COM FIP_GW_ADVERTISE_UCAST, 251*13101SVenki.Rajagopalan@Sun.COM FIP_VNIC_LOGIN_ACK 252*13101SVenki.Rajagopalan@Sun.COM } eibnx_gw_pkt_type_t; 253*13101SVenki.Rajagopalan@Sun.COM 254*13101SVenki.Rajagopalan@Sun.COM /* 255*13101SVenki.Rajagopalan@Sun.COM * Currently, the only gw response handled by the eibnx driver 256*13101SVenki.Rajagopalan@Sun.COM * are the ucast/mcast advertisements. Information collected from 257*13101SVenki.Rajagopalan@Sun.COM * both these responses may be packed into a eibnx_gw_info_t. 258*13101SVenki.Rajagopalan@Sun.COM * In the future, if we decide to handle other types of responses 259*13101SVenki.Rajagopalan@Sun.COM * from the gw, we could simply add the new types to the union. 260*13101SVenki.Rajagopalan@Sun.COM */ 261*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_gw_msg_s { 262*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_pkt_type_t gm_type; 263*13101SVenki.Rajagopalan@Sun.COM union { 264*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t gm_info; 265*13101SVenki.Rajagopalan@Sun.COM } u; 266*13101SVenki.Rajagopalan@Sun.COM } eibnx_gw_msg_t; 267*13101SVenki.Rajagopalan@Sun.COM 268*13101SVenki.Rajagopalan@Sun.COM /* 269*13101SVenki.Rajagopalan@Sun.COM * List to hold the devinfo nodes of eoib instances 270*13101SVenki.Rajagopalan@Sun.COM */ 271*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_child_s { 272*13101SVenki.Rajagopalan@Sun.COM struct eibnx_child_s *ch_next; 273*13101SVenki.Rajagopalan@Sun.COM dev_info_t *ch_dip; 274*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *ch_gwi; 275*13101SVenki.Rajagopalan@Sun.COM char *ch_node_name; 276*13101SVenki.Rajagopalan@Sun.COM } eibnx_child_t; 277*13101SVenki.Rajagopalan@Sun.COM 278*13101SVenki.Rajagopalan@Sun.COM /* 279*13101SVenki.Rajagopalan@Sun.COM * Event bitmasks for the port-monitor to wait on. None of these flags 280*13101SVenki.Rajagopalan@Sun.COM * may be zero. 281*13101SVenki.Rajagopalan@Sun.COM */ 282*13101SVenki.Rajagopalan@Sun.COM #define ENX_EVENT_LINK_UP 0x01 283*13101SVenki.Rajagopalan@Sun.COM #define ENX_EVENT_MCGS_AVAILABLE 0x02 284*13101SVenki.Rajagopalan@Sun.COM #define ENX_EVENT_TIMED_OUT 0x04 285*13101SVenki.Rajagopalan@Sun.COM #define ENX_EVENT_DIE 0x08 286*13101SVenki.Rajagopalan@Sun.COM #define ENX_EVENT_COMPLETION 0x10 287*13101SVenki.Rajagopalan@Sun.COM 288*13101SVenki.Rajagopalan@Sun.COM /* 289*13101SVenki.Rajagopalan@Sun.COM * MCG Query/Join status 290*13101SVenki.Rajagopalan@Sun.COM */ 291*13101SVenki.Rajagopalan@Sun.COM #define ENX_MCGS_FOUND 0x1 292*13101SVenki.Rajagopalan@Sun.COM #define ENX_MCGS_JOINED 0x2 293*13101SVenki.Rajagopalan@Sun.COM 294*13101SVenki.Rajagopalan@Sun.COM /* 295*13101SVenki.Rajagopalan@Sun.COM * Information that each port-monitor thread cares about 296*13101SVenki.Rajagopalan@Sun.COM */ 297*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_thr_info_s { 298*13101SVenki.Rajagopalan@Sun.COM struct eibnx_thr_info_s *ti_next; 299*13101SVenki.Rajagopalan@Sun.COM uint_t ti_progress; 300*13101SVenki.Rajagopalan@Sun.COM 301*13101SVenki.Rajagopalan@Sun.COM /* 302*13101SVenki.Rajagopalan@Sun.COM * Our kernel thread id 303*13101SVenki.Rajagopalan@Sun.COM */ 304*13101SVenki.Rajagopalan@Sun.COM kt_did_t ti_kt_did; 305*13101SVenki.Rajagopalan@Sun.COM 306*13101SVenki.Rajagopalan@Sun.COM /* 307*13101SVenki.Rajagopalan@Sun.COM * HCA, port and protection domain information 308*13101SVenki.Rajagopalan@Sun.COM */ 309*13101SVenki.Rajagopalan@Sun.COM ib_guid_t ti_hca_guid; 310*13101SVenki.Rajagopalan@Sun.COM ibt_hca_hdl_t ti_hca; 311*13101SVenki.Rajagopalan@Sun.COM ibt_pd_hdl_t ti_pd; 312*13101SVenki.Rajagopalan@Sun.COM ibt_hca_portinfo_t *ti_pi; 313*13101SVenki.Rajagopalan@Sun.COM char *ti_ident; 314*13101SVenki.Rajagopalan@Sun.COM 315*13101SVenki.Rajagopalan@Sun.COM /* 316*13101SVenki.Rajagopalan@Sun.COM * Well-known multicast groups for solicitations 317*13101SVenki.Rajagopalan@Sun.COM * and advertisements. 318*13101SVenki.Rajagopalan@Sun.COM */ 319*13101SVenki.Rajagopalan@Sun.COM kmutex_t ti_mcg_lock; 320*13101SVenki.Rajagopalan@Sun.COM uint_t ti_mcg_status; 321*13101SVenki.Rajagopalan@Sun.COM ibt_mcg_info_t *ti_advertise_mcg; 322*13101SVenki.Rajagopalan@Sun.COM ibt_mcg_info_t *ti_solicit_mcg; 323*13101SVenki.Rajagopalan@Sun.COM uint_t ti_mcast_done; 324*13101SVenki.Rajagopalan@Sun.COM 325*13101SVenki.Rajagopalan@Sun.COM /* 326*13101SVenki.Rajagopalan@Sun.COM * Completion queue stuff 327*13101SVenki.Rajagopalan@Sun.COM */ 328*13101SVenki.Rajagopalan@Sun.COM ibt_cq_hdl_t ti_cq_hdl; 329*13101SVenki.Rajagopalan@Sun.COM uint_t ti_cq_sz; 330*13101SVenki.Rajagopalan@Sun.COM ibt_wc_t *ti_wc; 331*13101SVenki.Rajagopalan@Sun.COM ddi_softint_handle_t ti_softint_hdl; 332*13101SVenki.Rajagopalan@Sun.COM 333*13101SVenki.Rajagopalan@Sun.COM /* 334*13101SVenki.Rajagopalan@Sun.COM * Channel related 335*13101SVenki.Rajagopalan@Sun.COM */ 336*13101SVenki.Rajagopalan@Sun.COM ibt_channel_hdl_t ti_chan; 337*13101SVenki.Rajagopalan@Sun.COM ib_qpn_t ti_qpn; 338*13101SVenki.Rajagopalan@Sun.COM 339*13101SVenki.Rajagopalan@Sun.COM /* 340*13101SVenki.Rajagopalan@Sun.COM * Transmit/Receive stuff 341*13101SVenki.Rajagopalan@Sun.COM */ 342*13101SVenki.Rajagopalan@Sun.COM eibnx_tx_t ti_snd; 343*13101SVenki.Rajagopalan@Sun.COM eibnx_rx_t ti_rcv; 344*13101SVenki.Rajagopalan@Sun.COM 345*13101SVenki.Rajagopalan@Sun.COM /* 346*13101SVenki.Rajagopalan@Sun.COM * GW related stuff 347*13101SVenki.Rajagopalan@Sun.COM */ 348*13101SVenki.Rajagopalan@Sun.COM kmutex_t ti_gw_lock; 349*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *ti_gw; 350*13101SVenki.Rajagopalan@Sun.COM 351*13101SVenki.Rajagopalan@Sun.COM /* 352*13101SVenki.Rajagopalan@Sun.COM * Devinfo nodes for the eoib children 353*13101SVenki.Rajagopalan@Sun.COM */ 354*13101SVenki.Rajagopalan@Sun.COM kmutex_t ti_child_lock; 355*13101SVenki.Rajagopalan@Sun.COM eibnx_child_t *ti_child; 356*13101SVenki.Rajagopalan@Sun.COM 357*13101SVenki.Rajagopalan@Sun.COM /* 358*13101SVenki.Rajagopalan@Sun.COM * Events that we wait on and/or handle 359*13101SVenki.Rajagopalan@Sun.COM */ 360*13101SVenki.Rajagopalan@Sun.COM kmutex_t ti_event_lock; 361*13101SVenki.Rajagopalan@Sun.COM kcondvar_t ti_event_cv; 362*13101SVenki.Rajagopalan@Sun.COM uint_t ti_event; 363*13101SVenki.Rajagopalan@Sun.COM } eibnx_thr_info_t; 364*13101SVenki.Rajagopalan@Sun.COM 365*13101SVenki.Rajagopalan@Sun.COM /* 366*13101SVenki.Rajagopalan@Sun.COM * Workq entry for creation of eoib nodes 367*13101SVenki.Rajagopalan@Sun.COM */ 368*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_nodeq_s { 369*13101SVenki.Rajagopalan@Sun.COM struct eibnx_nodeq_s *nc_next; 370*13101SVenki.Rajagopalan@Sun.COM eibnx_thr_info_t *nc_info; 371*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *nc_gwi; 372*13101SVenki.Rajagopalan@Sun.COM } eibnx_nodeq_t; 373*13101SVenki.Rajagopalan@Sun.COM 374*13101SVenki.Rajagopalan@Sun.COM /* 375*13101SVenki.Rajagopalan@Sun.COM * Bus config status flags. The in-prog is protected by 376*13101SVenki.Rajagopalan@Sun.COM * nx_lock, and the rest of the flags (currently only 377*13101SVenki.Rajagopalan@Sun.COM * buscfg-complete) is protected by the in-prog bit itself. 378*13101SVenki.Rajagopalan@Sun.COM */ 379*13101SVenki.Rajagopalan@Sun.COM #define NX_FL_BUSOP_INPROG 0x1 380*13101SVenki.Rajagopalan@Sun.COM #define NX_FL_BUSCFG_COMPLETE 0x2 381*13101SVenki.Rajagopalan@Sun.COM #define NX_FL_BUSOP_MASK 0x3 382*13101SVenki.Rajagopalan@Sun.COM 383*13101SVenki.Rajagopalan@Sun.COM /* 384*13101SVenki.Rajagopalan@Sun.COM * EoIB nexus per-instance state 385*13101SVenki.Rajagopalan@Sun.COM */ 386*13101SVenki.Rajagopalan@Sun.COM typedef struct eibnx_s { 387*13101SVenki.Rajagopalan@Sun.COM dev_info_t *nx_dip; 388*13101SVenki.Rajagopalan@Sun.COM ibt_clnt_hdl_t nx_ibt_hdl; 389*13101SVenki.Rajagopalan@Sun.COM 390*13101SVenki.Rajagopalan@Sun.COM kmutex_t nx_lock; 391*13101SVenki.Rajagopalan@Sun.COM eibnx_hca_t *nx_hca; 392*13101SVenki.Rajagopalan@Sun.COM eibnx_thr_info_t *nx_thr_info; 393*13101SVenki.Rajagopalan@Sun.COM boolean_t nx_monitors_up; 394*13101SVenki.Rajagopalan@Sun.COM 395*13101SVenki.Rajagopalan@Sun.COM kmutex_t nx_nodeq_lock; 396*13101SVenki.Rajagopalan@Sun.COM kcondvar_t nx_nodeq_cv; 397*13101SVenki.Rajagopalan@Sun.COM eibnx_nodeq_t *nx_nodeq; 398*13101SVenki.Rajagopalan@Sun.COM kt_did_t nx_nodeq_kt_did; 399*13101SVenki.Rajagopalan@Sun.COM uint_t nx_nodeq_thr_die; 400*13101SVenki.Rajagopalan@Sun.COM 401*13101SVenki.Rajagopalan@Sun.COM kmutex_t nx_busop_lock; 402*13101SVenki.Rajagopalan@Sun.COM kcondvar_t nx_busop_cv; 403*13101SVenki.Rajagopalan@Sun.COM uint_t nx_busop_flags; 404*13101SVenki.Rajagopalan@Sun.COM } eibnx_t; 405*13101SVenki.Rajagopalan@Sun.COM 406*13101SVenki.Rajagopalan@Sun.COM 407*13101SVenki.Rajagopalan@Sun.COM /* 408*13101SVenki.Rajagopalan@Sun.COM * Event tags for EoIB Nexus events delivered to EoIB instances 409*13101SVenki.Rajagopalan@Sun.COM */ 410*13101SVenki.Rajagopalan@Sun.COM #define ENX_EVENT_TAG_GW_INFO_UPDATE 0 411*13101SVenki.Rajagopalan@Sun.COM #define ENX_EVENT_TAG_GW_AVAILABLE 1 412*13101SVenki.Rajagopalan@Sun.COM #define ENX_EVENT_TAG_LOGIN_ACK 2 413*13101SVenki.Rajagopalan@Sun.COM 414*13101SVenki.Rajagopalan@Sun.COM /* 415*13101SVenki.Rajagopalan@Sun.COM * FUNCTION PROTOTYPES FOR CROSS-FILE LINKAGE 416*13101SVenki.Rajagopalan@Sun.COM */ 417*13101SVenki.Rajagopalan@Sun.COM 418*13101SVenki.Rajagopalan@Sun.COM /* 419*13101SVenki.Rajagopalan@Sun.COM * Threads and Event Handlers 420*13101SVenki.Rajagopalan@Sun.COM */ 421*13101SVenki.Rajagopalan@Sun.COM void eibnx_port_monitor(eibnx_thr_info_t *); 422*13101SVenki.Rajagopalan@Sun.COM void eibnx_subnet_notices_handler(void *, ib_gid_t, ibt_subnet_event_code_t, 423*13101SVenki.Rajagopalan@Sun.COM ibt_subnet_event_t *); 424*13101SVenki.Rajagopalan@Sun.COM void eibnx_async_handler(void *, ibt_hca_hdl_t, ibt_async_code_t, 425*13101SVenki.Rajagopalan@Sun.COM ibt_async_event_t *); 426*13101SVenki.Rajagopalan@Sun.COM boolean_t eibnx_is_gw_dead(eibnx_gw_info_t *); 427*13101SVenki.Rajagopalan@Sun.COM void eibnx_create_eoib_node(void); 428*13101SVenki.Rajagopalan@Sun.COM void eibnx_comp_intr(ibt_cq_hdl_t, void *); 429*13101SVenki.Rajagopalan@Sun.COM uint_t eibnx_comp_handler(caddr_t, caddr_t); 430*13101SVenki.Rajagopalan@Sun.COM 431*13101SVenki.Rajagopalan@Sun.COM /* 432*13101SVenki.Rajagopalan@Sun.COM * IBT related functions 433*13101SVenki.Rajagopalan@Sun.COM */ 434*13101SVenki.Rajagopalan@Sun.COM int eibnx_ibt_init(eibnx_t *); 435*13101SVenki.Rajagopalan@Sun.COM int eibnx_find_mgroups(eibnx_thr_info_t *); 436*13101SVenki.Rajagopalan@Sun.COM int eibnx_setup_cq(eibnx_thr_info_t *); 437*13101SVenki.Rajagopalan@Sun.COM int eibnx_setup_ud_channel(eibnx_thr_info_t *); 438*13101SVenki.Rajagopalan@Sun.COM int eibnx_setup_bufs(eibnx_thr_info_t *); 439*13101SVenki.Rajagopalan@Sun.COM int eibnx_setup_cq_handler(eibnx_thr_info_t *); 440*13101SVenki.Rajagopalan@Sun.COM int eibnx_join_mcgs(eibnx_thr_info_t *); 441*13101SVenki.Rajagopalan@Sun.COM int eibnx_rejoin_mcgs(eibnx_thr_info_t *); 442*13101SVenki.Rajagopalan@Sun.COM int eibnx_ibt_fini(eibnx_t *); 443*13101SVenki.Rajagopalan@Sun.COM 444*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_find_mgroups(eibnx_thr_info_t *); 445*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_setup_cq(eibnx_thr_info_t *); 446*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_setup_ud_channel(eibnx_thr_info_t *); 447*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_setup_bufs(eibnx_thr_info_t *); 448*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_setup_cq_handler(eibnx_thr_info_t *); 449*13101SVenki.Rajagopalan@Sun.COM void eibnx_rb_join_mcgs(eibnx_thr_info_t *); 450*13101SVenki.Rajagopalan@Sun.COM 451*13101SVenki.Rajagopalan@Sun.COM eibnx_hca_t *eibnx_prepare_hca(ib_guid_t); 452*13101SVenki.Rajagopalan@Sun.COM int eibnx_cleanup_hca(eibnx_hca_t *); 453*13101SVenki.Rajagopalan@Sun.COM 454*13101SVenki.Rajagopalan@Sun.COM /* 455*13101SVenki.Rajagopalan@Sun.COM * FIP packetizing related functions 456*13101SVenki.Rajagopalan@Sun.COM */ 457*13101SVenki.Rajagopalan@Sun.COM int eibnx_fip_solicit_mcast(eibnx_thr_info_t *); 458*13101SVenki.Rajagopalan@Sun.COM int eibnx_fip_solicit_ucast(eibnx_thr_info_t *, clock_t *); 459*13101SVenki.Rajagopalan@Sun.COM int eibnx_fip_parse_pkt(uint8_t *, eibnx_gw_msg_t *); 460*13101SVenki.Rajagopalan@Sun.COM 461*13101SVenki.Rajagopalan@Sun.COM /* 462*13101SVenki.Rajagopalan@Sun.COM * Queue and List related routines 463*13101SVenki.Rajagopalan@Sun.COM */ 464*13101SVenki.Rajagopalan@Sun.COM eibnx_wqe_t *eibnx_acquire_swqe(eibnx_thr_info_t *, int); 465*13101SVenki.Rajagopalan@Sun.COM void eibnx_return_swqe(eibnx_wqe_t *); 466*13101SVenki.Rajagopalan@Sun.COM void eibnx_return_rwqe(eibnx_thr_info_t *, eibnx_wqe_t *); 467*13101SVenki.Rajagopalan@Sun.COM void eibnx_release_swqe(eibnx_wqe_t *); 468*13101SVenki.Rajagopalan@Sun.COM 469*13101SVenki.Rajagopalan@Sun.COM void eibnx_enqueue_child(eibnx_thr_info_t *, eibnx_gw_info_t *, char *, 470*13101SVenki.Rajagopalan@Sun.COM dev_info_t *); 471*13101SVenki.Rajagopalan@Sun.COM int eibnx_update_child(eibnx_thr_info_t *, eibnx_gw_info_t *, dev_info_t *); 472*13101SVenki.Rajagopalan@Sun.COM dev_info_t *eibnx_find_child_dip_by_inst(eibnx_thr_info_t *, int); 473*13101SVenki.Rajagopalan@Sun.COM dev_info_t *eibnx_find_child_dip_by_gw(eibnx_thr_info_t *, uint16_t); 474*13101SVenki.Rajagopalan@Sun.COM 475*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *eibnx_find_gw_in_gwlist(eibnx_thr_info_t *, eibnx_gw_info_t *); 476*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *eibnx_add_gw_to_gwlist(eibnx_thr_info_t *, eibnx_gw_info_t *, 477*13101SVenki.Rajagopalan@Sun.COM ibt_wc_t *, uint8_t *); 478*13101SVenki.Rajagopalan@Sun.COM void eibnx_replace_gw_in_gwlist(eibnx_thr_info_t *, eibnx_gw_info_t *, 479*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *, ibt_wc_t *, uint8_t *, boolean_t *); 480*13101SVenki.Rajagopalan@Sun.COM void eibnx_queue_for_creation(eibnx_thr_info_t *, eibnx_gw_info_t *); 481*13101SVenki.Rajagopalan@Sun.COM 482*13101SVenki.Rajagopalan@Sun.COM /* 483*13101SVenki.Rajagopalan@Sun.COM * Logging and Error reporting routines 484*13101SVenki.Rajagopalan@Sun.COM */ 485*13101SVenki.Rajagopalan@Sun.COM void eibnx_debug_init(void); 486*13101SVenki.Rajagopalan@Sun.COM void eibnx_debug_fini(void); 487*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_crit(const char *fmt, ...); 488*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_err(const char *fmt, ...); 489*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_warn(const char *fmt, ...); 490*13101SVenki.Rajagopalan@Sun.COM #ifdef ENX_DEBUG 491*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_debug(const char *fmt, ...); 492*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_args(const char *fmt, ...); 493*13101SVenki.Rajagopalan@Sun.COM void eibnx_dprintf_verbose(const char *fmt, ...); 494*13101SVenki.Rajagopalan@Sun.COM #endif 495*13101SVenki.Rajagopalan@Sun.COM 496*13101SVenki.Rajagopalan@Sun.COM /* 497*13101SVenki.Rajagopalan@Sun.COM * Miscellaneous 498*13101SVenki.Rajagopalan@Sun.COM */ 499*13101SVenki.Rajagopalan@Sun.COM void eibnx_cleanup_port_nodes(eibnx_thr_info_t *); 500*13101SVenki.Rajagopalan@Sun.COM void eibnx_create_node_props(dev_info_t *, eibnx_thr_info_t *, 501*13101SVenki.Rajagopalan@Sun.COM eibnx_gw_info_t *); 502*13101SVenki.Rajagopalan@Sun.COM int eibnx_name_child(dev_info_t *, char *, size_t); 503*13101SVenki.Rajagopalan@Sun.COM void eibnx_busop_inprog_enter(eibnx_t *); 504*13101SVenki.Rajagopalan@Sun.COM void eibnx_busop_inprog_exit(eibnx_t *); 505*13101SVenki.Rajagopalan@Sun.COM eibnx_thr_info_t *eibnx_start_port_monitor(eibnx_hca_t *, eibnx_port_t *); 506*13101SVenki.Rajagopalan@Sun.COM void eibnx_stop_port_monitor(eibnx_thr_info_t *); 507*13101SVenki.Rajagopalan@Sun.COM void eibnx_terminate_monitors(void); 508*13101SVenki.Rajagopalan@Sun.COM int eibnx_configure_node(eibnx_thr_info_t *, eibnx_gw_info_t *, dev_info_t **); 509*13101SVenki.Rajagopalan@Sun.COM int eibnx_unconfigure_node(eibnx_thr_info_t *, eibnx_gw_info_t *); 510*13101SVenki.Rajagopalan@Sun.COM int eibnx_locate_node_name(char *, eibnx_thr_info_t **, eibnx_gw_info_t **); 511*13101SVenki.Rajagopalan@Sun.COM int eibnx_locate_unconfigured_node(eibnx_thr_info_t **, eibnx_gw_info_t **); 512*13101SVenki.Rajagopalan@Sun.COM 513*13101SVenki.Rajagopalan@Sun.COM /* 514*13101SVenki.Rajagopalan@Sun.COM * Devctl cbops (currently dummy) 515*13101SVenki.Rajagopalan@Sun.COM */ 516*13101SVenki.Rajagopalan@Sun.COM int eibnx_devctl_open(dev_t *, int, int, cred_t *); 517*13101SVenki.Rajagopalan@Sun.COM int eibnx_devctl_close(dev_t, int, int, cred_t *); 518*13101SVenki.Rajagopalan@Sun.COM int eibnx_devctl_ioctl(dev_t, int, intptr_t, int, cred_t *, int *); 519*13101SVenki.Rajagopalan@Sun.COM 520*13101SVenki.Rajagopalan@Sun.COM /* 521*13101SVenki.Rajagopalan@Sun.COM * External variable references 522*13101SVenki.Rajagopalan@Sun.COM */ 523*13101SVenki.Rajagopalan@Sun.COM extern pri_t minclsyspri; 524*13101SVenki.Rajagopalan@Sun.COM extern eibnx_t *enx_global_ss; 525*13101SVenki.Rajagopalan@Sun.COM extern ib_gid_t enx_solicit_mgid; 526*13101SVenki.Rajagopalan@Sun.COM extern ib_gid_t enx_advertise_mgid; 527*13101SVenki.Rajagopalan@Sun.COM 528*13101SVenki.Rajagopalan@Sun.COM #ifdef __cplusplus 529*13101SVenki.Rajagopalan@Sun.COM } 530*13101SVenki.Rajagopalan@Sun.COM #endif 531*13101SVenki.Rajagopalan@Sun.COM 532*13101SVenki.Rajagopalan@Sun.COM #endif /* _SYS_IB_EOIB_ENX_IMPL_H */ 533