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