1*b494511aSVenki Rajagopalan /* 2*b494511aSVenki Rajagopalan * CDDL HEADER START 3*b494511aSVenki Rajagopalan * 4*b494511aSVenki Rajagopalan * The contents of this file are subject to the terms of the 5*b494511aSVenki Rajagopalan * Common Development and Distribution License (the "License"). 6*b494511aSVenki Rajagopalan * You may not use this file except in compliance with the License. 7*b494511aSVenki Rajagopalan * 8*b494511aSVenki Rajagopalan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*b494511aSVenki Rajagopalan * or http://www.opensolaris.org/os/licensing. 10*b494511aSVenki Rajagopalan * See the License for the specific language governing permissions 11*b494511aSVenki Rajagopalan * and limitations under the License. 12*b494511aSVenki Rajagopalan * 13*b494511aSVenki Rajagopalan * When distributing Covered Code, include this CDDL HEADER in each 14*b494511aSVenki Rajagopalan * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*b494511aSVenki Rajagopalan * If applicable, add the following below this CDDL HEADER, with the 16*b494511aSVenki Rajagopalan * fields enclosed by brackets "[]" replaced with your own identifying 17*b494511aSVenki Rajagopalan * information: Portions Copyright [yyyy] [name of copyright owner] 18*b494511aSVenki Rajagopalan * 19*b494511aSVenki Rajagopalan * CDDL HEADER END 20*b494511aSVenki Rajagopalan */ 21*b494511aSVenki Rajagopalan 22*b494511aSVenki Rajagopalan /* 23*b494511aSVenki Rajagopalan * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 24*b494511aSVenki Rajagopalan */ 25*b494511aSVenki Rajagopalan 26*b494511aSVenki Rajagopalan #ifndef _SYS_IB_EOIB_EIB_H 27*b494511aSVenki Rajagopalan #define _SYS_IB_EOIB_EIB_H 28*b494511aSVenki Rajagopalan 29*b494511aSVenki Rajagopalan #ifdef __cplusplus 30*b494511aSVenki Rajagopalan extern "C" { 31*b494511aSVenki Rajagopalan #endif 32*b494511aSVenki Rajagopalan 33*b494511aSVenki Rajagopalan /* 34*b494511aSVenki Rajagopalan * 35*b494511aSVenki Rajagopalan * EoIB Encapsulation Header Layout 36*b494511aSVenki Rajagopalan * 37*b494511aSVenki Rajagopalan * 31 30 29 28 27 26 25 24 22 21 20 ... 16 15 0 38*b494511aSVenki Rajagopalan * +-----+-----+-----+-----+--+---+--+---------+-------------------------+ 39*b494511aSVenki Rajagopalan * | sig | ver | TCP | IP | |fcs|ms| segment | segment id | 40*b494511aSVenki Rajagopalan * | | | chk | chk | | | | offset | | 41*b494511aSVenki Rajagopalan * +-----+-----+-----+-----+--+---+--+---------+-------------------------+ 42*b494511aSVenki Rajagopalan * 43*b494511aSVenki Rajagopalan */ 44*b494511aSVenki Rajagopalan #define EIB_ENCAP_HDR_SZ 4 45*b494511aSVenki Rajagopalan 46*b494511aSVenki Rajagopalan #define EIB_ENCAP_SIGN_MASK 0x3 47*b494511aSVenki Rajagopalan #define EIB_ENCAP_SIGN_SHIFT 30 48*b494511aSVenki Rajagopalan #define EIB_ENCAP_VER_MASK 0x3 49*b494511aSVenki Rajagopalan #define EIB_ENCAP_VER_SHIFT 28 50*b494511aSVenki Rajagopalan #define EIB_ENCAP_TCPCHK_MASK 0x3 51*b494511aSVenki Rajagopalan #define EIB_ENCAP_TCPCHK_SHIFT 26 52*b494511aSVenki Rajagopalan #define EIB_ENCAP_IPCHK_MASK 0x3 53*b494511aSVenki Rajagopalan #define EIB_ENCAP_IPCHK_SHIFT 24 54*b494511aSVenki Rajagopalan #define EIB_ENCAP_FCS_B_SHIFT 22 55*b494511aSVenki Rajagopalan #define EIB_ENCAP_MS_B_SHIFT 21 56*b494511aSVenki Rajagopalan #define EIB_ENCAP_SEGOFF_MASK 0x1F 57*b494511aSVenki Rajagopalan #define EIB_ENCAP_SEGOFF_SHIFT 16 58*b494511aSVenki Rajagopalan #define EIB_ENCAP_SEGID_MASK 0xFFFF 59*b494511aSVenki Rajagopalan 60*b494511aSVenki Rajagopalan /* 61*b494511aSVenki Rajagopalan * Bit fields values definitions 62*b494511aSVenki Rajagopalan */ 63*b494511aSVenki Rajagopalan #define EIB_EH_SIGNATURE 3 64*b494511aSVenki Rajagopalan #define EIB_EH_VERSION 0 65*b494511aSVenki Rajagopalan #define EIB_EH_CSUM_UNKNOWN 0 66*b494511aSVenki Rajagopalan #define EIB_EH_TCPCSUM_OK 1 67*b494511aSVenki Rajagopalan #define EIB_EH_UDPCSUM_OK 2 68*b494511aSVenki Rajagopalan #define EIB_EH_CSUM_BAD 3 69*b494511aSVenki Rajagopalan #define EIB_EH_IPCSUM_OK 1 70*b494511aSVenki Rajagopalan 71*b494511aSVenki Rajagopalan /* 72*b494511aSVenki Rajagopalan * Some shortcuts 73*b494511aSVenki Rajagopalan */ 74*b494511aSVenki Rajagopalan #define EIB_TX_ENCAP_HDR 0xC0000000 75*b494511aSVenki Rajagopalan #define EIB_RX_ENCAP_TCPIP_OK 0xC5000000 76*b494511aSVenki Rajagopalan #define EIB_RX_ENCAP_UDPIP_OK 0xC9000000 77*b494511aSVenki Rajagopalan 78*b494511aSVenki Rajagopalan /* 79*b494511aSVenki Rajagopalan * Driver name 80*b494511aSVenki Rajagopalan */ 81*b494511aSVenki Rajagopalan #define EIB_DRV_NAME "eoib" 82*b494511aSVenki Rajagopalan 83*b494511aSVenki Rajagopalan /* 84*b494511aSVenki Rajagopalan * Currently, the gateway responds to login requests on the qpn that carried 85*b494511aSVenki Rajagopalan * the solication request, rather than on the qpn that carried the login 86*b494511aSVenki Rajagopalan * request. This means that EoIB nexus receives the acknowledgements from 87*b494511aSVenki Rajagopalan * gateways to login requests made by the individual EoIB instances, and must 88*b494511aSVenki Rajagopalan * pass this login ack information back to the appropriate EoIB instance. 89*b494511aSVenki Rajagopalan * 90*b494511aSVenki Rajagopalan * Now, the only field in the login ack packet that could identify the 91*b494511aSVenki Rajagopalan * individual EoIB instance is the vNIC id field, but this is a 16-bit field, 92*b494511aSVenki Rajagopalan * with the MSB reserved to indicate whether the mac/vlan is host-managed 93*b494511aSVenki Rajagopalan * or gateway-managed. This leaves us with just 15-bits to encode the EoIB 94*b494511aSVenki Rajagopalan * device instance and its Solaris vnic instance. For now, we divide this 95*b494511aSVenki Rajagopalan * field as a 6-bit vnic instance number (max Solaris vnics is 64) and a 96*b494511aSVenki Rajagopalan * 9-bit device instance number (max EoIB pseudo-NICs in a system is 512). 97*b494511aSVenki Rajagopalan * 98*b494511aSVenki Rajagopalan * The long-term solution is to get the gateway to respond directly to the 99*b494511aSVenki Rajagopalan * login requestor, so the requestor can use all 15-bits to identify its 100*b494511aSVenki Rajagopalan * Solaris vnic instance (max 32K) and leave the device instance limit to 101*b494511aSVenki Rajagopalan * the system limit. 102*b494511aSVenki Rajagopalan */ 103*b494511aSVenki Rajagopalan #define EIB_DVI_SHIFT 6 104*b494511aSVenki Rajagopalan #define EIB_DVI_MASK 0x1FF 105*b494511aSVenki Rajagopalan #define EIB_VNI_MASK 0x03F 106*b494511aSVenki Rajagopalan 107*b494511aSVenki Rajagopalan #define EIB_VNIC_INSTANCE(id) ((id) & EIB_VNI_MASK) 108*b494511aSVenki Rajagopalan #define EIB_DEVI_INSTANCE(id) (((id) >> EIB_DVI_SHIFT) & EIB_DVI_MASK) 109*b494511aSVenki Rajagopalan #define EIB_VNIC_ID(dvi, vni) \ 110*b494511aSVenki Rajagopalan ((((dvi) & EIB_DVI_MASK) << EIB_DVI_SHIFT) | ((vni) & EIB_VNI_MASK)) 111*b494511aSVenki Rajagopalan 112*b494511aSVenki Rajagopalan /* 113*b494511aSVenki Rajagopalan * Making VHUB_ID from vlan and portid 114*b494511aSVenki Rajagopalan */ 115*b494511aSVenki Rajagopalan #define EIB_VHUB_ID(portid, vlan) \ 116*b494511aSVenki Rajagopalan ((((uint_t)(portid) & 0xfff) << 12) | ((uint_t)(vlan) & 0xfff)) 117*b494511aSVenki Rajagopalan 118*b494511aSVenki Rajagopalan /* 119*b494511aSVenki Rajagopalan * NDI Events that individual EoIB instance will be interested in 120*b494511aSVenki Rajagopalan */ 121*b494511aSVenki Rajagopalan #define EIB_NDI_EVENT_GW_AVAILABLE "SUNW,eoib:gateway-available" 122*b494511aSVenki Rajagopalan #define EIB_NDI_EVENT_LOGIN_ACK "SUNW,eoib:vnic-login-ack" 123*b494511aSVenki Rajagopalan #define EIB_NDI_EVENT_GW_INFO_UPDATE "SUNW,eoib:gateway-info-update" 124*b494511aSVenki Rajagopalan 125*b494511aSVenki Rajagopalan /* 126*b494511aSVenki Rajagopalan * Properties for each eoib node created 127*b494511aSVenki Rajagopalan */ 128*b494511aSVenki Rajagopalan #define EIB_PROP_HCA_GUID "hca-guid" 129*b494511aSVenki Rajagopalan #define EIB_PROP_HCA_PORTNUM "hca-port#" 130*b494511aSVenki Rajagopalan #define EIB_PROP_GW_SYS_GUID "gw-system-guid" 131*b494511aSVenki Rajagopalan #define EIB_PROP_GW_GUID "gw-guid" 132*b494511aSVenki Rajagopalan #define EIB_PROP_GW_SN_PREFIX "gw-sn-prefix" 133*b494511aSVenki Rajagopalan #define EIB_PROP_GW_ADV_PERIOD "gw-adv-period" 134*b494511aSVenki Rajagopalan #define EIB_PROP_GW_KA_PERIOD "gw-ka-period" 135*b494511aSVenki Rajagopalan #define EIB_PROP_VNIC_KA_PERIOD "vnic-ka-period" 136*b494511aSVenki Rajagopalan #define EIB_PROP_GW_CTRL_QPN "gw-ctrl-qpn" 137*b494511aSVenki Rajagopalan #define EIB_PROP_GW_LID "gw-lid" 138*b494511aSVenki Rajagopalan #define EIB_PROP_GW_PORTID "gw-portid" 139*b494511aSVenki Rajagopalan #define EIB_PROP_GW_NUM_NET_VNICS "gw-num-net-vnics" 140*b494511aSVenki Rajagopalan #define EIB_PROP_GW_AVAILABLE "gw-available?" 141*b494511aSVenki Rajagopalan #define EIB_PROP_GW_HOST_VNICS "gw-host-vnics?" 142*b494511aSVenki Rajagopalan #define EIB_PROP_GW_SL "gw-sl" 143*b494511aSVenki Rajagopalan #define EIB_PROP_GW_N_RSS_QPN "gw-n-rss-qpn" 144*b494511aSVenki Rajagopalan #define EIB_PROP_GW_SYS_NAME "gw-system-name" 145*b494511aSVenki Rajagopalan #define EIB_PROP_GW_PORT_NAME "gw-port-name" 146*b494511aSVenki Rajagopalan #define EIB_PROP_GW_VENDOR_ID "gw-vendor-id" 147*b494511aSVenki Rajagopalan 148*b494511aSVenki Rajagopalan /* 149*b494511aSVenki Rajagopalan * Gateway information passed by eibnx to eoib. The lengths of character 150*b494511aSVenki Rajagopalan * strings should be longer than what is defined for these objects in fip.h, 151*b494511aSVenki Rajagopalan * to accomodate the terminating null. 152*b494511aSVenki Rajagopalan */ 153*b494511aSVenki Rajagopalan #define EIB_GW_SYSNAME_LEN 40 154*b494511aSVenki Rajagopalan #define EIB_GW_PORTNAME_LEN 12 155*b494511aSVenki Rajagopalan #define EIB_GW_VENDOR_LEN 12 156*b494511aSVenki Rajagopalan 157*b494511aSVenki Rajagopalan typedef struct eib_gw_info_s { 158*b494511aSVenki Rajagopalan ib_guid_t gi_system_guid; 159*b494511aSVenki Rajagopalan ib_guid_t gi_guid; 160*b494511aSVenki Rajagopalan ib_sn_prefix_t gi_sn_prefix; 161*b494511aSVenki Rajagopalan uint32_t gi_adv_period; 162*b494511aSVenki Rajagopalan uint32_t gi_ka_period; 163*b494511aSVenki Rajagopalan uint32_t gi_vnic_ka_period; 164*b494511aSVenki Rajagopalan ib_qpn_t gi_ctrl_qpn; 165*b494511aSVenki Rajagopalan ib_lid_t gi_lid; 166*b494511aSVenki Rajagopalan uint16_t gi_portid; 167*b494511aSVenki Rajagopalan uint16_t gi_num_net_vnics; 168*b494511aSVenki Rajagopalan uint8_t gi_flag_available; 169*b494511aSVenki Rajagopalan uint8_t gi_is_host_adm_vnics; 170*b494511aSVenki Rajagopalan uint8_t gi_sl; 171*b494511aSVenki Rajagopalan uint8_t gi_n_rss_qpn; 172*b494511aSVenki Rajagopalan uint8_t gi_system_name[EIB_GW_SYSNAME_LEN]; 173*b494511aSVenki Rajagopalan uint8_t gi_port_name[EIB_GW_PORTNAME_LEN]; 174*b494511aSVenki Rajagopalan uint8_t gi_vendor_id[EIB_GW_VENDOR_LEN]; 175*b494511aSVenki Rajagopalan } eib_gw_info_t; 176*b494511aSVenki Rajagopalan 177*b494511aSVenki Rajagopalan /* 178*b494511aSVenki Rajagopalan * Softint priority levels to use for data and control/admin cq handling 179*b494511aSVenki Rajagopalan * in EoIB leaf and nexus drivers 180*b494511aSVenki Rajagopalan */ 181*b494511aSVenki Rajagopalan #define EIB_SOFTPRI_DATA (DDI_INTR_SOFTPRI_MIN) 182*b494511aSVenki Rajagopalan #define EIB_SOFTPRI_CTL (DDI_INTR_SOFTPRI_MIN + 1) 183*b494511aSVenki Rajagopalan #define EIB_SOFTPRI_ADM (DDI_INTR_SOFTPRI_MIN + 1) 184*b494511aSVenki Rajagopalan 185*b494511aSVenki Rajagopalan #ifdef __cplusplus 186*b494511aSVenki Rajagopalan } 187*b494511aSVenki Rajagopalan #endif 188*b494511aSVenki Rajagopalan 189*b494511aSVenki Rajagopalan #endif /* _SYS_IB_EOIB_EIB_H */ 190