1 /******************************************************************************
2
3 Copyright (c) 2013-2015, Intel Corporation
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15
16 3. Neither the name of the Intel Corporation nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32 ******************************************************************************/
33 /*$FreeBSD$*/
34
35
36 #ifndef _IXL_H_
37 #define _IXL_H_
38
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/mbuf.h>
43 #include <sys/protosw.h>
44 #include <sys/socket.h>
45 #include <sys/malloc.h>
46 #include <sys/kernel.h>
47 #include <sys/module.h>
48 #include <sys/sockio.h>
49 #include <sys/eventhandler.h>
50
51 #include <net/if.h>
52 #include <net/if_var.h>
53 #include <net/if_arp.h>
54 #include <net/bpf.h>
55 #include <net/ethernet.h>
56 #include <net/if_dl.h>
57 #include <net/if_media.h>
58
59 #include <net/bpf.h>
60 #include <net/if_types.h>
61 #include <net/if_vlan_var.h>
62 #include <net/iflib.h>
63
64 #include <netinet/in_systm.h>
65 #include <netinet/in.h>
66 #include <netinet/if_ether.h>
67 #include <netinet/ip.h>
68 #include <netinet/ip6.h>
69 #include <netinet/tcp.h>
70 #include <netinet/tcp_lro.h>
71 #include <netinet/udp.h>
72 #include <netinet/sctp.h>
73
74 #include <machine/in_cksum.h>
75
76 #include <sys/bus.h>
77 #include <machine/bus.h>
78 #include <sys/rman.h>
79 #include <machine/resource.h>
80 #include <vm/vm.h>
81 #include <vm/pmap.h>
82 #include <machine/clock.h>
83 #include <dev/pci/pcivar.h>
84 #include <dev/pci/pcireg.h>
85 #include <sys/proc.h>
86 #include <sys/sysctl.h>
87 #include <sys/endian.h>
88 #include <sys/pcpu.h>
89 #include <sys/smp.h>
90 #include <machine/smp.h>
91
92 #ifdef PCI_IOV
93 #include <sys/nv.h>
94 #include <sys/iov_schema.h>
95 #include <dev/pci/pci_iov.h>
96 #endif
97
98 #include "ifdi_if.h"
99 #include "i40e_type.h"
100 #include "i40e_prototype.h"
101
102 MALLOC_DECLARE(M_IXL);
103
104 #if defined(IXL_DEBUG) || defined(IXL_DEBUG_SYSCTL)
105 #include <sys/sbuf.h>
106
107
108 #define MAC_FORMAT "%02x:%02x:%02x:%02x:%02x:%02x"
109 #define MAC_FORMAT_ARGS(mac_addr) \
110 (mac_addr)[0], (mac_addr)[1], (mac_addr)[2], (mac_addr)[3], \
111 (mac_addr)[4], (mac_addr)[5]
112 #define ON_OFF_STR(is_set) ((is_set) ? "On" : "Off")
113 #endif /* IXL_DEBUG || IXL_DEBUG_SYSCTL */
114
115 #ifdef IXL_DEBUG
116 /* Enable debug sysctls */
117 #ifndef IXL_DEBUG_SYSCTL
118 #define IXL_DEBUG_SYSCTL 1
119 #endif
120
121 #define _DBG_PRINTF(S, ...) printf("%s: " S "\n", __func__, ##__VA_ARGS__)
122 #define _DEV_DBG_PRINTF(dev, S, ...) device_printf(dev, "%s: " S "\n", __func__, ##__VA_ARGS__)
123 #define _IF_DBG_PRINTF(ifp, S, ...) if_printf(ifp, "%s: " S "\n", __func__, ##__VA_ARGS__)
124
125 /* Defines for printing generic debug information */
126 #define DPRINTF(...) _DBG_PRINTF(__VA_ARGS__)
127 #define DDPRINTF(...) _DEV_DBG_PRINTF(__VA_ARGS__)
128 #define IDPRINTF(...) _IF_DBG_PRINTF(__VA_ARGS__)
129
130 /* Defines for printing specific debug information */
131 #define DEBUG_INIT 1
132 #define DEBUG_IOCTL 1
133 #define DEBUG_HW 1
134
135 #define INIT_DEBUGOUT(...) if (DEBUG_INIT) _DBG_PRINTF(__VA_ARGS__)
136 #define INIT_DBG_DEV(...) if (DEBUG_INIT) _DEV_DBG_PRINTF(__VA_ARGS__)
137 #define INIT_DBG_IF(...) if (DEBUG_INIT) _IF_DBG_PRINTF(__VA_ARGS__)
138
139 #define IOCTL_DEBUGOUT(...) if (DEBUG_IOCTL) _DBG_PRINTF(__VA_ARGS__)
140 #define IOCTL_DBG_IF2(ifp, S, ...) if (DEBUG_IOCTL) \
141 if_printf(ifp, S "\n", ##__VA_ARGS__)
142 #define IOCTL_DBG_IF(...) if (DEBUG_IOCTL) _IF_DBG_PRINTF(__VA_ARGS__)
143
144 #define HW_DEBUGOUT(...) if (DEBUG_HW) _DBG_PRINTF(__VA_ARGS__)
145
146 #else /* no IXL_DEBUG */
147 #define DEBUG_INIT 0
148 #define DEBUG_IOCTL 0
149 #define DEBUG_HW 0
150
151 #define DPRINTF(...)
152 #define DDPRINTF(...)
153 #define IDPRINTF(...)
154
155 #define INIT_DEBUGOUT(...)
156 #define INIT_DBG_DEV(...)
157 #define INIT_DBG_IF(...)
158 #define IOCTL_DEBUGOUT(...)
159 #define IOCTL_DBG_IF2(...)
160 #define IOCTL_DBG_IF(...)
161 #define HW_DEBUGOUT(...)
162 #endif /* IXL_DEBUG */
163
164 /* Tunables */
165
166 /*
167 * Ring Descriptors Valid Range: 32-4096 Default Value: 1024 This value is the
168 * number of tx/rx descriptors allocated by the driver. Increasing this
169 * value allows the driver to queue more operations. Each descriptor is 16
170 * or 32 bytes (configurable in FVL)
171 */
172 #define DEFAULT_RING 1024
173 #define PERFORM_RING 2048
174 #define MAX_RING 4096
175 #define MIN_RING 32
176
177 /*
178 ** Default number of entries in Tx queue buf_ring.
179 */
180 #define SMALL_TXBRSZ 4096
181 /* This may require mbuf cluster tuning */
182 #define DEFAULT_TXBRSZ (SMALL_TXBRSZ * SMALL_TXBRSZ)
183
184 /* Alignment for rings */
185 #define DBA_ALIGN 128
186
187 /*
188 * This parameter controls the maximum no of times the driver will loop in
189 * the isr. Minimum Value = 1
190 */
191 #define MAX_LOOP 10
192
193 /*
194 * This is the max watchdog interval, ie. the time that can
195 * pass between any two TX clean operations, such only happening
196 * when the TX hardware is functioning.
197 */
198 #define IXL_WATCHDOG (10 * hz)
199
200 /*
201 * This parameters control when the driver calls the routine to reclaim
202 * transmit descriptors.
203 */
204 #define IXL_TX_CLEANUP_THRESHOLD (que->num_desc / 8)
205 #define IXL_TX_OP_THRESHOLD (que->num_desc / 32)
206
207 /* Flow control constants */
208 #define IXL_FC_PAUSE 0xFFFF
209 #define IXL_FC_HI 0x20000
210 #define IXL_FC_LO 0x10000
211
212 #define MAX_MULTICAST_ADDR 128
213
214 #define IXL_BAR 3
215 #define IXL_ADM_LIMIT 2
216 #define IXL_TSO_SIZE 65535
217 #define IXL_TX_BUF_SZ ((u32) 1514)
218 #define IXL_AQ_BUF_SZ ((u32) 4096)
219 #define IXL_RX_HDR 128
220 /* Controls the length of the Admin Queue */
221 #define IXL_AQ_LEN 256
222 #define IXL_AQ_LEN_MAX 1024
223 #define IXL_AQ_BUFSZ 4096
224 #define IXL_RX_LIMIT 512
225 #define IXL_RX_ITR 0
226 #define IXL_TX_ITR 1
227 #define IXL_ITR_NONE 3
228 #define IXL_QUEUE_EOL 0x7FF
229 #define IXL_MAX_FRAME 0x2600
230 #define IXL_MAX_TX_SEGS 8
231 #define IXL_MAX_TSO_SEGS 66
232 #define IXL_SPARSE_CHAIN 6
233 #define IXL_QUEUE_HUNG 0x80000000
234 #define IXL_KEYSZ 10
235
236 #define IXL_VF_MAX_BUFFER 0x3F80
237 #define IXL_VF_MAX_HDR_BUFFER 0x840
238 #define IXL_VF_MAX_FRAME 0x3FFF
239
240 /* ERJ: hardware can support ~1.5k filters between all functions */
241 #define IXL_MAX_FILTERS 256
242 #define IXL_MAX_TX_BUSY 10
243
244 #define IXL_NVM_VERSION_LO_SHIFT 0
245 #define IXL_NVM_VERSION_LO_MASK (0xff << IXL_NVM_VERSION_LO_SHIFT)
246 #define IXL_NVM_VERSION_HI_SHIFT 12
247 #define IXL_NVM_VERSION_HI_MASK (0xf << IXL_NVM_VERSION_HI_SHIFT)
248
249
250 /*
251 * Interrupt Moderation parameters
252 */
253 #define IXL_MAX_ITR 0x07FF
254 #define IXL_ITR_100K 0x0005
255 #define IXL_ITR_20K 0x0019
256 #define IXL_ITR_8K 0x003E
257 #define IXL_ITR_4K 0x007A
258 #define IXL_ITR_DYNAMIC 0x8000
259 #define IXL_LOW_LATENCY 0
260 #define IXL_AVE_LATENCY 1
261 #define IXL_BULK_LATENCY 2
262
263 /* MacVlan Flags */
264 #define IXL_FILTER_USED (u16)(1 << 0)
265 #define IXL_FILTER_VLAN (u16)(1 << 1)
266 #define IXL_FILTER_ADD (u16)(1 << 2)
267 #define IXL_FILTER_DEL (u16)(1 << 3)
268 #define IXL_FILTER_MC (u16)(1 << 4)
269
270 /* used in the vlan field of the filter when not a vlan */
271 #define IXL_VLAN_ANY -1
272
273 #define CSUM_OFFLOAD_IPV4 (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
274 #define CSUM_OFFLOAD_IPV6 (CSUM_TCP_IPV6|CSUM_UDP_IPV6|CSUM_SCTP_IPV6)
275 #define CSUM_OFFLOAD (CSUM_OFFLOAD_IPV4|CSUM_OFFLOAD_IPV6|CSUM_TSO)
276
277 /* Misc flags for ixl_vsi.flags */
278 #define IXL_FLAGS_KEEP_TSO4 (1 << 0)
279 #define IXL_FLAGS_KEEP_TSO6 (1 << 1)
280
281 #define IXL_VF_RESET_TIMEOUT 100
282
283 #define IXL_VSI_DATA_PORT 0x01
284
285 #define IXLV_MAX_QUEUES 16
286 #define IXL_MAX_VSI_QUEUES (2 * (I40E_VSILAN_QTABLE_MAX_INDEX + 1))
287
288 #define IXL_RX_CTX_BASE_UNITS 128
289 #define IXL_TX_CTX_BASE_UNITS 128
290
291 #define IXL_VPINT_LNKLSTN_REG(hw, vector, vf_num) \
292 I40E_VPINT_LNKLSTN(((vector) - 1) + \
293 (((hw)->func_caps.num_msix_vectors_vf - 1) * (vf_num)))
294
295 #define IXL_VFINT_DYN_CTLN_REG(hw, vector, vf_num) \
296 I40E_VFINT_DYN_CTLN(((vector) - 1) + \
297 (((hw)->func_caps.num_msix_vectors_vf - 1) * (vf_num)))
298
299 #define IXL_PF_PCI_CIAA_VF_DEVICE_STATUS 0xAA
300
301 #define IXL_PF_PCI_CIAD_VF_TRANS_PENDING_MASK 0x20
302
303 #define IXL_GLGEN_VFLRSTAT_INDEX(glb_vf) ((glb_vf) / 32)
304 #define IXL_GLGEN_VFLRSTAT_MASK(glb_vf) (1 << ((glb_vf) % 32))
305
306 #define IXL_MAX_ITR_IDX 3
307
308 #define IXL_END_OF_INTR_LNKLST 0x7FF
309
310 #if __FreeBSD_version >= 1100036
311 #define IXL_SET_IPACKETS(vsi, count) (vsi)->ipackets = (count)
312 #define IXL_SET_IERRORS(vsi, count) (vsi)->ierrors = (count)
313 #define IXL_SET_OPACKETS(vsi, count) (vsi)->opackets = (count)
314 #define IXL_SET_OERRORS(vsi, count) (vsi)->oerrors = (count)
315 #define IXL_SET_COLLISIONS(vsi, count) /* Do nothing; collisions is always 0. */
316 #define IXL_SET_IBYTES(vsi, count) (vsi)->ibytes = (count)
317 #define IXL_SET_OBYTES(vsi, count) (vsi)->obytes = (count)
318 #define IXL_SET_IMCASTS(vsi, count) (vsi)->imcasts = (count)
319 #define IXL_SET_OMCASTS(vsi, count) (vsi)->omcasts = (count)
320 #define IXL_SET_IQDROPS(vsi, count) (vsi)->iqdrops = (count)
321 #define IXL_SET_OQDROPS(vsi, count) (vsi)->oqdrops = (count)
322 #define IXL_SET_NOPROTO(vsi, count) (vsi)->noproto = (count)
323 #else
324 #define IXL_SET_IPACKETS(vsi, count) (vsi)->ifp->if_ipackets = (count)
325 #define IXL_SET_IERRORS(vsi, count) (vsi)->ifp->if_ierrors = (count)
326 #define IXL_SET_OPACKETS(vsi, count) (vsi)->ifp->if_opackets = (count)
327 #define IXL_SET_OERRORS(vsi, count) (vsi)->ifp->if_oerrors = (count)
328 #define IXL_SET_COLLISIONS(vsi, count) (vsi)->ifp->if_collisions = (count)
329 #define IXL_SET_IBYTES(vsi, count) (vsi)->ifp->if_ibytes = (count)
330 #define IXL_SET_OBYTES(vsi, count) (vsi)->ifp->if_obytes = (count)
331 #define IXL_SET_IMCASTS(vsi, count) (vsi)->ifp->if_imcasts = (count)
332 #define IXL_SET_OMCASTS(vsi, count) (vsi)->ifp->if_omcasts = (count)
333 #define IXL_SET_IQDROPS(vsi, count) (vsi)->ifp->if_iqdrops = (count)
334 #define IXL_SET_OQDROPS(vsi, odrops) (vsi)->ifp->if_snd.ifq_drops = (odrops)
335 #define IXL_SET_NOPROTO(vsi, count) (vsi)->noproto = (count)
336 #endif
337
338 /*
339 *****************************************************************************
340 * vendor_info_array
341 *
342 * This array contains the list of Subvendor/Subdevice IDs on which the driver
343 * should load.
344 *
345 *****************************************************************************
346 */
347 typedef struct _ixl_vendor_info_t {
348 unsigned int vendor_id;
349 unsigned int device_id;
350 unsigned int subvendor_id;
351 unsigned int subdevice_id;
352 unsigned int index;
353 } ixl_vendor_info_t;
354
355
356 struct ixl_tx_buf {
357 u32 eop_index;
358 };
359
360 /*
361 ** This struct has multiple uses, multicast
362 ** addresses, vlans, and mac filters all use it.
363 */
364 struct ixl_mac_filter {
365 SLIST_ENTRY(ixl_mac_filter) next;
366 u8 macaddr[ETHER_ADDR_LEN];
367 s16 vlan;
368 u16 flags;
369 };
370
371
372 /*
373 * The Transmit ring control struct
374 */
375 struct tx_ring {
376 struct ixl_queue *que;
377 u32 tail;
378 struct i40e_tx_desc *tx_base;
379 uint64_t tx_paddr;
380 u16 next_avail;
381 u16 next_to_clean;
382 u16 atr_rate;
383 u16 atr_count;
384 u16 itr;
385 u16 latency;
386 struct ixl_tx_buf *tx_buffers;
387 volatile u16 avail;
388 u32 cmd;
389 bus_dma_tag_t tx_tag;
390 bus_dma_tag_t tso_tag;
391
392 /* Used for Dynamic ITR calculation */
393 u32 packets;
394 u32 bytes;
395
396 /* Soft Stats */
397 u64 tx_bytes;
398 u64 no_desc;
399 u64 total_packets;
400 };
401
402
403 /*
404 * The Receive ring control struct
405 */
406 struct rx_ring {
407 struct ixl_queue *que;
408 union i40e_rx_desc *rx_base;
409 uint64_t rx_paddr;
410 bool discard;
411 u16 itr;
412 u16 latency;
413
414 u32 mbuf_sz;
415 u32 tail;
416 bus_dma_tag_t htag;
417 bus_dma_tag_t ptag;
418
419 /* Used for Dynamic ITR calculation */
420 u32 packets;
421 u32 bytes;
422
423 /* Soft stats */
424 u64 split;
425 u64 rx_packets;
426 u64 rx_bytes;
427 u64 discarded;
428 u64 not_done;
429 };
430
431 /*
432 ** Driver queue struct: this is the interrupt container
433 ** for the associated tx and rx ring pair.
434 */
435 struct ixl_queue {
436 struct ixl_vsi *vsi;
437 u32 me;
438 u32 msix; /* This queue's MSIX vector */
439 u32 eims; /* This queue's EIMS bit */
440 struct resource *res;
441 void *tag;
442 int busy;
443 struct tx_ring txr;
444 struct rx_ring rxr;
445
446 struct if_irq que_irq;
447
448 /* Queue stats */
449 u64 irqs;
450 u64 tso;
451 u64 mbuf_defrag_failed;
452 u64 mbuf_hdr_failed;
453 u64 mbuf_pkt_failed;
454 u64 tx_map_avail;
455 u64 tx_dma_setup;
456 u64 dropped_pkts;
457 };
458
459 #define DOWNCAST(sctx) ((struct ixl_vsi *)(sctx))
460 /*
461 ** Virtual Station interface:
462 ** there would be one of these per traffic class/type
463 ** for now just one, and its embedded in the pf
464 */
465 SLIST_HEAD(ixl_ftl_head, ixl_mac_filter);
466
467 struct ixl_vsi {
468 if_ctx_t ctx;
469 if_softc_ctx_t shared;
470
471 struct ifnet *ifp;
472 struct ifmedia *media;
473
474 #define num_queues shared->isc_nqsets
475 #define max_frame_size shared->isc_max_frame_size
476
477 void *back;
478 struct i40e_hw *hw;
479 u64 que_mask;
480 int id;
481 u16 vsi_num;
482 u16 msix_base; /* station base MSIX vector */
483 u16 first_queue;
484 u16 rx_itr_setting;
485 u16 tx_itr_setting;
486 struct ixl_queue *queues; /* head of queues */
487 bool link_active;
488 u16 seid;
489 u32 link_speed;
490 struct if_irq irq;
491 u16 uplink_seid;
492 u16 downlink_seid;
493
494 /* MAC/VLAN Filter list */
495 struct ixl_ftl_head ftl;
496 u16 num_macs;
497
498 struct i40e_aqc_vsi_properties_data info;
499
500 u16 num_vlans;
501
502 /* Per-VSI stats from hardware */
503 struct i40e_eth_stats eth_stats;
504 struct i40e_eth_stats eth_stats_offsets;
505 bool stat_offsets_loaded;
506 /* VSI stat counters */
507 u64 ipackets;
508 u64 ierrors;
509 u64 opackets;
510 u64 oerrors;
511 u64 ibytes;
512 u64 obytes;
513 u64 imcasts;
514 u64 omcasts;
515 u64 iqdrops;
516 u64 oqdrops;
517 u64 noproto;
518
519 /* Driver statistics */
520 u64 hw_filters_del;
521 u64 hw_filters_add;
522
523 /* Misc. */
524 u64 active_queues;
525 u64 flags;
526 struct sysctl_oid *vsi_node;
527 };
528
529 /*
530 ** Find the next available unused filter
531 */
532 static inline struct ixl_mac_filter *
ixl_get_filter(struct ixl_vsi * vsi)533 ixl_get_filter(struct ixl_vsi *vsi)
534 {
535 struct ixl_mac_filter *f;
536
537 /* create a new empty filter */
538 f = malloc(sizeof(struct ixl_mac_filter),
539 M_IXL, M_NOWAIT | M_ZERO);
540 if (f)
541 SLIST_INSERT_HEAD(&vsi->ftl, f, next);
542
543 return (f);
544 }
545
546 /*
547 ** Compare two ethernet addresses
548 */
549 static inline bool
cmp_etheraddr(const u8 * ea1,const u8 * ea2)550 cmp_etheraddr(const u8 *ea1, const u8 *ea2)
551 {
552
553 return (bcmp(ea1, ea2, 6) == 0);
554 }
555
556 /*
557 * Info for stats sysctls
558 */
559 struct ixl_sysctl_info {
560 u64 *stat;
561 char *name;
562 char *description;
563 };
564
565 extern int ixl_atr_rate;
566
567 /*
568 ** ixl_fw_version_str - format the FW and NVM version strings
569 */
570 static inline char *
ixl_fw_version_str(struct i40e_hw * hw)571 ixl_fw_version_str(struct i40e_hw *hw)
572 {
573 static char buf[32];
574
575 snprintf(buf, sizeof(buf),
576 "f%d.%d a%d.%d n%02x.%02x e%08x",
577 hw->aq.fw_maj_ver, hw->aq.fw_min_ver,
578 hw->aq.api_maj_ver, hw->aq.api_min_ver,
579 (hw->nvm.version & IXL_NVM_VERSION_HI_MASK) >>
580 IXL_NVM_VERSION_HI_SHIFT,
581 (hw->nvm.version & IXL_NVM_VERSION_LO_MASK) >>
582 IXL_NVM_VERSION_LO_SHIFT,
583 hw->nvm.eetrack);
584 return buf;
585 }
586
587 /*********************************************************************
588 * TXRX Function prototypes
589 *********************************************************************/
590 void ixl_init_tx_ring(struct ixl_queue *);
591
592 #ifdef IXL_FDIR
593 void ixl_atr(struct ixl_queue *, struct tcphdr *, int);
594 #endif
595 #if __FreeBSD_version >= 1100000
596 uint64_t ixl_get_counter(if_t ifp, ift_counter cnt);
597 #endif
598
599 /*********************************************************************
600 * common Function prototypes
601 *********************************************************************/
602
603 int ixl_if_media_change(if_ctx_t);
604 int ixl_if_queues_alloc(if_ctx_t, caddr_t *, uint64_t *, int);
605 void ixl_if_queues_free(if_ctx_t ctx);
606
607 #endif /* _IXL_H_ */
608