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