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