Deleted Added
full compact
efx.h (256281) efx.h (265884)
1/*-
2 * Copyright 2006-2009 Solarflare Communications Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 *
1/*-
2 * Copyright 2006-2009 Solarflare Communications Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 *
25 * $FreeBSD: stable/10/sys/dev/sfxge/common/efx.h 228078 2011-11-28 17:19:05Z philip $
25 * $FreeBSD: stable/10/sys/dev/sfxge/common/efx.h 265884 2014-05-11 17:18:09Z gnn $
26 */
27
28#ifndef _SYS_EFX_H
29#define _SYS_EFX_H
30
31#include "efsys.h"
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37#define EFX_STATIC_ASSERT(_cond) ((void)sizeof(char[(_cond) ? 1 : -1]))
38
39#define EFX_ARRAY_SIZE(_array) (sizeof(_array) / sizeof((_array)[0]))
40
41#ifndef EFSYS_MEM_IS_NULL
42#define EFSYS_MEM_IS_NULL(_esmp) ((_esmp)->esm_base == NULL)
43#endif
44
45typedef enum efx_family_e {
46 EFX_FAMILY_INVALID,
47 EFX_FAMILY_FALCON,
48 EFX_FAMILY_SIENA,
49 EFX_FAMILY_NTYPES
50} efx_family_t;
51
52extern __checkReturn int
53efx_family(
54 __in uint16_t venid,
55 __in uint16_t devid,
56 __out efx_family_t *efp);
57
58extern __checkReturn int
59efx_infer_family(
60 __in efsys_bar_t *esbp,
61 __out efx_family_t *efp);
62
63#define EFX_PCI_VENID_SFC 0x1924
64#define EFX_PCI_DEVID_FALCON 0x0710
65#define EFX_PCI_DEVID_BETHPAGE 0x0803
66#define EFX_PCI_DEVID_SIENA 0x0813
67#define EFX_PCI_DEVID_SIENA_F1_UNINIT 0x0810
68
69#define EFX_MEM_BAR 2
70
71/* Error codes */
72
73enum {
74 EFX_ERR_INVALID,
75 EFX_ERR_SRAM_OOB,
76 EFX_ERR_BUFID_DC_OOB,
77 EFX_ERR_MEM_PERR,
78 EFX_ERR_RBUF_OWN,
79 EFX_ERR_TBUF_OWN,
80 EFX_ERR_RDESQ_OWN,
81 EFX_ERR_TDESQ_OWN,
82 EFX_ERR_EVQ_OWN,
83 EFX_ERR_EVFF_OFLO,
84 EFX_ERR_ILL_ADDR,
85 EFX_ERR_SRAM_PERR,
86 EFX_ERR_NCODES
87};
88
89/* NIC */
90
91typedef struct efx_nic_s efx_nic_t;
92
93extern __checkReturn int
94efx_nic_create(
95 __in efx_family_t family,
96 __in efsys_identifier_t *esip,
97 __in efsys_bar_t *esbp,
98 __in efsys_lock_t *eslp,
99 __deref_out efx_nic_t **enpp);
100
101extern __checkReturn int
102efx_nic_probe(
103 __in efx_nic_t *enp);
104
105#if EFSYS_OPT_PCIE_TUNE
106
107extern __checkReturn int
108efx_nic_pcie_tune(
109 __in efx_nic_t *enp,
110 unsigned int nlanes);
111
112extern __checkReturn int
113efx_nic_pcie_extended_sync(
114 __in efx_nic_t *enp);
115
116#endif /* EFSYS_OPT_PCIE_TUNE */
117
118extern __checkReturn int
119efx_nic_init(
120 __in efx_nic_t *enp);
121
122extern __checkReturn int
123efx_nic_reset(
124 __in efx_nic_t *enp);
125
126#if EFSYS_OPT_DIAG
127
128extern __checkReturn int
129efx_nic_register_test(
130 __in efx_nic_t *enp);
131
132#endif /* EFSYS_OPT_DIAG */
133
134extern void
135efx_nic_fini(
136 __in efx_nic_t *enp);
137
138extern void
139efx_nic_unprobe(
140 __in efx_nic_t *enp);
141
142extern void
143efx_nic_destroy(
144 __in efx_nic_t *enp);
145
146#if EFSYS_OPT_MCDI
147
148typedef struct efx_mcdi_req_s efx_mcdi_req_t;
149
150typedef enum efx_mcdi_exception_e {
151 EFX_MCDI_EXCEPTION_MC_REBOOT,
152 EFX_MCDI_EXCEPTION_MC_BADASSERT,
153} efx_mcdi_exception_t;
154
155typedef struct efx_mcdi_transport_s {
156 void *emt_context;
157 void (*emt_execute)(void *, efx_mcdi_req_t *);
158 void (*emt_ev_cpl)(void *);
159 void (*emt_exception)(void *, efx_mcdi_exception_t);
160} efx_mcdi_transport_t;
161
162extern __checkReturn int
163efx_mcdi_init(
164 __in efx_nic_t *enp,
165 __in const efx_mcdi_transport_t *mtp);
166
167extern __checkReturn int
168efx_mcdi_reboot(
169 __in efx_nic_t *enp);
170
171extern void
172efx_mcdi_request_start(
173 __in efx_nic_t *enp,
174 __in efx_mcdi_req_t *emrp,
175 __in boolean_t ev_cpl);
176
177extern __checkReturn boolean_t
178efx_mcdi_request_poll(
179 __in efx_nic_t *enp);
180
181extern __checkReturn boolean_t
182efx_mcdi_request_abort(
183 __in efx_nic_t *enp);
184
185extern void
186efx_mcdi_fini(
187 __in efx_nic_t *enp);
188
189#endif /* EFSYS_OPT_MCDI */
190
191/* INTR */
192
193#define EFX_NINTR_FALCON 64
194#define EFX_NINTR_SIENA 1024
195
196typedef enum efx_intr_type_e {
197 EFX_INTR_INVALID = 0,
198 EFX_INTR_LINE,
199 EFX_INTR_MESSAGE,
200 EFX_INTR_NTYPES
201} efx_intr_type_t;
202
203#define EFX_INTR_SIZE (sizeof (efx_oword_t))
204
205extern __checkReturn int
206efx_intr_init(
207 __in efx_nic_t *enp,
208 __in efx_intr_type_t type,
209 __in efsys_mem_t *esmp);
210
211extern void
212efx_intr_enable(
213 __in efx_nic_t *enp);
214
215extern void
216efx_intr_disable(
217 __in efx_nic_t *enp);
218
219extern void
220efx_intr_disable_unlocked(
221 __in efx_nic_t *enp);
222
223#define EFX_INTR_NEVQS 32
224
225extern __checkReturn int
226efx_intr_trigger(
227 __in efx_nic_t *enp,
228 __in unsigned int level);
229
230extern void
231efx_intr_status_line(
232 __in efx_nic_t *enp,
233 __out boolean_t *fatalp,
234 __out uint32_t *maskp);
235
236extern void
237efx_intr_status_message(
238 __in efx_nic_t *enp,
239 __in unsigned int message,
240 __out boolean_t *fatalp);
241
242extern void
243efx_intr_fatal(
244 __in efx_nic_t *enp);
245
246extern void
247efx_intr_fini(
248 __in efx_nic_t *enp);
249
250/* MAC */
251
252#if EFSYS_OPT_MAC_STATS
253
254/* START MKCONFIG GENERATED EfxHeaderMacBlock bb8d39428b6fdcf5 */
255typedef enum efx_mac_stat_e {
256 EFX_MAC_RX_OCTETS,
257 EFX_MAC_RX_PKTS,
258 EFX_MAC_RX_UNICST_PKTS,
259 EFX_MAC_RX_MULTICST_PKTS,
260 EFX_MAC_RX_BRDCST_PKTS,
261 EFX_MAC_RX_PAUSE_PKTS,
262 EFX_MAC_RX_LE_64_PKTS,
263 EFX_MAC_RX_65_TO_127_PKTS,
264 EFX_MAC_RX_128_TO_255_PKTS,
265 EFX_MAC_RX_256_TO_511_PKTS,
266 EFX_MAC_RX_512_TO_1023_PKTS,
267 EFX_MAC_RX_1024_TO_15XX_PKTS,
268 EFX_MAC_RX_GE_15XX_PKTS,
269 EFX_MAC_RX_ERRORS,
270 EFX_MAC_RX_FCS_ERRORS,
271 EFX_MAC_RX_DROP_EVENTS,
272 EFX_MAC_RX_FALSE_CARRIER_ERRORS,
273 EFX_MAC_RX_SYMBOL_ERRORS,
274 EFX_MAC_RX_ALIGN_ERRORS,
275 EFX_MAC_RX_INTERNAL_ERRORS,
276 EFX_MAC_RX_JABBER_PKTS,
277 EFX_MAC_RX_LANE0_CHAR_ERR,
278 EFX_MAC_RX_LANE1_CHAR_ERR,
279 EFX_MAC_RX_LANE2_CHAR_ERR,
280 EFX_MAC_RX_LANE3_CHAR_ERR,
281 EFX_MAC_RX_LANE0_DISP_ERR,
282 EFX_MAC_RX_LANE1_DISP_ERR,
283 EFX_MAC_RX_LANE2_DISP_ERR,
284 EFX_MAC_RX_LANE3_DISP_ERR,
285 EFX_MAC_RX_MATCH_FAULT,
286 EFX_MAC_RX_NODESC_DROP_CNT,
287 EFX_MAC_TX_OCTETS,
288 EFX_MAC_TX_PKTS,
289 EFX_MAC_TX_UNICST_PKTS,
290 EFX_MAC_TX_MULTICST_PKTS,
291 EFX_MAC_TX_BRDCST_PKTS,
292 EFX_MAC_TX_PAUSE_PKTS,
293 EFX_MAC_TX_LE_64_PKTS,
294 EFX_MAC_TX_65_TO_127_PKTS,
295 EFX_MAC_TX_128_TO_255_PKTS,
296 EFX_MAC_TX_256_TO_511_PKTS,
297 EFX_MAC_TX_512_TO_1023_PKTS,
298 EFX_MAC_TX_1024_TO_15XX_PKTS,
299 EFX_MAC_TX_GE_15XX_PKTS,
300 EFX_MAC_TX_ERRORS,
301 EFX_MAC_TX_SGL_COL_PKTS,
302 EFX_MAC_TX_MULT_COL_PKTS,
303 EFX_MAC_TX_EX_COL_PKTS,
304 EFX_MAC_TX_LATE_COL_PKTS,
305 EFX_MAC_TX_DEF_PKTS,
306 EFX_MAC_TX_EX_DEF_PKTS,
307 EFX_MAC_NSTATS
308} efx_mac_stat_t;
309
310/* END MKCONFIG GENERATED EfxHeaderMacBlock */
311
312#endif /* EFSYS_OPT_MAC_STATS */
313
314typedef enum efx_link_mode_e {
315 EFX_LINK_UNKNOWN = 0,
316 EFX_LINK_DOWN,
317 EFX_LINK_10HDX,
318 EFX_LINK_10FDX,
319 EFX_LINK_100HDX,
320 EFX_LINK_100FDX,
321 EFX_LINK_1000HDX,
322 EFX_LINK_1000FDX,
323 EFX_LINK_10000FDX,
324 EFX_LINK_NMODES
325} efx_link_mode_t;
326
327#define EFX_MAC_SDU_MAX 9202
328
329#define EFX_MAC_PDU(_sdu) \
330 P2ROUNDUP(((_sdu) \
331 + /* EtherII */ 14 \
332 + /* VLAN */ 4 \
333 + /* CRC */ 4 \
334 + /* bug16011 */ 16), \
335 (1 << 3))
336
337#define EFX_MAC_PDU_MIN 60
338#define EFX_MAC_PDU_MAX EFX_MAC_PDU(EFX_MAC_SDU_MAX)
339
340extern __checkReturn int
341efx_mac_pdu_set(
342 __in efx_nic_t *enp,
343 __in size_t pdu);
344
345extern __checkReturn int
346efx_mac_addr_set(
347 __in efx_nic_t *enp,
348 __in uint8_t *addr);
349
350extern __checkReturn int
351efx_mac_filter_set(
352 __in efx_nic_t *enp,
353 __in boolean_t unicst,
354 __in boolean_t brdcst);
355
356extern __checkReturn int
357efx_mac_drain(
358 __in efx_nic_t *enp,
359 __in boolean_t enabled);
360
361extern __checkReturn int
362efx_mac_up(
363 __in efx_nic_t *enp,
364 __out boolean_t *mac_upp);
365
366#define EFX_FCNTL_RESPOND 0x00000001
367#define EFX_FCNTL_GENERATE 0x00000002
368
369extern __checkReturn int
370efx_mac_fcntl_set(
371 __in efx_nic_t *enp,
372 __in unsigned int fcntl,
373 __in boolean_t autoneg);
374
375extern void
376efx_mac_fcntl_get(
377 __in efx_nic_t *enp,
378 __out unsigned int *fcntl_wantedp,
379 __out unsigned int *fcntl_linkp);
380
381#define EFX_MAC_HASH_BITS (1 << 8)
382
383extern __checkReturn int
384efx_mac_hash_set(
385 __in efx_nic_t *enp,
386 __in_ecount(EFX_MAC_HASH_BITS) unsigned int const *bucket);
387
388#if EFSYS_OPT_MAC_STATS
389
390#if EFSYS_OPT_NAMES
391
392extern __checkReturn const char __cs *
393efx_mac_stat_name(
394 __in efx_nic_t *enp,
395 __in unsigned int id);
396
397#endif /* EFSYS_OPT_NAMES */
398
399#define EFX_MAC_STATS_SIZE 0x400
400
401/*
402 * Upload mac statistics supported by the hardware into the given buffer.
403 *
404 * The reference buffer must be at least %EFX_MAC_STATS_SIZE bytes,
405 * and page aligned.
406 *
407 * The hardware will only DMA statistics that it understands (of course).
408 * Drivers should not make any assumptions about which statistics are
409 * supported, especially when the statistics are generated by firmware.
410 *
411 * Thus, drivers should zero this buffer before use, so that not-understood
412 * statistics read back as zero.
413 */
414extern __checkReturn int
415efx_mac_stats_upload(
416 __in efx_nic_t *enp,
417 __in efsys_mem_t *esmp);
418
419extern __checkReturn int
420efx_mac_stats_periodic(
421 __in efx_nic_t *enp,
422 __in efsys_mem_t *esmp,
423 __in uint16_t period_ms,
424 __in boolean_t events);
425
426extern __checkReturn int
427efx_mac_stats_update(
428 __in efx_nic_t *enp,
429 __in efsys_mem_t *esmp,
430 __inout_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat,
431 __out_opt uint32_t *generationp);
432
433#endif /* EFSYS_OPT_MAC_STATS */
434
435/* MON */
436
437typedef enum efx_mon_type_e {
438 EFX_MON_INVALID = 0,
439 EFX_MON_NULL,
440 EFX_MON_LM87,
441 EFX_MON_MAX6647,
442 EFX_MON_SFC90X0,
443 EFX_MON_NTYPES
444} efx_mon_type_t;
445
446#if EFSYS_OPT_NAMES
447
448extern const char __cs *
449efx_mon_name(
450 __in efx_nic_t *enp);
451
452#endif /* EFSYS_OPT_NAMES */
453
454extern __checkReturn int
455efx_mon_init(
456 __in efx_nic_t *enp);
457
458#if EFSYS_OPT_MON_STATS
459
460#define EFX_MON_STATS_SIZE 0x100
461
462/* START MKCONFIG GENERATED MonitorHeaderStatsBlock 16a14e61aa4f8d80 */
463typedef enum efx_mon_stat_e {
464 EFX_MON_STAT_2_5V,
465 EFX_MON_STAT_VCCP1,
466 EFX_MON_STAT_VCC,
467 EFX_MON_STAT_5V,
468 EFX_MON_STAT_12V,
469 EFX_MON_STAT_VCCP2,
470 EFX_MON_STAT_EXT_TEMP,
471 EFX_MON_STAT_INT_TEMP,
472 EFX_MON_STAT_AIN1,
473 EFX_MON_STAT_AIN2,
474 EFX_MON_STAT_INT_COOLING,
475 EFX_MON_STAT_EXT_COOLING,
476 EFX_MON_STAT_1V,
477 EFX_MON_STAT_1_2V,
478 EFX_MON_STAT_1_8V,
479 EFX_MON_STAT_3_3V,
480 EFX_MON_NSTATS
481} efx_mon_stat_t;
482
483/* END MKCONFIG GENERATED MonitorHeaderStatsBlock */
484
485typedef enum efx_mon_stat_state_e {
486 EFX_MON_STAT_STATE_OK = 0,
487 EFX_MON_STAT_STATE_WARNING = 1,
488 EFX_MON_STAT_STATE_FATAL = 2,
489 EFX_MON_STAT_STATE_BROKEN = 3,
490} efx_mon_stat_state_t;
491
492typedef struct efx_mon_stat_value_t {
493 uint16_t emsv_value;
494 uint16_t emsv_state;
495} efx_mon_stat_value_t;
496
497#if EFSYS_OPT_NAMES
498
499extern const char __cs *
500efx_mon_stat_name(
501 __in efx_nic_t *enp,
502 __in efx_mon_stat_t id);
503
504#endif /* EFSYS_OPT_NAMES */
505
506extern __checkReturn int
507efx_mon_stats_update(
508 __in efx_nic_t *enp,
509 __in efsys_mem_t *esmp,
510 __out_ecount(EFX_MON_NSTATS) efx_mon_stat_value_t *values);
511
512#endif /* EFSYS_OPT_MON_STATS */
513
514extern void
515efx_mon_fini(
516 __in efx_nic_t *enp);
517
518/* PHY */
519
520#define PMA_PMD_MMD 1
521#define PCS_MMD 3
522#define PHY_XS_MMD 4
523#define DTE_XS_MMD 5
524#define AN_MMD 7
525#define CL22EXT_MMD 29
526
527#define MAXMMD ((1 << 5) - 1)
528
529/* PHY types */
530#define EFX_PHY_NULL 0x0
531#define EFX_PHY_TXC43128 0x1
532#define EFX_PHY_SFX7101 0x3
533#define EFX_PHY_QT2022C2 0x4
534#define EFX_PHY_SFT9001A 0x8
535#define EFX_PHY_QT2025C 0x9
536#define EFX_PHY_SFT9001B 0xa
537#define EFX_PHY_QLX111V 0xc
538
539extern __checkReturn int
540efx_phy_verify(
541 __in efx_nic_t *enp);
542
543#if EFSYS_OPT_PHY_LED_CONTROL
544
545typedef enum efx_phy_led_mode_e {
546 EFX_PHY_LED_DEFAULT = 0,
547 EFX_PHY_LED_OFF,
548 EFX_PHY_LED_ON,
549 EFX_PHY_LED_FLASH,
550 EFX_PHY_LED_NMODES
551} efx_phy_led_mode_t;
552
553extern __checkReturn int
554efx_phy_led_set(
555 __in efx_nic_t *enp,
556 __in efx_phy_led_mode_t mode);
557
558#endif /* EFSYS_OPT_PHY_LED_CONTROL */
559
560extern __checkReturn int
561efx_port_init(
562 __in efx_nic_t *enp);
563
564#if EFSYS_OPT_LOOPBACK
565
566typedef enum efx_loopback_type_e {
567 EFX_LOOPBACK_OFF = 0,
568 EFX_LOOPBACK_DATA = 1,
569 EFX_LOOPBACK_GMAC = 2,
570 EFX_LOOPBACK_XGMII = 3,
571 EFX_LOOPBACK_XGXS = 4,
572 EFX_LOOPBACK_XAUI = 5,
573 EFX_LOOPBACK_GMII = 6,
574 EFX_LOOPBACK_SGMII = 7,
575 EFX_LOOPBACK_XGBR = 8,
576 EFX_LOOPBACK_XFI = 9,
577 EFX_LOOPBACK_XAUI_FAR = 10,
578 EFX_LOOPBACK_GMII_FAR = 11,
579 EFX_LOOPBACK_SGMII_FAR = 12,
580 EFX_LOOPBACK_XFI_FAR = 13,
581 EFX_LOOPBACK_GPHY = 14,
582 EFX_LOOPBACK_PHY_XS = 15,
583 EFX_LOOPBACK_PCS = 16,
584 EFX_LOOPBACK_PMA_PMD = 17,
585 EFX_LOOPBACK_NTYPES
586} efx_loopback_type_t;
587
588#define EFX_LOOPBACK_MAC_MASK \
589 ((1 << EFX_LOOPBACK_DATA) | \
590 (1 << EFX_LOOPBACK_GMAC) | \
591 (1 << EFX_LOOPBACK_XGMII) | \
592 (1 << EFX_LOOPBACK_XGXS) | \
593 (1 << EFX_LOOPBACK_XAUI) | \
594 (1 << EFX_LOOPBACK_GMII) | \
595 (1 << EFX_LOOPBACK_SGMII) | \
596 (1 << EFX_LOOPBACK_XGBR) | \
597 (1 << EFX_LOOPBACK_XFI) | \
598 (1 << EFX_LOOPBACK_XAUI_FAR) | \
599 (1 << EFX_LOOPBACK_GMII_FAR) | \
600 (1 << EFX_LOOPBACK_SGMII_FAR) | \
601 (1 << EFX_LOOPBACK_XFI_FAR))
602
603#define EFX_LOOPBACK_MASK \
604 ((1 << EFX_LOOPBACK_NTYPES) - 1)
605
606extern __checkReturn int
607efx_port_loopback_set(
608 __in efx_nic_t *enp,
609 __in efx_link_mode_t link_mode,
610 __in efx_loopback_type_t type);
611
612#if EFSYS_OPT_NAMES
613
614extern __checkReturn const char __cs *
615efx_loopback_type_name(
616 __in efx_nic_t *enp,
617 __in efx_loopback_type_t type);
618
619#endif /* EFSYS_OPT_NAMES */
620
621#endif /* EFSYS_OPT_LOOPBACK */
622
623extern __checkReturn int
624efx_port_poll(
625 __in efx_nic_t *enp,
626 __out efx_link_mode_t *link_modep);
627
628extern void
629efx_port_fini(
630 __in efx_nic_t *enp);
631
632typedef enum efx_phy_cap_type_e {
633 EFX_PHY_CAP_INVALID = 0,
634 EFX_PHY_CAP_10HDX,
635 EFX_PHY_CAP_10FDX,
636 EFX_PHY_CAP_100HDX,
637 EFX_PHY_CAP_100FDX,
638 EFX_PHY_CAP_1000HDX,
639 EFX_PHY_CAP_1000FDX,
640 EFX_PHY_CAP_10000FDX,
641 EFX_PHY_CAP_PAUSE,
642 EFX_PHY_CAP_ASYM,
643 EFX_PHY_CAP_AN,
644 EFX_PHY_CAP_NTYPES
645} efx_phy_cap_type_t;
646
647
648#define EFX_PHY_CAP_CURRENT 0x00000000
649#define EFX_PHY_CAP_DEFAULT 0x00000001
650#define EFX_PHY_CAP_PERM 0x00000002
651
652extern void
653efx_phy_adv_cap_get(
654 __in efx_nic_t *enp,
655 __in uint32_t flag,
656 __out uint32_t *maskp);
657
658extern __checkReturn int
659efx_phy_adv_cap_set(
660 __in efx_nic_t *enp,
661 __in uint32_t mask);
662
663extern void
664efx_phy_lp_cap_get(
665 __in efx_nic_t *enp,
666 __out uint32_t *maskp);
667
668extern __checkReturn int
669efx_phy_oui_get(
670 __in efx_nic_t *enp,
671 __out uint32_t *ouip);
672
673typedef enum efx_phy_media_type_e {
674 EFX_PHY_MEDIA_INVALID = 0,
675 EFX_PHY_MEDIA_XAUI,
676 EFX_PHY_MEDIA_CX4,
677 EFX_PHY_MEDIA_KX4,
678 EFX_PHY_MEDIA_XFP,
679 EFX_PHY_MEDIA_SFP_PLUS,
680 EFX_PHY_MEDIA_BASE_T,
681 EFX_PHY_MEDIA_NTYPES
682} efx_phy_media_type_t;
683
684/* Get the type of medium currently used. If the board has ports for
685 * modules, a module is present, and we recognise the media type of
686 * the module, then this will be the media type of the module.
687 * Otherwise it will be the media type of the port.
688 */
689extern void
690efx_phy_media_type_get(
691 __in efx_nic_t *enp,
692 __out efx_phy_media_type_t *typep);
693
694#if EFSYS_OPT_PHY_STATS
695
696/* START MKCONFIG GENERATED PhyHeaderStatsBlock 30ed56ad501f8e36 */
697typedef enum efx_phy_stat_e {
698 EFX_PHY_STAT_OUI,
699 EFX_PHY_STAT_PMA_PMD_LINK_UP,
700 EFX_PHY_STAT_PMA_PMD_RX_FAULT,
701 EFX_PHY_STAT_PMA_PMD_TX_FAULT,
702 EFX_PHY_STAT_PMA_PMD_REV_A,
703 EFX_PHY_STAT_PMA_PMD_REV_B,
704 EFX_PHY_STAT_PMA_PMD_REV_C,
705 EFX_PHY_STAT_PMA_PMD_REV_D,
706 EFX_PHY_STAT_PCS_LINK_UP,
707 EFX_PHY_STAT_PCS_RX_FAULT,
708 EFX_PHY_STAT_PCS_TX_FAULT,
709 EFX_PHY_STAT_PCS_BER,
710 EFX_PHY_STAT_PCS_BLOCK_ERRORS,
711 EFX_PHY_STAT_PHY_XS_LINK_UP,
712 EFX_PHY_STAT_PHY_XS_RX_FAULT,
713 EFX_PHY_STAT_PHY_XS_TX_FAULT,
714 EFX_PHY_STAT_PHY_XS_ALIGN,
715 EFX_PHY_STAT_PHY_XS_SYNC_A,
716 EFX_PHY_STAT_PHY_XS_SYNC_B,
717 EFX_PHY_STAT_PHY_XS_SYNC_C,
718 EFX_PHY_STAT_PHY_XS_SYNC_D,
719 EFX_PHY_STAT_AN_LINK_UP,
720 EFX_PHY_STAT_AN_MASTER,
721 EFX_PHY_STAT_AN_LOCAL_RX_OK,
722 EFX_PHY_STAT_AN_REMOTE_RX_OK,
723 EFX_PHY_STAT_CL22EXT_LINK_UP,
724 EFX_PHY_STAT_SNR_A,
725 EFX_PHY_STAT_SNR_B,
726 EFX_PHY_STAT_SNR_C,
727 EFX_PHY_STAT_SNR_D,
728 EFX_PHY_STAT_PMA_PMD_SIGNAL_A,
729 EFX_PHY_STAT_PMA_PMD_SIGNAL_B,
730 EFX_PHY_STAT_PMA_PMD_SIGNAL_C,
731 EFX_PHY_STAT_PMA_PMD_SIGNAL_D,
732 EFX_PHY_STAT_AN_COMPLETE,
733 EFX_PHY_STAT_PMA_PMD_REV_MAJOR,
734 EFX_PHY_STAT_PMA_PMD_REV_MINOR,
735 EFX_PHY_STAT_PMA_PMD_REV_MICRO,
736 EFX_PHY_STAT_PCS_FW_VERSION_0,
737 EFX_PHY_STAT_PCS_FW_VERSION_1,
738 EFX_PHY_STAT_PCS_FW_VERSION_2,
739 EFX_PHY_STAT_PCS_FW_VERSION_3,
740 EFX_PHY_STAT_PCS_FW_BUILD_YY,
741 EFX_PHY_STAT_PCS_FW_BUILD_MM,
742 EFX_PHY_STAT_PCS_FW_BUILD_DD,
743 EFX_PHY_STAT_PCS_OP_MODE,
744 EFX_PHY_NSTATS
745} efx_phy_stat_t;
746
747/* END MKCONFIG GENERATED PhyHeaderStatsBlock */
748
749#if EFSYS_OPT_NAMES
750
751extern const char __cs *
752efx_phy_stat_name(
753 __in efx_nic_t *enp,
754 __in efx_phy_stat_t stat);
755
756#endif /* EFSYS_OPT_NAMES */
757
758#define EFX_PHY_STATS_SIZE 0x100
759
760extern __checkReturn int
761efx_phy_stats_update(
762 __in efx_nic_t *enp,
763 __in efsys_mem_t *esmp,
764 __out_ecount(EFX_PHY_NSTATS) uint32_t *stat);
765
766#endif /* EFSYS_OPT_PHY_STATS */
767
768#if EFSYS_OPT_PHY_PROPS
769
770#if EFSYS_OPT_NAMES
771
772extern const char __cs *
773efx_phy_prop_name(
774 __in efx_nic_t *enp,
775 __in unsigned int id);
776
777#endif /* EFSYS_OPT_NAMES */
778
779#define EFX_PHY_PROP_DEFAULT 0x00000001
780
781extern __checkReturn int
782efx_phy_prop_get(
783 __in efx_nic_t *enp,
784 __in unsigned int id,
785 __in uint32_t flags,
786 __out uint32_t *valp);
787
788extern __checkReturn int
789efx_phy_prop_set(
790 __in efx_nic_t *enp,
791 __in unsigned int id,
792 __in uint32_t val);
793
794#endif /* EFSYS_OPT_PHY_PROPS */
795
796#if EFSYS_OPT_PHY_BIST
797
798typedef enum efx_phy_bist_type_e {
799 EFX_PHY_BIST_TYPE_UNKNOWN,
800 EFX_PHY_BIST_TYPE_NORMAL,
801 EFX_PHY_BIST_TYPE_CABLE_SHORT,
802 EFX_PHY_BIST_TYPE_CABLE_LONG,
803 EFX_PHY_BIST_TYPE_NTYPES,
804} efx_phy_bist_type_t;
805
806typedef enum efx_phy_bist_result_e {
807 EFX_PHY_BIST_RESULT_UNKNOWN,
808 EFX_PHY_BIST_RESULT_RUNNING,
809 EFX_PHY_BIST_RESULT_PASSED,
810 EFX_PHY_BIST_RESULT_FAILED,
811} efx_phy_bist_result_t;
812
813typedef enum efx_phy_cable_status_e {
814 EFX_PHY_CABLE_STATUS_OK,
815 EFX_PHY_CABLE_STATUS_INVALID,
816 EFX_PHY_CABLE_STATUS_OPEN,
817 EFX_PHY_CABLE_STATUS_INTRAPAIRSHORT,
818 EFX_PHY_CABLE_STATUS_INTERPAIRSHORT,
819 EFX_PHY_CABLE_STATUS_BUSY,
820} efx_phy_cable_status_t;
821
822typedef enum efx_phy_bist_value_e {
823 EFX_PHY_BIST_CABLE_LENGTH_A,
824 EFX_PHY_BIST_CABLE_LENGTH_B,
825 EFX_PHY_BIST_CABLE_LENGTH_C,
826 EFX_PHY_BIST_CABLE_LENGTH_D,
827 EFX_PHY_BIST_CABLE_STATUS_A,
828 EFX_PHY_BIST_CABLE_STATUS_B,
829 EFX_PHY_BIST_CABLE_STATUS_C,
830 EFX_PHY_BIST_CABLE_STATUS_D,
831 EFX_PHY_BIST_FAULT_CODE,
832 EFX_PHY_BIST_NVALUES,
833} efx_phy_bist_value_t;
834
835extern __checkReturn int
836efx_phy_bist_start(
837 __in efx_nic_t *enp,
838 __in efx_phy_bist_type_t type);
839
840extern __checkReturn int
841efx_phy_bist_poll(
842 __in efx_nic_t *enp,
843 __in efx_phy_bist_type_t type,
844 __out efx_phy_bist_result_t *resultp,
845 __out_opt uint32_t *value_maskp,
846 __out_ecount_opt(count) unsigned long *valuesp,
847 __in size_t count);
848
849extern void
850efx_phy_bist_stop(
851 __in efx_nic_t *enp,
852 __in efx_phy_bist_type_t type);
853
854#endif /* EFSYS_OPT_PHY_BIST */
855
856#define EFX_FEATURE_IPV6 0x00000001
857#define EFX_FEATURE_LFSR_HASH_INSERT 0x00000002
858#define EFX_FEATURE_LINK_EVENTS 0x00000004
859#define EFX_FEATURE_PERIODIC_MAC_STATS 0x00000008
860#define EFX_FEATURE_WOL 0x00000010
861#define EFX_FEATURE_MCDI 0x00000020
862#define EFX_FEATURE_LOOKAHEAD_SPLIT 0x00000040
863#define EFX_FEATURE_MAC_HEADER_FILTERS 0x00000080
864
865typedef struct efx_nic_cfg_s {
866 uint32_t enc_board_type;
867 uint32_t enc_phy_type;
868#if EFSYS_OPT_NAMES
869 char enc_phy_name[21];
870#endif
871 char enc_phy_revision[21];
872 efx_mon_type_t enc_mon_type;
873#if EFSYS_OPT_MON_STATS
874 uint32_t enc_mon_stat_mask;
875#endif
876 unsigned int enc_features;
877 uint8_t enc_mac_addr[6];
878 uint8_t enc_port;
879 uint32_t enc_evq_limit;
880 uint32_t enc_txq_limit;
881 uint32_t enc_rxq_limit;
882 uint32_t enc_buftbl_limit;
883 uint32_t enc_evq_moderation_max;
884#if EFSYS_OPT_LOOPBACK
885 uint32_t enc_loopback_types[EFX_LINK_NMODES];
886#endif /* EFSYS_OPT_LOOPBACK */
887#if EFSYS_OPT_PHY_FLAGS
888 uint32_t enc_phy_flags_mask;
889#endif /* EFSYS_OPT_PHY_FLAGS */
890#if EFSYS_OPT_PHY_LED_CONTROL
891 uint32_t enc_led_mask;
892#endif /* EFSYS_OPT_PHY_LED_CONTROL */
893#if EFSYS_OPT_PHY_STATS
894 uint64_t enc_phy_stat_mask;
895#endif /* EFSYS_OPT_PHY_STATS */
896#if EFSYS_OPT_PHY_PROPS
897 unsigned int enc_phy_nprops;
898#endif /* EFSYS_OPT_PHY_PROPS */
899#if EFSYS_OPT_SIENA
900 uint8_t enc_siena_channel;
901#if EFSYS_OPT_PHY_STATS
902 uint32_t enc_siena_phy_stat_mask;
903#endif /* EFSYS_OPT_PHY_STATS */
904#if EFSYS_OPT_MON_STATS
905 uint32_t enc_siena_mon_stat_mask;
906#endif /* EFSYS_OPT_MON_STATS */
907#endif /* EFSYS_OPT_SIENA */
908#if EFSYS_OPT_PHY_BIST
909 uint32_t enc_bist_mask;
910#endif /* EFSYS_OPT_PHY_BIST */
911} efx_nic_cfg_t;
912
913extern const efx_nic_cfg_t *
914efx_nic_cfg_get(
915 __in efx_nic_t *enp);
916
917#if EFSYS_OPT_VPD
918
919typedef enum efx_vpd_tag_e {
920 EFX_VPD_ID = 0x02,
921 EFX_VPD_END = 0x0f,
922 EFX_VPD_RO = 0x10,
923 EFX_VPD_RW = 0x11,
924} efx_vpd_tag_t;
925
926typedef uint16_t efx_vpd_keyword_t;
927
928typedef struct efx_vpd_value_s {
929 efx_vpd_tag_t evv_tag;
930 efx_vpd_keyword_t evv_keyword;
931 uint8_t evv_length;
932 uint8_t evv_value[0x100];
933} efx_vpd_value_t;
934
935
936#define EFX_VPD_KEYWORD(x, y) ((x) | ((y) << 8))
937
938extern __checkReturn int
939efx_vpd_init(
940 __in efx_nic_t *enp);
941
942extern __checkReturn int
943efx_vpd_size(
944 __in efx_nic_t *enp,
945 __out size_t *sizep);
946
947extern __checkReturn int
948efx_vpd_read(
949 __in efx_nic_t *enp,
950 __out_bcount(size) caddr_t data,
951 __in size_t size);
952
953extern __checkReturn int
954efx_vpd_verify(
955 __in efx_nic_t *enp,
956 __in_bcount(size) caddr_t data,
957 __in size_t size);
958
959extern __checkReturn int
960efx_vpd_reinit(
961 __in efx_nic_t *enp,
962 __in_bcount(size) caddr_t data,
963 __in size_t size);
964
965extern __checkReturn int
966efx_vpd_get(
967 __in efx_nic_t *enp,
968 __in_bcount(size) caddr_t data,
969 __in size_t size,
970 __inout efx_vpd_value_t *evvp);
971
972extern __checkReturn int
973efx_vpd_set(
974 __in efx_nic_t *enp,
975 __inout_bcount(size) caddr_t data,
976 __in size_t size,
977 __in efx_vpd_value_t *evvp);
978
979extern __checkReturn int
980efx_vpd_next(
981 __in efx_nic_t *enp,
982 __inout_bcount(size) caddr_t data,
983 __in size_t size,
984 __out efx_vpd_value_t *evvp,
985 __inout unsigned int *contp);
986
987extern __checkReturn int
988efx_vpd_write(
989 __in efx_nic_t *enp,
990 __in_bcount(size) caddr_t data,
991 __in size_t size);
992
993extern void
994efx_vpd_fini(
995 __in efx_nic_t *enp);
996
997#endif /* EFSYS_OPT_VPD */
998
999/* NVRAM */
1000
1001#if EFSYS_OPT_NVRAM
1002
1003typedef enum efx_nvram_type_e {
1004 EFX_NVRAM_INVALID = 0,
1005 EFX_NVRAM_BOOTROM,
1006 EFX_NVRAM_BOOTROM_CFG,
1007 EFX_NVRAM_MC_FIRMWARE,
1008 EFX_NVRAM_MC_GOLDEN,
1009 EFX_NVRAM_PHY,
1010 EFX_NVRAM_NULLPHY,
1011 EFX_NVRAM_NTYPES,
1012} efx_nvram_type_t;
1013
1014extern __checkReturn int
1015efx_nvram_init(
1016 __in efx_nic_t *enp);
1017
1018#if EFSYS_OPT_DIAG
1019
1020extern __checkReturn int
1021efx_nvram_test(
1022 __in efx_nic_t *enp);
1023
1024#endif /* EFSYS_OPT_DIAG */
1025
1026extern __checkReturn int
1027efx_nvram_size(
1028 __in efx_nic_t *enp,
1029 __in efx_nvram_type_t type,
1030 __out size_t *sizep);
1031
1032extern __checkReturn int
1033efx_nvram_rw_start(
1034 __in efx_nic_t *enp,
1035 __in efx_nvram_type_t type,
1036 __out_opt size_t *pref_chunkp);
1037
1038extern void
1039efx_nvram_rw_finish(
1040 __in efx_nic_t *enp,
1041 __in efx_nvram_type_t type);
1042
1043extern __checkReturn int
1044efx_nvram_get_version(
1045 __in efx_nic_t *enp,
1046 __in efx_nvram_type_t type,
1047 __out uint32_t *subtypep,
1048 __out_ecount(4) uint16_t version[4]);
1049
1050extern __checkReturn int
1051efx_nvram_read_chunk(
1052 __in efx_nic_t *enp,
1053 __in efx_nvram_type_t type,
1054 __in unsigned int offset,
1055 __out_bcount(size) caddr_t data,
1056 __in size_t size);
1057
1058extern __checkReturn int
1059efx_nvram_set_version(
1060 __in efx_nic_t *enp,
1061 __in efx_nvram_type_t type,
1062 __out uint16_t version[4]);
1063
1064extern __checkReturn int
1065efx_nvram_erase(
1066 __in efx_nic_t *enp,
1067 __in efx_nvram_type_t type);
1068
1069extern __checkReturn int
1070efx_nvram_write_chunk(
1071 __in efx_nic_t *enp,
1072 __in efx_nvram_type_t type,
1073 __in unsigned int offset,
1074 __in_bcount(size) caddr_t data,
1075 __in size_t size);
1076
1077extern void
1078efx_nvram_fini(
1079 __in efx_nic_t *enp);
1080
1081#endif /* EFSYS_OPT_NVRAM */
1082
1083#if EFSYS_OPT_BOOTCFG
1084
1085extern int
1086efx_bootcfg_read(
1087 __in efx_nic_t *enp,
1088 __out_bcount(size) caddr_t data,
1089 __in size_t size);
1090
1091extern int
1092efx_bootcfg_write(
1093 __in efx_nic_t *enp,
1094 __in_bcount(size) caddr_t data,
1095 __in size_t size);
1096
1097#endif /* EFSYS_OPT_BOOTCFG */
1098
1099#if EFSYS_OPT_WOL
1100
1101typedef enum efx_wol_type_e {
1102 EFX_WOL_TYPE_INVALID,
1103 EFX_WOL_TYPE_MAGIC,
1104 EFX_WOL_TYPE_BITMAP,
1105 EFX_WOL_TYPE_LINK,
1106 EFX_WOL_NTYPES,
1107} efx_wol_type_t;
1108
1109typedef enum efx_lightsout_offload_type_e {
1110 EFX_LIGHTSOUT_OFFLOAD_TYPE_INVALID,
1111 EFX_LIGHTSOUT_OFFLOAD_TYPE_ARP,
1112 EFX_LIGHTSOUT_OFFLOAD_TYPE_NS,
1113} efx_lightsout_offload_type_t;
1114
1115#define EFX_WOL_BITMAP_MASK_SIZE (48)
1116#define EFX_WOL_BITMAP_VALUE_SIZE (128)
1117
1118typedef union efx_wol_param_u {
1119 struct {
1120 uint8_t mac_addr[6];
1121 } ewp_magic;
1122 struct {
1123 uint8_t mask[EFX_WOL_BITMAP_MASK_SIZE]; /* 1 bit per byte */
1124 uint8_t value[EFX_WOL_BITMAP_VALUE_SIZE]; /* value to match */
1125 uint8_t value_len;
1126 } ewp_bitmap;
1127} efx_wol_param_t;
1128
1129typedef union efx_lightsout_offload_param_u {
1130 struct {
1131 uint8_t mac_addr[6];
1132 uint32_t ip;
1133 } elop_arp;
1134 struct {
1135 uint8_t mac_addr[6];
1136 uint32_t solicited_node[4];
1137 uint32_t ip[4];
1138 } elop_ns;
1139} efx_lightsout_offload_param_t;
1140
1141extern __checkReturn int
1142efx_wol_init(
1143 __in efx_nic_t *enp);
1144
1145extern __checkReturn int
1146efx_wol_filter_clear(
1147 __in efx_nic_t *enp);
1148
1149extern __checkReturn int
1150efx_wol_filter_add(
1151 __in efx_nic_t *enp,
1152 __in efx_wol_type_t type,
1153 __in efx_wol_param_t *paramp,
1154 __out uint32_t *filter_idp);
1155
1156extern __checkReturn int
1157efx_wol_filter_remove(
1158 __in efx_nic_t *enp,
1159 __in uint32_t filter_id);
1160
1161extern __checkReturn int
1162efx_lightsout_offload_add(
1163 __in efx_nic_t *enp,
1164 __in efx_lightsout_offload_type_t type,
1165 __in efx_lightsout_offload_param_t *paramp,
1166 __out uint32_t *filter_idp);
1167
1168extern __checkReturn int
1169efx_lightsout_offload_remove(
1170 __in efx_nic_t *enp,
1171 __in efx_lightsout_offload_type_t type,
1172 __in uint32_t filter_id);
1173
1174extern void
1175efx_wol_fini(
1176 __in efx_nic_t *enp);
1177
1178#endif /* EFSYS_OPT_WOL */
1179
1180#if EFSYS_OPT_DIAG
1181
1182typedef enum efx_pattern_type_t {
1183 EFX_PATTERN_BYTE_INCREMENT = 0,
1184 EFX_PATTERN_ALL_THE_SAME,
1185 EFX_PATTERN_BIT_ALTERNATE,
1186 EFX_PATTERN_BYTE_ALTERNATE,
1187 EFX_PATTERN_BYTE_CHANGING,
1188 EFX_PATTERN_BIT_SWEEP,
1189 EFX_PATTERN_NTYPES
1190} efx_pattern_type_t;
1191
1192typedef void
1193(*efx_sram_pattern_fn_t)(
1194 __in size_t row,
1195 __in boolean_t negate,
1196 __out efx_qword_t *eqp);
1197
1198extern __checkReturn int
1199efx_sram_test(
1200 __in efx_nic_t *enp,
1201 __in efx_pattern_type_t type);
1202
1203#endif /* EFSYS_OPT_DIAG */
1204
1205extern __checkReturn int
1206efx_sram_buf_tbl_set(
1207 __in efx_nic_t *enp,
1208 __in uint32_t id,
1209 __in efsys_mem_t *esmp,
1210 __in size_t n);
1211
1212extern void
1213efx_sram_buf_tbl_clear(
1214 __in efx_nic_t *enp,
1215 __in uint32_t id,
1216 __in size_t n);
1217
1218#define EFX_BUF_TBL_SIZE 0x20000
1219
1220#define EFX_BUF_SIZE 4096
1221
1222/* EV */
1223
1224typedef struct efx_evq_s efx_evq_t;
1225
1226#if EFSYS_OPT_QSTATS
1227
1228/* START MKCONFIG GENERATED EfxHeaderEventQueueBlock d5614a5d669c8ca3 */
1229typedef enum efx_ev_qstat_e {
1230 EV_ALL,
1231 EV_RX,
1232 EV_RX_OK,
1233 EV_RX_RECOVERY,
1234 EV_RX_FRM_TRUNC,
1235 EV_RX_TOBE_DISC,
1236 EV_RX_PAUSE_FRM_ERR,
1237 EV_RX_BUF_OWNER_ID_ERR,
1238 EV_RX_IPV4_HDR_CHKSUM_ERR,
1239 EV_RX_TCP_UDP_CHKSUM_ERR,
1240 EV_RX_ETH_CRC_ERR,
1241 EV_RX_IP_FRAG_ERR,
1242 EV_RX_MCAST_PKT,
1243 EV_RX_MCAST_HASH_MATCH,
1244 EV_RX_TCP_IPV4,
1245 EV_RX_TCP_IPV6,
1246 EV_RX_UDP_IPV4,
1247 EV_RX_UDP_IPV6,
1248 EV_RX_OTHER_IPV4,
1249 EV_RX_OTHER_IPV6,
1250 EV_RX_NON_IP,
1251 EV_RX_OVERRUN,
1252 EV_TX,
1253 EV_TX_WQ_FF_FULL,
1254 EV_TX_PKT_ERR,
1255 EV_TX_PKT_TOO_BIG,
1256 EV_TX_UNEXPECTED,
1257 EV_GLOBAL,
1258 EV_GLOBAL_PHY,
1259 EV_GLOBAL_MNT,
1260 EV_GLOBAL_RX_RECOVERY,
1261 EV_DRIVER,
1262 EV_DRIVER_SRM_UPD_DONE,
1263 EV_DRIVER_TX_DESCQ_FLS_DONE,
1264 EV_DRIVER_RX_DESCQ_FLS_DONE,
1265 EV_DRIVER_RX_DESCQ_FLS_FAILED,
1266 EV_DRIVER_RX_DSC_ERROR,
1267 EV_DRIVER_TX_DSC_ERROR,
1268 EV_DRV_GEN,
1269 EV_MCDI_RESPONSE,
1270 EV_NQSTATS
1271} efx_ev_qstat_t;
1272
1273/* END MKCONFIG GENERATED EfxHeaderEventQueueBlock */
1274
1275#endif /* EFSYS_OPT_QSTATS */
1276
1277extern __checkReturn int
1278efx_ev_init(
1279 __in efx_nic_t *enp);
1280
1281extern void
1282efx_ev_fini(
1283 __in efx_nic_t *enp);
1284
1285#define EFX_MASK(_max, _min) (-((_max) << 1) ^ -(_min))
1286
1287#define EFX_EVQ_MAXNEVS 32768
1288#define EFX_EVQ_MINNEVS 512
1289
1290#define EFX_EVQ_NEVS_MASK EFX_MASK(EFX_EVQ_MAXNEVS, EFX_EVQ_MINNEVS)
1291
1292#define EFX_EVQ_SIZE(_nevs) ((_nevs) * sizeof (efx_qword_t))
1293#define EFX_EVQ_NBUFS(_nevs) (EFX_EVQ_SIZE(_nevs) / EFX_BUF_SIZE)
1294
1295extern __checkReturn int
1296efx_ev_qcreate(
1297 __in efx_nic_t *enp,
1298 __in unsigned int index,
1299 __in efsys_mem_t *esmp,
1300 __in size_t n,
1301 __in uint32_t id,
1302 __deref_out efx_evq_t **eepp);
1303
1304extern void
1305efx_ev_qpost(
1306 __in efx_evq_t *eep,
1307 __in uint16_t data);
1308
1309typedef __checkReturn boolean_t
1310(*efx_initialized_ev_t)(
1311 __in_opt void *arg);
1312
1313#define EFX_PKT_UNICAST 0x0004
1314#define EFX_PKT_START 0x0008
1315
1316#define EFX_PKT_VLAN_TAGGED 0x0010
1317#define EFX_CKSUM_TCPUDP 0x0020
1318#define EFX_CKSUM_IPV4 0x0040
1319#define EFX_PKT_CONT 0x0080
1320
1321#define EFX_CHECK_VLAN 0x0100
1322#define EFX_PKT_TCP 0x0200
1323#define EFX_PKT_UDP 0x0400
1324#define EFX_PKT_IPV4 0x0800
1325
1326#define EFX_PKT_IPV6 0x1000
1327#define EFX_ADDR_MISMATCH 0x4000
1328#define EFX_DISCARD 0x8000
1329
1330#define EFX_EV_RX_NLABELS 32
1331#define EFX_EV_TX_NLABELS 32
1332
1333typedef __checkReturn boolean_t
1334(*efx_rx_ev_t)(
1335 __in_opt void *arg,
1336 __in uint32_t label,
1337 __in uint32_t id,
1338 __in uint32_t size,
1339 __in uint16_t flags);
1340
1341typedef __checkReturn boolean_t
1342(*efx_tx_ev_t)(
1343 __in_opt void *arg,
1344 __in uint32_t label,
1345 __in uint32_t id);
1346
1347#define EFX_EXCEPTION_RX_RECOVERY 0x00000001
1348#define EFX_EXCEPTION_RX_DSC_ERROR 0x00000002
1349#define EFX_EXCEPTION_TX_DSC_ERROR 0x00000003
1350#define EFX_EXCEPTION_UNKNOWN_SENSOREVT 0x00000004
1351#define EFX_EXCEPTION_FWALERT_SRAM 0x00000005
1352#define EFX_EXCEPTION_UNKNOWN_FWALERT 0x00000006
1353
1354typedef __checkReturn boolean_t
1355(*efx_exception_ev_t)(
1356 __in_opt void *arg,
1357 __in uint32_t label,
1358 __in uint32_t data);
1359
1360typedef __checkReturn boolean_t
1361(*efx_rxq_flush_done_ev_t)(
1362 __in_opt void *arg,
26 */
27
28#ifndef _SYS_EFX_H
29#define _SYS_EFX_H
30
31#include "efsys.h"
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37#define EFX_STATIC_ASSERT(_cond) ((void)sizeof(char[(_cond) ? 1 : -1]))
38
39#define EFX_ARRAY_SIZE(_array) (sizeof(_array) / sizeof((_array)[0]))
40
41#ifndef EFSYS_MEM_IS_NULL
42#define EFSYS_MEM_IS_NULL(_esmp) ((_esmp)->esm_base == NULL)
43#endif
44
45typedef enum efx_family_e {
46 EFX_FAMILY_INVALID,
47 EFX_FAMILY_FALCON,
48 EFX_FAMILY_SIENA,
49 EFX_FAMILY_NTYPES
50} efx_family_t;
51
52extern __checkReturn int
53efx_family(
54 __in uint16_t venid,
55 __in uint16_t devid,
56 __out efx_family_t *efp);
57
58extern __checkReturn int
59efx_infer_family(
60 __in efsys_bar_t *esbp,
61 __out efx_family_t *efp);
62
63#define EFX_PCI_VENID_SFC 0x1924
64#define EFX_PCI_DEVID_FALCON 0x0710
65#define EFX_PCI_DEVID_BETHPAGE 0x0803
66#define EFX_PCI_DEVID_SIENA 0x0813
67#define EFX_PCI_DEVID_SIENA_F1_UNINIT 0x0810
68
69#define EFX_MEM_BAR 2
70
71/* Error codes */
72
73enum {
74 EFX_ERR_INVALID,
75 EFX_ERR_SRAM_OOB,
76 EFX_ERR_BUFID_DC_OOB,
77 EFX_ERR_MEM_PERR,
78 EFX_ERR_RBUF_OWN,
79 EFX_ERR_TBUF_OWN,
80 EFX_ERR_RDESQ_OWN,
81 EFX_ERR_TDESQ_OWN,
82 EFX_ERR_EVQ_OWN,
83 EFX_ERR_EVFF_OFLO,
84 EFX_ERR_ILL_ADDR,
85 EFX_ERR_SRAM_PERR,
86 EFX_ERR_NCODES
87};
88
89/* NIC */
90
91typedef struct efx_nic_s efx_nic_t;
92
93extern __checkReturn int
94efx_nic_create(
95 __in efx_family_t family,
96 __in efsys_identifier_t *esip,
97 __in efsys_bar_t *esbp,
98 __in efsys_lock_t *eslp,
99 __deref_out efx_nic_t **enpp);
100
101extern __checkReturn int
102efx_nic_probe(
103 __in efx_nic_t *enp);
104
105#if EFSYS_OPT_PCIE_TUNE
106
107extern __checkReturn int
108efx_nic_pcie_tune(
109 __in efx_nic_t *enp,
110 unsigned int nlanes);
111
112extern __checkReturn int
113efx_nic_pcie_extended_sync(
114 __in efx_nic_t *enp);
115
116#endif /* EFSYS_OPT_PCIE_TUNE */
117
118extern __checkReturn int
119efx_nic_init(
120 __in efx_nic_t *enp);
121
122extern __checkReturn int
123efx_nic_reset(
124 __in efx_nic_t *enp);
125
126#if EFSYS_OPT_DIAG
127
128extern __checkReturn int
129efx_nic_register_test(
130 __in efx_nic_t *enp);
131
132#endif /* EFSYS_OPT_DIAG */
133
134extern void
135efx_nic_fini(
136 __in efx_nic_t *enp);
137
138extern void
139efx_nic_unprobe(
140 __in efx_nic_t *enp);
141
142extern void
143efx_nic_destroy(
144 __in efx_nic_t *enp);
145
146#if EFSYS_OPT_MCDI
147
148typedef struct efx_mcdi_req_s efx_mcdi_req_t;
149
150typedef enum efx_mcdi_exception_e {
151 EFX_MCDI_EXCEPTION_MC_REBOOT,
152 EFX_MCDI_EXCEPTION_MC_BADASSERT,
153} efx_mcdi_exception_t;
154
155typedef struct efx_mcdi_transport_s {
156 void *emt_context;
157 void (*emt_execute)(void *, efx_mcdi_req_t *);
158 void (*emt_ev_cpl)(void *);
159 void (*emt_exception)(void *, efx_mcdi_exception_t);
160} efx_mcdi_transport_t;
161
162extern __checkReturn int
163efx_mcdi_init(
164 __in efx_nic_t *enp,
165 __in const efx_mcdi_transport_t *mtp);
166
167extern __checkReturn int
168efx_mcdi_reboot(
169 __in efx_nic_t *enp);
170
171extern void
172efx_mcdi_request_start(
173 __in efx_nic_t *enp,
174 __in efx_mcdi_req_t *emrp,
175 __in boolean_t ev_cpl);
176
177extern __checkReturn boolean_t
178efx_mcdi_request_poll(
179 __in efx_nic_t *enp);
180
181extern __checkReturn boolean_t
182efx_mcdi_request_abort(
183 __in efx_nic_t *enp);
184
185extern void
186efx_mcdi_fini(
187 __in efx_nic_t *enp);
188
189#endif /* EFSYS_OPT_MCDI */
190
191/* INTR */
192
193#define EFX_NINTR_FALCON 64
194#define EFX_NINTR_SIENA 1024
195
196typedef enum efx_intr_type_e {
197 EFX_INTR_INVALID = 0,
198 EFX_INTR_LINE,
199 EFX_INTR_MESSAGE,
200 EFX_INTR_NTYPES
201} efx_intr_type_t;
202
203#define EFX_INTR_SIZE (sizeof (efx_oword_t))
204
205extern __checkReturn int
206efx_intr_init(
207 __in efx_nic_t *enp,
208 __in efx_intr_type_t type,
209 __in efsys_mem_t *esmp);
210
211extern void
212efx_intr_enable(
213 __in efx_nic_t *enp);
214
215extern void
216efx_intr_disable(
217 __in efx_nic_t *enp);
218
219extern void
220efx_intr_disable_unlocked(
221 __in efx_nic_t *enp);
222
223#define EFX_INTR_NEVQS 32
224
225extern __checkReturn int
226efx_intr_trigger(
227 __in efx_nic_t *enp,
228 __in unsigned int level);
229
230extern void
231efx_intr_status_line(
232 __in efx_nic_t *enp,
233 __out boolean_t *fatalp,
234 __out uint32_t *maskp);
235
236extern void
237efx_intr_status_message(
238 __in efx_nic_t *enp,
239 __in unsigned int message,
240 __out boolean_t *fatalp);
241
242extern void
243efx_intr_fatal(
244 __in efx_nic_t *enp);
245
246extern void
247efx_intr_fini(
248 __in efx_nic_t *enp);
249
250/* MAC */
251
252#if EFSYS_OPT_MAC_STATS
253
254/* START MKCONFIG GENERATED EfxHeaderMacBlock bb8d39428b6fdcf5 */
255typedef enum efx_mac_stat_e {
256 EFX_MAC_RX_OCTETS,
257 EFX_MAC_RX_PKTS,
258 EFX_MAC_RX_UNICST_PKTS,
259 EFX_MAC_RX_MULTICST_PKTS,
260 EFX_MAC_RX_BRDCST_PKTS,
261 EFX_MAC_RX_PAUSE_PKTS,
262 EFX_MAC_RX_LE_64_PKTS,
263 EFX_MAC_RX_65_TO_127_PKTS,
264 EFX_MAC_RX_128_TO_255_PKTS,
265 EFX_MAC_RX_256_TO_511_PKTS,
266 EFX_MAC_RX_512_TO_1023_PKTS,
267 EFX_MAC_RX_1024_TO_15XX_PKTS,
268 EFX_MAC_RX_GE_15XX_PKTS,
269 EFX_MAC_RX_ERRORS,
270 EFX_MAC_RX_FCS_ERRORS,
271 EFX_MAC_RX_DROP_EVENTS,
272 EFX_MAC_RX_FALSE_CARRIER_ERRORS,
273 EFX_MAC_RX_SYMBOL_ERRORS,
274 EFX_MAC_RX_ALIGN_ERRORS,
275 EFX_MAC_RX_INTERNAL_ERRORS,
276 EFX_MAC_RX_JABBER_PKTS,
277 EFX_MAC_RX_LANE0_CHAR_ERR,
278 EFX_MAC_RX_LANE1_CHAR_ERR,
279 EFX_MAC_RX_LANE2_CHAR_ERR,
280 EFX_MAC_RX_LANE3_CHAR_ERR,
281 EFX_MAC_RX_LANE0_DISP_ERR,
282 EFX_MAC_RX_LANE1_DISP_ERR,
283 EFX_MAC_RX_LANE2_DISP_ERR,
284 EFX_MAC_RX_LANE3_DISP_ERR,
285 EFX_MAC_RX_MATCH_FAULT,
286 EFX_MAC_RX_NODESC_DROP_CNT,
287 EFX_MAC_TX_OCTETS,
288 EFX_MAC_TX_PKTS,
289 EFX_MAC_TX_UNICST_PKTS,
290 EFX_MAC_TX_MULTICST_PKTS,
291 EFX_MAC_TX_BRDCST_PKTS,
292 EFX_MAC_TX_PAUSE_PKTS,
293 EFX_MAC_TX_LE_64_PKTS,
294 EFX_MAC_TX_65_TO_127_PKTS,
295 EFX_MAC_TX_128_TO_255_PKTS,
296 EFX_MAC_TX_256_TO_511_PKTS,
297 EFX_MAC_TX_512_TO_1023_PKTS,
298 EFX_MAC_TX_1024_TO_15XX_PKTS,
299 EFX_MAC_TX_GE_15XX_PKTS,
300 EFX_MAC_TX_ERRORS,
301 EFX_MAC_TX_SGL_COL_PKTS,
302 EFX_MAC_TX_MULT_COL_PKTS,
303 EFX_MAC_TX_EX_COL_PKTS,
304 EFX_MAC_TX_LATE_COL_PKTS,
305 EFX_MAC_TX_DEF_PKTS,
306 EFX_MAC_TX_EX_DEF_PKTS,
307 EFX_MAC_NSTATS
308} efx_mac_stat_t;
309
310/* END MKCONFIG GENERATED EfxHeaderMacBlock */
311
312#endif /* EFSYS_OPT_MAC_STATS */
313
314typedef enum efx_link_mode_e {
315 EFX_LINK_UNKNOWN = 0,
316 EFX_LINK_DOWN,
317 EFX_LINK_10HDX,
318 EFX_LINK_10FDX,
319 EFX_LINK_100HDX,
320 EFX_LINK_100FDX,
321 EFX_LINK_1000HDX,
322 EFX_LINK_1000FDX,
323 EFX_LINK_10000FDX,
324 EFX_LINK_NMODES
325} efx_link_mode_t;
326
327#define EFX_MAC_SDU_MAX 9202
328
329#define EFX_MAC_PDU(_sdu) \
330 P2ROUNDUP(((_sdu) \
331 + /* EtherII */ 14 \
332 + /* VLAN */ 4 \
333 + /* CRC */ 4 \
334 + /* bug16011 */ 16), \
335 (1 << 3))
336
337#define EFX_MAC_PDU_MIN 60
338#define EFX_MAC_PDU_MAX EFX_MAC_PDU(EFX_MAC_SDU_MAX)
339
340extern __checkReturn int
341efx_mac_pdu_set(
342 __in efx_nic_t *enp,
343 __in size_t pdu);
344
345extern __checkReturn int
346efx_mac_addr_set(
347 __in efx_nic_t *enp,
348 __in uint8_t *addr);
349
350extern __checkReturn int
351efx_mac_filter_set(
352 __in efx_nic_t *enp,
353 __in boolean_t unicst,
354 __in boolean_t brdcst);
355
356extern __checkReturn int
357efx_mac_drain(
358 __in efx_nic_t *enp,
359 __in boolean_t enabled);
360
361extern __checkReturn int
362efx_mac_up(
363 __in efx_nic_t *enp,
364 __out boolean_t *mac_upp);
365
366#define EFX_FCNTL_RESPOND 0x00000001
367#define EFX_FCNTL_GENERATE 0x00000002
368
369extern __checkReturn int
370efx_mac_fcntl_set(
371 __in efx_nic_t *enp,
372 __in unsigned int fcntl,
373 __in boolean_t autoneg);
374
375extern void
376efx_mac_fcntl_get(
377 __in efx_nic_t *enp,
378 __out unsigned int *fcntl_wantedp,
379 __out unsigned int *fcntl_linkp);
380
381#define EFX_MAC_HASH_BITS (1 << 8)
382
383extern __checkReturn int
384efx_mac_hash_set(
385 __in efx_nic_t *enp,
386 __in_ecount(EFX_MAC_HASH_BITS) unsigned int const *bucket);
387
388#if EFSYS_OPT_MAC_STATS
389
390#if EFSYS_OPT_NAMES
391
392extern __checkReturn const char __cs *
393efx_mac_stat_name(
394 __in efx_nic_t *enp,
395 __in unsigned int id);
396
397#endif /* EFSYS_OPT_NAMES */
398
399#define EFX_MAC_STATS_SIZE 0x400
400
401/*
402 * Upload mac statistics supported by the hardware into the given buffer.
403 *
404 * The reference buffer must be at least %EFX_MAC_STATS_SIZE bytes,
405 * and page aligned.
406 *
407 * The hardware will only DMA statistics that it understands (of course).
408 * Drivers should not make any assumptions about which statistics are
409 * supported, especially when the statistics are generated by firmware.
410 *
411 * Thus, drivers should zero this buffer before use, so that not-understood
412 * statistics read back as zero.
413 */
414extern __checkReturn int
415efx_mac_stats_upload(
416 __in efx_nic_t *enp,
417 __in efsys_mem_t *esmp);
418
419extern __checkReturn int
420efx_mac_stats_periodic(
421 __in efx_nic_t *enp,
422 __in efsys_mem_t *esmp,
423 __in uint16_t period_ms,
424 __in boolean_t events);
425
426extern __checkReturn int
427efx_mac_stats_update(
428 __in efx_nic_t *enp,
429 __in efsys_mem_t *esmp,
430 __inout_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat,
431 __out_opt uint32_t *generationp);
432
433#endif /* EFSYS_OPT_MAC_STATS */
434
435/* MON */
436
437typedef enum efx_mon_type_e {
438 EFX_MON_INVALID = 0,
439 EFX_MON_NULL,
440 EFX_MON_LM87,
441 EFX_MON_MAX6647,
442 EFX_MON_SFC90X0,
443 EFX_MON_NTYPES
444} efx_mon_type_t;
445
446#if EFSYS_OPT_NAMES
447
448extern const char __cs *
449efx_mon_name(
450 __in efx_nic_t *enp);
451
452#endif /* EFSYS_OPT_NAMES */
453
454extern __checkReturn int
455efx_mon_init(
456 __in efx_nic_t *enp);
457
458#if EFSYS_OPT_MON_STATS
459
460#define EFX_MON_STATS_SIZE 0x100
461
462/* START MKCONFIG GENERATED MonitorHeaderStatsBlock 16a14e61aa4f8d80 */
463typedef enum efx_mon_stat_e {
464 EFX_MON_STAT_2_5V,
465 EFX_MON_STAT_VCCP1,
466 EFX_MON_STAT_VCC,
467 EFX_MON_STAT_5V,
468 EFX_MON_STAT_12V,
469 EFX_MON_STAT_VCCP2,
470 EFX_MON_STAT_EXT_TEMP,
471 EFX_MON_STAT_INT_TEMP,
472 EFX_MON_STAT_AIN1,
473 EFX_MON_STAT_AIN2,
474 EFX_MON_STAT_INT_COOLING,
475 EFX_MON_STAT_EXT_COOLING,
476 EFX_MON_STAT_1V,
477 EFX_MON_STAT_1_2V,
478 EFX_MON_STAT_1_8V,
479 EFX_MON_STAT_3_3V,
480 EFX_MON_NSTATS
481} efx_mon_stat_t;
482
483/* END MKCONFIG GENERATED MonitorHeaderStatsBlock */
484
485typedef enum efx_mon_stat_state_e {
486 EFX_MON_STAT_STATE_OK = 0,
487 EFX_MON_STAT_STATE_WARNING = 1,
488 EFX_MON_STAT_STATE_FATAL = 2,
489 EFX_MON_STAT_STATE_BROKEN = 3,
490} efx_mon_stat_state_t;
491
492typedef struct efx_mon_stat_value_t {
493 uint16_t emsv_value;
494 uint16_t emsv_state;
495} efx_mon_stat_value_t;
496
497#if EFSYS_OPT_NAMES
498
499extern const char __cs *
500efx_mon_stat_name(
501 __in efx_nic_t *enp,
502 __in efx_mon_stat_t id);
503
504#endif /* EFSYS_OPT_NAMES */
505
506extern __checkReturn int
507efx_mon_stats_update(
508 __in efx_nic_t *enp,
509 __in efsys_mem_t *esmp,
510 __out_ecount(EFX_MON_NSTATS) efx_mon_stat_value_t *values);
511
512#endif /* EFSYS_OPT_MON_STATS */
513
514extern void
515efx_mon_fini(
516 __in efx_nic_t *enp);
517
518/* PHY */
519
520#define PMA_PMD_MMD 1
521#define PCS_MMD 3
522#define PHY_XS_MMD 4
523#define DTE_XS_MMD 5
524#define AN_MMD 7
525#define CL22EXT_MMD 29
526
527#define MAXMMD ((1 << 5) - 1)
528
529/* PHY types */
530#define EFX_PHY_NULL 0x0
531#define EFX_PHY_TXC43128 0x1
532#define EFX_PHY_SFX7101 0x3
533#define EFX_PHY_QT2022C2 0x4
534#define EFX_PHY_SFT9001A 0x8
535#define EFX_PHY_QT2025C 0x9
536#define EFX_PHY_SFT9001B 0xa
537#define EFX_PHY_QLX111V 0xc
538
539extern __checkReturn int
540efx_phy_verify(
541 __in efx_nic_t *enp);
542
543#if EFSYS_OPT_PHY_LED_CONTROL
544
545typedef enum efx_phy_led_mode_e {
546 EFX_PHY_LED_DEFAULT = 0,
547 EFX_PHY_LED_OFF,
548 EFX_PHY_LED_ON,
549 EFX_PHY_LED_FLASH,
550 EFX_PHY_LED_NMODES
551} efx_phy_led_mode_t;
552
553extern __checkReturn int
554efx_phy_led_set(
555 __in efx_nic_t *enp,
556 __in efx_phy_led_mode_t mode);
557
558#endif /* EFSYS_OPT_PHY_LED_CONTROL */
559
560extern __checkReturn int
561efx_port_init(
562 __in efx_nic_t *enp);
563
564#if EFSYS_OPT_LOOPBACK
565
566typedef enum efx_loopback_type_e {
567 EFX_LOOPBACK_OFF = 0,
568 EFX_LOOPBACK_DATA = 1,
569 EFX_LOOPBACK_GMAC = 2,
570 EFX_LOOPBACK_XGMII = 3,
571 EFX_LOOPBACK_XGXS = 4,
572 EFX_LOOPBACK_XAUI = 5,
573 EFX_LOOPBACK_GMII = 6,
574 EFX_LOOPBACK_SGMII = 7,
575 EFX_LOOPBACK_XGBR = 8,
576 EFX_LOOPBACK_XFI = 9,
577 EFX_LOOPBACK_XAUI_FAR = 10,
578 EFX_LOOPBACK_GMII_FAR = 11,
579 EFX_LOOPBACK_SGMII_FAR = 12,
580 EFX_LOOPBACK_XFI_FAR = 13,
581 EFX_LOOPBACK_GPHY = 14,
582 EFX_LOOPBACK_PHY_XS = 15,
583 EFX_LOOPBACK_PCS = 16,
584 EFX_LOOPBACK_PMA_PMD = 17,
585 EFX_LOOPBACK_NTYPES
586} efx_loopback_type_t;
587
588#define EFX_LOOPBACK_MAC_MASK \
589 ((1 << EFX_LOOPBACK_DATA) | \
590 (1 << EFX_LOOPBACK_GMAC) | \
591 (1 << EFX_LOOPBACK_XGMII) | \
592 (1 << EFX_LOOPBACK_XGXS) | \
593 (1 << EFX_LOOPBACK_XAUI) | \
594 (1 << EFX_LOOPBACK_GMII) | \
595 (1 << EFX_LOOPBACK_SGMII) | \
596 (1 << EFX_LOOPBACK_XGBR) | \
597 (1 << EFX_LOOPBACK_XFI) | \
598 (1 << EFX_LOOPBACK_XAUI_FAR) | \
599 (1 << EFX_LOOPBACK_GMII_FAR) | \
600 (1 << EFX_LOOPBACK_SGMII_FAR) | \
601 (1 << EFX_LOOPBACK_XFI_FAR))
602
603#define EFX_LOOPBACK_MASK \
604 ((1 << EFX_LOOPBACK_NTYPES) - 1)
605
606extern __checkReturn int
607efx_port_loopback_set(
608 __in efx_nic_t *enp,
609 __in efx_link_mode_t link_mode,
610 __in efx_loopback_type_t type);
611
612#if EFSYS_OPT_NAMES
613
614extern __checkReturn const char __cs *
615efx_loopback_type_name(
616 __in efx_nic_t *enp,
617 __in efx_loopback_type_t type);
618
619#endif /* EFSYS_OPT_NAMES */
620
621#endif /* EFSYS_OPT_LOOPBACK */
622
623extern __checkReturn int
624efx_port_poll(
625 __in efx_nic_t *enp,
626 __out efx_link_mode_t *link_modep);
627
628extern void
629efx_port_fini(
630 __in efx_nic_t *enp);
631
632typedef enum efx_phy_cap_type_e {
633 EFX_PHY_CAP_INVALID = 0,
634 EFX_PHY_CAP_10HDX,
635 EFX_PHY_CAP_10FDX,
636 EFX_PHY_CAP_100HDX,
637 EFX_PHY_CAP_100FDX,
638 EFX_PHY_CAP_1000HDX,
639 EFX_PHY_CAP_1000FDX,
640 EFX_PHY_CAP_10000FDX,
641 EFX_PHY_CAP_PAUSE,
642 EFX_PHY_CAP_ASYM,
643 EFX_PHY_CAP_AN,
644 EFX_PHY_CAP_NTYPES
645} efx_phy_cap_type_t;
646
647
648#define EFX_PHY_CAP_CURRENT 0x00000000
649#define EFX_PHY_CAP_DEFAULT 0x00000001
650#define EFX_PHY_CAP_PERM 0x00000002
651
652extern void
653efx_phy_adv_cap_get(
654 __in efx_nic_t *enp,
655 __in uint32_t flag,
656 __out uint32_t *maskp);
657
658extern __checkReturn int
659efx_phy_adv_cap_set(
660 __in efx_nic_t *enp,
661 __in uint32_t mask);
662
663extern void
664efx_phy_lp_cap_get(
665 __in efx_nic_t *enp,
666 __out uint32_t *maskp);
667
668extern __checkReturn int
669efx_phy_oui_get(
670 __in efx_nic_t *enp,
671 __out uint32_t *ouip);
672
673typedef enum efx_phy_media_type_e {
674 EFX_PHY_MEDIA_INVALID = 0,
675 EFX_PHY_MEDIA_XAUI,
676 EFX_PHY_MEDIA_CX4,
677 EFX_PHY_MEDIA_KX4,
678 EFX_PHY_MEDIA_XFP,
679 EFX_PHY_MEDIA_SFP_PLUS,
680 EFX_PHY_MEDIA_BASE_T,
681 EFX_PHY_MEDIA_NTYPES
682} efx_phy_media_type_t;
683
684/* Get the type of medium currently used. If the board has ports for
685 * modules, a module is present, and we recognise the media type of
686 * the module, then this will be the media type of the module.
687 * Otherwise it will be the media type of the port.
688 */
689extern void
690efx_phy_media_type_get(
691 __in efx_nic_t *enp,
692 __out efx_phy_media_type_t *typep);
693
694#if EFSYS_OPT_PHY_STATS
695
696/* START MKCONFIG GENERATED PhyHeaderStatsBlock 30ed56ad501f8e36 */
697typedef enum efx_phy_stat_e {
698 EFX_PHY_STAT_OUI,
699 EFX_PHY_STAT_PMA_PMD_LINK_UP,
700 EFX_PHY_STAT_PMA_PMD_RX_FAULT,
701 EFX_PHY_STAT_PMA_PMD_TX_FAULT,
702 EFX_PHY_STAT_PMA_PMD_REV_A,
703 EFX_PHY_STAT_PMA_PMD_REV_B,
704 EFX_PHY_STAT_PMA_PMD_REV_C,
705 EFX_PHY_STAT_PMA_PMD_REV_D,
706 EFX_PHY_STAT_PCS_LINK_UP,
707 EFX_PHY_STAT_PCS_RX_FAULT,
708 EFX_PHY_STAT_PCS_TX_FAULT,
709 EFX_PHY_STAT_PCS_BER,
710 EFX_PHY_STAT_PCS_BLOCK_ERRORS,
711 EFX_PHY_STAT_PHY_XS_LINK_UP,
712 EFX_PHY_STAT_PHY_XS_RX_FAULT,
713 EFX_PHY_STAT_PHY_XS_TX_FAULT,
714 EFX_PHY_STAT_PHY_XS_ALIGN,
715 EFX_PHY_STAT_PHY_XS_SYNC_A,
716 EFX_PHY_STAT_PHY_XS_SYNC_B,
717 EFX_PHY_STAT_PHY_XS_SYNC_C,
718 EFX_PHY_STAT_PHY_XS_SYNC_D,
719 EFX_PHY_STAT_AN_LINK_UP,
720 EFX_PHY_STAT_AN_MASTER,
721 EFX_PHY_STAT_AN_LOCAL_RX_OK,
722 EFX_PHY_STAT_AN_REMOTE_RX_OK,
723 EFX_PHY_STAT_CL22EXT_LINK_UP,
724 EFX_PHY_STAT_SNR_A,
725 EFX_PHY_STAT_SNR_B,
726 EFX_PHY_STAT_SNR_C,
727 EFX_PHY_STAT_SNR_D,
728 EFX_PHY_STAT_PMA_PMD_SIGNAL_A,
729 EFX_PHY_STAT_PMA_PMD_SIGNAL_B,
730 EFX_PHY_STAT_PMA_PMD_SIGNAL_C,
731 EFX_PHY_STAT_PMA_PMD_SIGNAL_D,
732 EFX_PHY_STAT_AN_COMPLETE,
733 EFX_PHY_STAT_PMA_PMD_REV_MAJOR,
734 EFX_PHY_STAT_PMA_PMD_REV_MINOR,
735 EFX_PHY_STAT_PMA_PMD_REV_MICRO,
736 EFX_PHY_STAT_PCS_FW_VERSION_0,
737 EFX_PHY_STAT_PCS_FW_VERSION_1,
738 EFX_PHY_STAT_PCS_FW_VERSION_2,
739 EFX_PHY_STAT_PCS_FW_VERSION_3,
740 EFX_PHY_STAT_PCS_FW_BUILD_YY,
741 EFX_PHY_STAT_PCS_FW_BUILD_MM,
742 EFX_PHY_STAT_PCS_FW_BUILD_DD,
743 EFX_PHY_STAT_PCS_OP_MODE,
744 EFX_PHY_NSTATS
745} efx_phy_stat_t;
746
747/* END MKCONFIG GENERATED PhyHeaderStatsBlock */
748
749#if EFSYS_OPT_NAMES
750
751extern const char __cs *
752efx_phy_stat_name(
753 __in efx_nic_t *enp,
754 __in efx_phy_stat_t stat);
755
756#endif /* EFSYS_OPT_NAMES */
757
758#define EFX_PHY_STATS_SIZE 0x100
759
760extern __checkReturn int
761efx_phy_stats_update(
762 __in efx_nic_t *enp,
763 __in efsys_mem_t *esmp,
764 __out_ecount(EFX_PHY_NSTATS) uint32_t *stat);
765
766#endif /* EFSYS_OPT_PHY_STATS */
767
768#if EFSYS_OPT_PHY_PROPS
769
770#if EFSYS_OPT_NAMES
771
772extern const char __cs *
773efx_phy_prop_name(
774 __in efx_nic_t *enp,
775 __in unsigned int id);
776
777#endif /* EFSYS_OPT_NAMES */
778
779#define EFX_PHY_PROP_DEFAULT 0x00000001
780
781extern __checkReturn int
782efx_phy_prop_get(
783 __in efx_nic_t *enp,
784 __in unsigned int id,
785 __in uint32_t flags,
786 __out uint32_t *valp);
787
788extern __checkReturn int
789efx_phy_prop_set(
790 __in efx_nic_t *enp,
791 __in unsigned int id,
792 __in uint32_t val);
793
794#endif /* EFSYS_OPT_PHY_PROPS */
795
796#if EFSYS_OPT_PHY_BIST
797
798typedef enum efx_phy_bist_type_e {
799 EFX_PHY_BIST_TYPE_UNKNOWN,
800 EFX_PHY_BIST_TYPE_NORMAL,
801 EFX_PHY_BIST_TYPE_CABLE_SHORT,
802 EFX_PHY_BIST_TYPE_CABLE_LONG,
803 EFX_PHY_BIST_TYPE_NTYPES,
804} efx_phy_bist_type_t;
805
806typedef enum efx_phy_bist_result_e {
807 EFX_PHY_BIST_RESULT_UNKNOWN,
808 EFX_PHY_BIST_RESULT_RUNNING,
809 EFX_PHY_BIST_RESULT_PASSED,
810 EFX_PHY_BIST_RESULT_FAILED,
811} efx_phy_bist_result_t;
812
813typedef enum efx_phy_cable_status_e {
814 EFX_PHY_CABLE_STATUS_OK,
815 EFX_PHY_CABLE_STATUS_INVALID,
816 EFX_PHY_CABLE_STATUS_OPEN,
817 EFX_PHY_CABLE_STATUS_INTRAPAIRSHORT,
818 EFX_PHY_CABLE_STATUS_INTERPAIRSHORT,
819 EFX_PHY_CABLE_STATUS_BUSY,
820} efx_phy_cable_status_t;
821
822typedef enum efx_phy_bist_value_e {
823 EFX_PHY_BIST_CABLE_LENGTH_A,
824 EFX_PHY_BIST_CABLE_LENGTH_B,
825 EFX_PHY_BIST_CABLE_LENGTH_C,
826 EFX_PHY_BIST_CABLE_LENGTH_D,
827 EFX_PHY_BIST_CABLE_STATUS_A,
828 EFX_PHY_BIST_CABLE_STATUS_B,
829 EFX_PHY_BIST_CABLE_STATUS_C,
830 EFX_PHY_BIST_CABLE_STATUS_D,
831 EFX_PHY_BIST_FAULT_CODE,
832 EFX_PHY_BIST_NVALUES,
833} efx_phy_bist_value_t;
834
835extern __checkReturn int
836efx_phy_bist_start(
837 __in efx_nic_t *enp,
838 __in efx_phy_bist_type_t type);
839
840extern __checkReturn int
841efx_phy_bist_poll(
842 __in efx_nic_t *enp,
843 __in efx_phy_bist_type_t type,
844 __out efx_phy_bist_result_t *resultp,
845 __out_opt uint32_t *value_maskp,
846 __out_ecount_opt(count) unsigned long *valuesp,
847 __in size_t count);
848
849extern void
850efx_phy_bist_stop(
851 __in efx_nic_t *enp,
852 __in efx_phy_bist_type_t type);
853
854#endif /* EFSYS_OPT_PHY_BIST */
855
856#define EFX_FEATURE_IPV6 0x00000001
857#define EFX_FEATURE_LFSR_HASH_INSERT 0x00000002
858#define EFX_FEATURE_LINK_EVENTS 0x00000004
859#define EFX_FEATURE_PERIODIC_MAC_STATS 0x00000008
860#define EFX_FEATURE_WOL 0x00000010
861#define EFX_FEATURE_MCDI 0x00000020
862#define EFX_FEATURE_LOOKAHEAD_SPLIT 0x00000040
863#define EFX_FEATURE_MAC_HEADER_FILTERS 0x00000080
864
865typedef struct efx_nic_cfg_s {
866 uint32_t enc_board_type;
867 uint32_t enc_phy_type;
868#if EFSYS_OPT_NAMES
869 char enc_phy_name[21];
870#endif
871 char enc_phy_revision[21];
872 efx_mon_type_t enc_mon_type;
873#if EFSYS_OPT_MON_STATS
874 uint32_t enc_mon_stat_mask;
875#endif
876 unsigned int enc_features;
877 uint8_t enc_mac_addr[6];
878 uint8_t enc_port;
879 uint32_t enc_evq_limit;
880 uint32_t enc_txq_limit;
881 uint32_t enc_rxq_limit;
882 uint32_t enc_buftbl_limit;
883 uint32_t enc_evq_moderation_max;
884#if EFSYS_OPT_LOOPBACK
885 uint32_t enc_loopback_types[EFX_LINK_NMODES];
886#endif /* EFSYS_OPT_LOOPBACK */
887#if EFSYS_OPT_PHY_FLAGS
888 uint32_t enc_phy_flags_mask;
889#endif /* EFSYS_OPT_PHY_FLAGS */
890#if EFSYS_OPT_PHY_LED_CONTROL
891 uint32_t enc_led_mask;
892#endif /* EFSYS_OPT_PHY_LED_CONTROL */
893#if EFSYS_OPT_PHY_STATS
894 uint64_t enc_phy_stat_mask;
895#endif /* EFSYS_OPT_PHY_STATS */
896#if EFSYS_OPT_PHY_PROPS
897 unsigned int enc_phy_nprops;
898#endif /* EFSYS_OPT_PHY_PROPS */
899#if EFSYS_OPT_SIENA
900 uint8_t enc_siena_channel;
901#if EFSYS_OPT_PHY_STATS
902 uint32_t enc_siena_phy_stat_mask;
903#endif /* EFSYS_OPT_PHY_STATS */
904#if EFSYS_OPT_MON_STATS
905 uint32_t enc_siena_mon_stat_mask;
906#endif /* EFSYS_OPT_MON_STATS */
907#endif /* EFSYS_OPT_SIENA */
908#if EFSYS_OPT_PHY_BIST
909 uint32_t enc_bist_mask;
910#endif /* EFSYS_OPT_PHY_BIST */
911} efx_nic_cfg_t;
912
913extern const efx_nic_cfg_t *
914efx_nic_cfg_get(
915 __in efx_nic_t *enp);
916
917#if EFSYS_OPT_VPD
918
919typedef enum efx_vpd_tag_e {
920 EFX_VPD_ID = 0x02,
921 EFX_VPD_END = 0x0f,
922 EFX_VPD_RO = 0x10,
923 EFX_VPD_RW = 0x11,
924} efx_vpd_tag_t;
925
926typedef uint16_t efx_vpd_keyword_t;
927
928typedef struct efx_vpd_value_s {
929 efx_vpd_tag_t evv_tag;
930 efx_vpd_keyword_t evv_keyword;
931 uint8_t evv_length;
932 uint8_t evv_value[0x100];
933} efx_vpd_value_t;
934
935
936#define EFX_VPD_KEYWORD(x, y) ((x) | ((y) << 8))
937
938extern __checkReturn int
939efx_vpd_init(
940 __in efx_nic_t *enp);
941
942extern __checkReturn int
943efx_vpd_size(
944 __in efx_nic_t *enp,
945 __out size_t *sizep);
946
947extern __checkReturn int
948efx_vpd_read(
949 __in efx_nic_t *enp,
950 __out_bcount(size) caddr_t data,
951 __in size_t size);
952
953extern __checkReturn int
954efx_vpd_verify(
955 __in efx_nic_t *enp,
956 __in_bcount(size) caddr_t data,
957 __in size_t size);
958
959extern __checkReturn int
960efx_vpd_reinit(
961 __in efx_nic_t *enp,
962 __in_bcount(size) caddr_t data,
963 __in size_t size);
964
965extern __checkReturn int
966efx_vpd_get(
967 __in efx_nic_t *enp,
968 __in_bcount(size) caddr_t data,
969 __in size_t size,
970 __inout efx_vpd_value_t *evvp);
971
972extern __checkReturn int
973efx_vpd_set(
974 __in efx_nic_t *enp,
975 __inout_bcount(size) caddr_t data,
976 __in size_t size,
977 __in efx_vpd_value_t *evvp);
978
979extern __checkReturn int
980efx_vpd_next(
981 __in efx_nic_t *enp,
982 __inout_bcount(size) caddr_t data,
983 __in size_t size,
984 __out efx_vpd_value_t *evvp,
985 __inout unsigned int *contp);
986
987extern __checkReturn int
988efx_vpd_write(
989 __in efx_nic_t *enp,
990 __in_bcount(size) caddr_t data,
991 __in size_t size);
992
993extern void
994efx_vpd_fini(
995 __in efx_nic_t *enp);
996
997#endif /* EFSYS_OPT_VPD */
998
999/* NVRAM */
1000
1001#if EFSYS_OPT_NVRAM
1002
1003typedef enum efx_nvram_type_e {
1004 EFX_NVRAM_INVALID = 0,
1005 EFX_NVRAM_BOOTROM,
1006 EFX_NVRAM_BOOTROM_CFG,
1007 EFX_NVRAM_MC_FIRMWARE,
1008 EFX_NVRAM_MC_GOLDEN,
1009 EFX_NVRAM_PHY,
1010 EFX_NVRAM_NULLPHY,
1011 EFX_NVRAM_NTYPES,
1012} efx_nvram_type_t;
1013
1014extern __checkReturn int
1015efx_nvram_init(
1016 __in efx_nic_t *enp);
1017
1018#if EFSYS_OPT_DIAG
1019
1020extern __checkReturn int
1021efx_nvram_test(
1022 __in efx_nic_t *enp);
1023
1024#endif /* EFSYS_OPT_DIAG */
1025
1026extern __checkReturn int
1027efx_nvram_size(
1028 __in efx_nic_t *enp,
1029 __in efx_nvram_type_t type,
1030 __out size_t *sizep);
1031
1032extern __checkReturn int
1033efx_nvram_rw_start(
1034 __in efx_nic_t *enp,
1035 __in efx_nvram_type_t type,
1036 __out_opt size_t *pref_chunkp);
1037
1038extern void
1039efx_nvram_rw_finish(
1040 __in efx_nic_t *enp,
1041 __in efx_nvram_type_t type);
1042
1043extern __checkReturn int
1044efx_nvram_get_version(
1045 __in efx_nic_t *enp,
1046 __in efx_nvram_type_t type,
1047 __out uint32_t *subtypep,
1048 __out_ecount(4) uint16_t version[4]);
1049
1050extern __checkReturn int
1051efx_nvram_read_chunk(
1052 __in efx_nic_t *enp,
1053 __in efx_nvram_type_t type,
1054 __in unsigned int offset,
1055 __out_bcount(size) caddr_t data,
1056 __in size_t size);
1057
1058extern __checkReturn int
1059efx_nvram_set_version(
1060 __in efx_nic_t *enp,
1061 __in efx_nvram_type_t type,
1062 __out uint16_t version[4]);
1063
1064extern __checkReturn int
1065efx_nvram_erase(
1066 __in efx_nic_t *enp,
1067 __in efx_nvram_type_t type);
1068
1069extern __checkReturn int
1070efx_nvram_write_chunk(
1071 __in efx_nic_t *enp,
1072 __in efx_nvram_type_t type,
1073 __in unsigned int offset,
1074 __in_bcount(size) caddr_t data,
1075 __in size_t size);
1076
1077extern void
1078efx_nvram_fini(
1079 __in efx_nic_t *enp);
1080
1081#endif /* EFSYS_OPT_NVRAM */
1082
1083#if EFSYS_OPT_BOOTCFG
1084
1085extern int
1086efx_bootcfg_read(
1087 __in efx_nic_t *enp,
1088 __out_bcount(size) caddr_t data,
1089 __in size_t size);
1090
1091extern int
1092efx_bootcfg_write(
1093 __in efx_nic_t *enp,
1094 __in_bcount(size) caddr_t data,
1095 __in size_t size);
1096
1097#endif /* EFSYS_OPT_BOOTCFG */
1098
1099#if EFSYS_OPT_WOL
1100
1101typedef enum efx_wol_type_e {
1102 EFX_WOL_TYPE_INVALID,
1103 EFX_WOL_TYPE_MAGIC,
1104 EFX_WOL_TYPE_BITMAP,
1105 EFX_WOL_TYPE_LINK,
1106 EFX_WOL_NTYPES,
1107} efx_wol_type_t;
1108
1109typedef enum efx_lightsout_offload_type_e {
1110 EFX_LIGHTSOUT_OFFLOAD_TYPE_INVALID,
1111 EFX_LIGHTSOUT_OFFLOAD_TYPE_ARP,
1112 EFX_LIGHTSOUT_OFFLOAD_TYPE_NS,
1113} efx_lightsout_offload_type_t;
1114
1115#define EFX_WOL_BITMAP_MASK_SIZE (48)
1116#define EFX_WOL_BITMAP_VALUE_SIZE (128)
1117
1118typedef union efx_wol_param_u {
1119 struct {
1120 uint8_t mac_addr[6];
1121 } ewp_magic;
1122 struct {
1123 uint8_t mask[EFX_WOL_BITMAP_MASK_SIZE]; /* 1 bit per byte */
1124 uint8_t value[EFX_WOL_BITMAP_VALUE_SIZE]; /* value to match */
1125 uint8_t value_len;
1126 } ewp_bitmap;
1127} efx_wol_param_t;
1128
1129typedef union efx_lightsout_offload_param_u {
1130 struct {
1131 uint8_t mac_addr[6];
1132 uint32_t ip;
1133 } elop_arp;
1134 struct {
1135 uint8_t mac_addr[6];
1136 uint32_t solicited_node[4];
1137 uint32_t ip[4];
1138 } elop_ns;
1139} efx_lightsout_offload_param_t;
1140
1141extern __checkReturn int
1142efx_wol_init(
1143 __in efx_nic_t *enp);
1144
1145extern __checkReturn int
1146efx_wol_filter_clear(
1147 __in efx_nic_t *enp);
1148
1149extern __checkReturn int
1150efx_wol_filter_add(
1151 __in efx_nic_t *enp,
1152 __in efx_wol_type_t type,
1153 __in efx_wol_param_t *paramp,
1154 __out uint32_t *filter_idp);
1155
1156extern __checkReturn int
1157efx_wol_filter_remove(
1158 __in efx_nic_t *enp,
1159 __in uint32_t filter_id);
1160
1161extern __checkReturn int
1162efx_lightsout_offload_add(
1163 __in efx_nic_t *enp,
1164 __in efx_lightsout_offload_type_t type,
1165 __in efx_lightsout_offload_param_t *paramp,
1166 __out uint32_t *filter_idp);
1167
1168extern __checkReturn int
1169efx_lightsout_offload_remove(
1170 __in efx_nic_t *enp,
1171 __in efx_lightsout_offload_type_t type,
1172 __in uint32_t filter_id);
1173
1174extern void
1175efx_wol_fini(
1176 __in efx_nic_t *enp);
1177
1178#endif /* EFSYS_OPT_WOL */
1179
1180#if EFSYS_OPT_DIAG
1181
1182typedef enum efx_pattern_type_t {
1183 EFX_PATTERN_BYTE_INCREMENT = 0,
1184 EFX_PATTERN_ALL_THE_SAME,
1185 EFX_PATTERN_BIT_ALTERNATE,
1186 EFX_PATTERN_BYTE_ALTERNATE,
1187 EFX_PATTERN_BYTE_CHANGING,
1188 EFX_PATTERN_BIT_SWEEP,
1189 EFX_PATTERN_NTYPES
1190} efx_pattern_type_t;
1191
1192typedef void
1193(*efx_sram_pattern_fn_t)(
1194 __in size_t row,
1195 __in boolean_t negate,
1196 __out efx_qword_t *eqp);
1197
1198extern __checkReturn int
1199efx_sram_test(
1200 __in efx_nic_t *enp,
1201 __in efx_pattern_type_t type);
1202
1203#endif /* EFSYS_OPT_DIAG */
1204
1205extern __checkReturn int
1206efx_sram_buf_tbl_set(
1207 __in efx_nic_t *enp,
1208 __in uint32_t id,
1209 __in efsys_mem_t *esmp,
1210 __in size_t n);
1211
1212extern void
1213efx_sram_buf_tbl_clear(
1214 __in efx_nic_t *enp,
1215 __in uint32_t id,
1216 __in size_t n);
1217
1218#define EFX_BUF_TBL_SIZE 0x20000
1219
1220#define EFX_BUF_SIZE 4096
1221
1222/* EV */
1223
1224typedef struct efx_evq_s efx_evq_t;
1225
1226#if EFSYS_OPT_QSTATS
1227
1228/* START MKCONFIG GENERATED EfxHeaderEventQueueBlock d5614a5d669c8ca3 */
1229typedef enum efx_ev_qstat_e {
1230 EV_ALL,
1231 EV_RX,
1232 EV_RX_OK,
1233 EV_RX_RECOVERY,
1234 EV_RX_FRM_TRUNC,
1235 EV_RX_TOBE_DISC,
1236 EV_RX_PAUSE_FRM_ERR,
1237 EV_RX_BUF_OWNER_ID_ERR,
1238 EV_RX_IPV4_HDR_CHKSUM_ERR,
1239 EV_RX_TCP_UDP_CHKSUM_ERR,
1240 EV_RX_ETH_CRC_ERR,
1241 EV_RX_IP_FRAG_ERR,
1242 EV_RX_MCAST_PKT,
1243 EV_RX_MCAST_HASH_MATCH,
1244 EV_RX_TCP_IPV4,
1245 EV_RX_TCP_IPV6,
1246 EV_RX_UDP_IPV4,
1247 EV_RX_UDP_IPV6,
1248 EV_RX_OTHER_IPV4,
1249 EV_RX_OTHER_IPV6,
1250 EV_RX_NON_IP,
1251 EV_RX_OVERRUN,
1252 EV_TX,
1253 EV_TX_WQ_FF_FULL,
1254 EV_TX_PKT_ERR,
1255 EV_TX_PKT_TOO_BIG,
1256 EV_TX_UNEXPECTED,
1257 EV_GLOBAL,
1258 EV_GLOBAL_PHY,
1259 EV_GLOBAL_MNT,
1260 EV_GLOBAL_RX_RECOVERY,
1261 EV_DRIVER,
1262 EV_DRIVER_SRM_UPD_DONE,
1263 EV_DRIVER_TX_DESCQ_FLS_DONE,
1264 EV_DRIVER_RX_DESCQ_FLS_DONE,
1265 EV_DRIVER_RX_DESCQ_FLS_FAILED,
1266 EV_DRIVER_RX_DSC_ERROR,
1267 EV_DRIVER_TX_DSC_ERROR,
1268 EV_DRV_GEN,
1269 EV_MCDI_RESPONSE,
1270 EV_NQSTATS
1271} efx_ev_qstat_t;
1272
1273/* END MKCONFIG GENERATED EfxHeaderEventQueueBlock */
1274
1275#endif /* EFSYS_OPT_QSTATS */
1276
1277extern __checkReturn int
1278efx_ev_init(
1279 __in efx_nic_t *enp);
1280
1281extern void
1282efx_ev_fini(
1283 __in efx_nic_t *enp);
1284
1285#define EFX_MASK(_max, _min) (-((_max) << 1) ^ -(_min))
1286
1287#define EFX_EVQ_MAXNEVS 32768
1288#define EFX_EVQ_MINNEVS 512
1289
1290#define EFX_EVQ_NEVS_MASK EFX_MASK(EFX_EVQ_MAXNEVS, EFX_EVQ_MINNEVS)
1291
1292#define EFX_EVQ_SIZE(_nevs) ((_nevs) * sizeof (efx_qword_t))
1293#define EFX_EVQ_NBUFS(_nevs) (EFX_EVQ_SIZE(_nevs) / EFX_BUF_SIZE)
1294
1295extern __checkReturn int
1296efx_ev_qcreate(
1297 __in efx_nic_t *enp,
1298 __in unsigned int index,
1299 __in efsys_mem_t *esmp,
1300 __in size_t n,
1301 __in uint32_t id,
1302 __deref_out efx_evq_t **eepp);
1303
1304extern void
1305efx_ev_qpost(
1306 __in efx_evq_t *eep,
1307 __in uint16_t data);
1308
1309typedef __checkReturn boolean_t
1310(*efx_initialized_ev_t)(
1311 __in_opt void *arg);
1312
1313#define EFX_PKT_UNICAST 0x0004
1314#define EFX_PKT_START 0x0008
1315
1316#define EFX_PKT_VLAN_TAGGED 0x0010
1317#define EFX_CKSUM_TCPUDP 0x0020
1318#define EFX_CKSUM_IPV4 0x0040
1319#define EFX_PKT_CONT 0x0080
1320
1321#define EFX_CHECK_VLAN 0x0100
1322#define EFX_PKT_TCP 0x0200
1323#define EFX_PKT_UDP 0x0400
1324#define EFX_PKT_IPV4 0x0800
1325
1326#define EFX_PKT_IPV6 0x1000
1327#define EFX_ADDR_MISMATCH 0x4000
1328#define EFX_DISCARD 0x8000
1329
1330#define EFX_EV_RX_NLABELS 32
1331#define EFX_EV_TX_NLABELS 32
1332
1333typedef __checkReturn boolean_t
1334(*efx_rx_ev_t)(
1335 __in_opt void *arg,
1336 __in uint32_t label,
1337 __in uint32_t id,
1338 __in uint32_t size,
1339 __in uint16_t flags);
1340
1341typedef __checkReturn boolean_t
1342(*efx_tx_ev_t)(
1343 __in_opt void *arg,
1344 __in uint32_t label,
1345 __in uint32_t id);
1346
1347#define EFX_EXCEPTION_RX_RECOVERY 0x00000001
1348#define EFX_EXCEPTION_RX_DSC_ERROR 0x00000002
1349#define EFX_EXCEPTION_TX_DSC_ERROR 0x00000003
1350#define EFX_EXCEPTION_UNKNOWN_SENSOREVT 0x00000004
1351#define EFX_EXCEPTION_FWALERT_SRAM 0x00000005
1352#define EFX_EXCEPTION_UNKNOWN_FWALERT 0x00000006
1353
1354typedef __checkReturn boolean_t
1355(*efx_exception_ev_t)(
1356 __in_opt void *arg,
1357 __in uint32_t label,
1358 __in uint32_t data);
1359
1360typedef __checkReturn boolean_t
1361(*efx_rxq_flush_done_ev_t)(
1362 __in_opt void *arg,
1363 __in uint32_t label);
1363 __in uint32_t rxq_index);
1364
1365typedef __checkReturn boolean_t
1366(*efx_rxq_flush_failed_ev_t)(
1367 __in_opt void *arg,
1364
1365typedef __checkReturn boolean_t
1366(*efx_rxq_flush_failed_ev_t)(
1367 __in_opt void *arg,
1368 __in uint32_t label);
1368 __in uint32_t rxq_index);
1369
1370typedef __checkReturn boolean_t
1371(*efx_txq_flush_done_ev_t)(
1372 __in_opt void *arg,
1369
1370typedef __checkReturn boolean_t
1371(*efx_txq_flush_done_ev_t)(
1372 __in_opt void *arg,
1373 __in uint32_t label);
1373 __in uint32_t txq_index);
1374
1375typedef __checkReturn boolean_t
1376(*efx_software_ev_t)(
1377 __in_opt void *arg,
1378 __in uint16_t magic);
1379
1380typedef __checkReturn boolean_t
1381(*efx_sram_ev_t)(
1382 __in_opt void *arg,
1383 __in uint32_t code);
1384
1385#define EFX_SRAM_CLEAR 0
1386#define EFX_SRAM_UPDATE 1
1387#define EFX_SRAM_ILLEGAL_CLEAR 2
1388
1389typedef __checkReturn boolean_t
1390(*efx_wake_up_ev_t)(
1391 __in_opt void *arg,
1392 __in uint32_t label);
1393
1394typedef __checkReturn boolean_t
1395(*efx_timer_ev_t)(
1396 __in_opt void *arg,
1397 __in uint32_t label);
1398
1399typedef __checkReturn boolean_t
1400(*efx_link_change_ev_t)(
1401 __in_opt void *arg,
1402 __in efx_link_mode_t link_mode);
1403
1404#if EFSYS_OPT_MON_STATS
1405
1406typedef __checkReturn boolean_t
1407(*efx_monitor_ev_t)(
1408 __in_opt void *arg,
1409 __in efx_mon_stat_t id,
1410 __in efx_mon_stat_value_t value);
1411
1412#endif /* EFSYS_OPT_MON_STATS */
1413
1414#if EFSYS_OPT_MAC_STATS
1415
1416typedef __checkReturn boolean_t
1417(*efx_mac_stats_ev_t)(
1418 __in_opt void *arg,
1419 __in uint32_t generation
1420 );
1421
1422#endif /* EFSYS_OPT_MAC_STATS */
1423
1424typedef struct efx_ev_callbacks_s {
1425 efx_initialized_ev_t eec_initialized;
1426 efx_rx_ev_t eec_rx;
1427 efx_tx_ev_t eec_tx;
1428 efx_exception_ev_t eec_exception;
1429 efx_rxq_flush_done_ev_t eec_rxq_flush_done;
1430 efx_rxq_flush_failed_ev_t eec_rxq_flush_failed;
1431 efx_txq_flush_done_ev_t eec_txq_flush_done;
1432 efx_software_ev_t eec_software;
1433 efx_sram_ev_t eec_sram;
1434 efx_wake_up_ev_t eec_wake_up;
1435 efx_timer_ev_t eec_timer;
1436 efx_link_change_ev_t eec_link_change;
1437#if EFSYS_OPT_MON_STATS
1438 efx_monitor_ev_t eec_monitor;
1439#endif /* EFSYS_OPT_MON_STATS */
1440#if EFSYS_OPT_MAC_STATS
1441 efx_mac_stats_ev_t eec_mac_stats;
1442#endif /* EFSYS_OPT_MON_STATS */
1443} efx_ev_callbacks_t;
1444
1445extern __checkReturn boolean_t
1446efx_ev_qpending(
1447 __in efx_evq_t *eep,
1448 __in unsigned int count);
1449
1450#if EFSYS_OPT_EV_PREFETCH
1451
1452extern void
1453efx_ev_qprefetch(
1454 __in efx_evq_t *eep,
1455 __in unsigned int count);
1456
1457#endif /* EFSYS_OPT_EV_PREFETCH */
1458
1459extern void
1460efx_ev_qpoll(
1461 __in efx_evq_t *eep,
1462 __inout unsigned int *countp,
1463 __in const efx_ev_callbacks_t *eecp,
1464 __in_opt void *arg);
1465
1466extern __checkReturn int
1467efx_ev_qmoderate(
1468 __in efx_evq_t *eep,
1469 __in unsigned int us);
1470
1471extern __checkReturn int
1472efx_ev_qprime(
1473 __in efx_evq_t *eep,
1474 __in unsigned int count);
1475
1476#if EFSYS_OPT_QSTATS
1477
1478#if EFSYS_OPT_NAMES
1479
1480extern const char __cs *
1481efx_ev_qstat_name(
1482 __in efx_nic_t *enp,
1483 __in unsigned int id);
1484
1485#endif /* EFSYS_OPT_NAMES */
1486
1487extern void
1488efx_ev_qstats_update(
1489 __in efx_evq_t *eep,
1490 __inout_ecount(EV_NQSTATS) efsys_stat_t *stat);
1491
1492#endif /* EFSYS_OPT_QSTATS */
1493
1494extern void
1495efx_ev_qdestroy(
1496 __in efx_evq_t *eep);
1497
1498/* RX */
1499
1500typedef struct efx_rxq_s efx_rxq_t;
1501
1502extern __checkReturn int
1503efx_rx_init(
1504 __in efx_nic_t *enp);
1505
1506extern void
1507efx_rx_fini(
1508 __in efx_nic_t *enp);
1509
1510#if EFSYS_OPT_RX_HDR_SPLIT
1511 __checkReturn int
1512efx_rx_hdr_split_enable(
1513 __in efx_nic_t *enp,
1514 __in unsigned int hdr_buf_size,
1515 __in unsigned int pld_buf_size);
1516
1517#endif /* EFSYS_OPT_RX_HDR_SPLIT */
1518
1519#if EFSYS_OPT_RX_SCATTER
1520 __checkReturn int
1521efx_rx_scatter_enable(
1522 __in efx_nic_t *enp,
1523 __in unsigned int buf_size);
1524#endif /* EFSYS_OPT_RX_SCATTER */
1525
1526#if EFSYS_OPT_RX_SCALE
1527
1528typedef enum efx_rx_hash_alg_e {
1529 EFX_RX_HASHALG_LFSR = 0,
1530 EFX_RX_HASHALG_TOEPLITZ
1531} efx_rx_hash_alg_t;
1532
1533typedef enum efx_rx_hash_type_e {
1534 EFX_RX_HASH_IPV4 = 0,
1535 EFX_RX_HASH_TCPIPV4,
1536 EFX_RX_HASH_IPV6,
1537 EFX_RX_HASH_TCPIPV6,
1538} efx_rx_hash_type_t;
1539
1540#define EFX_RSS_TBL_SIZE 128 /* Rows in RX indirection table */
1541#define EFX_MAXRSS 64 /* RX indirection entry range */
1542#define EFX_MAXRSS_LEGACY 16 /* See bug16611 and bug17213 */
1543
1544extern __checkReturn int
1545efx_rx_scale_mode_set(
1546 __in efx_nic_t *enp,
1547 __in efx_rx_hash_alg_t alg,
1548 __in efx_rx_hash_type_t type,
1549 __in boolean_t insert);
1550
1551extern __checkReturn int
1552efx_rx_scale_tbl_set(
1553 __in efx_nic_t *enp,
1554 __in_ecount(n) unsigned int *table,
1555 __in size_t n);
1556
1557extern __checkReturn int
1558efx_rx_scale_toeplitz_ipv4_key_set(
1559 __in efx_nic_t *enp,
1560 __in_ecount(n) uint8_t *key,
1561 __in size_t n);
1562
1563extern __checkReturn int
1564efx_rx_scale_toeplitz_ipv6_key_set(
1565 __in efx_nic_t *enp,
1566 __in_ecount(n) uint8_t *key,
1567 __in size_t n);
1568
1569/*
1570 * The prefix is a byte array of one of the forms:
1571 *
1572 * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1573 * XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.TT.TT.TT.TT
1574 * XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.LL.LL
1575 *
1576 * where:
1577 *
1578 * TT.TT.TT.TT is a 32-bit Toeplitz hash
1579 * LL.LL is a 16-bit LFSR hash
1580 *
1581 * Hash values are in network (big-endian) byte order.
1582 */
1583
1584#define EFX_RX_PREFIX_SIZE 16
1585
1586#define EFX_RX_HASH_VALUE(_func, _buffer) \
1587 (((_func) == EFX_RX_HASHALG_LFSR) ? \
1588 ((uint16_t)(((_buffer)[14] << 8) | (_buffer)[15])) : \
1589 ((uint32_t)(((_buffer)[12] << 24) | \
1590 ((_buffer)[13] << 16) | \
1591 ((_buffer)[14] << 8) | \
1592 (_buffer)[15])))
1593
1594#define EFX_RX_HASH_SIZE(_func) \
1595 (((_func) == EFX_RX_HASHALG_LFSR) ? \
1596 sizeof (uint16_t) : \
1597 sizeof (uint32_t))
1598
1599#endif /* EFSYS_OPT_RX_SCALE */
1600
1601#define EFX_RXQ_MAXNDESCS 4096
1602#define EFX_RXQ_MINNDESCS 512
1603
1604#define EFX_RXQ_NDESCS_MASK EFX_MASK(EFX_RXQ_MAXNDESCS, EFX_RXQ_MINNDESCS)
1605
1606#define EFX_RXQ_SIZE(_ndescs) ((_ndescs) * sizeof (efx_qword_t))
1607#define EFX_RXQ_NBUFS(_ndescs) (EFX_RXQ_SIZE(_ndescs) / EFX_BUF_SIZE)
1608#define EFX_RXQ_LIMIT(_ndescs) ((_ndescs) - 16)
1609
1610typedef enum efx_rxq_type_e {
1611 EFX_RXQ_TYPE_DEFAULT,
1612 EFX_RXQ_TYPE_SPLIT_HEADER,
1613 EFX_RXQ_TYPE_SPLIT_PAYLOAD,
1614 EFX_RXQ_TYPE_SCATTER,
1615 EFX_RXQ_NTYPES
1616} efx_rxq_type_t;
1617
1618extern __checkReturn int
1619efx_rx_qcreate(
1620 __in efx_nic_t *enp,
1621 __in unsigned int index,
1622 __in unsigned int label,
1623 __in efx_rxq_type_t type,
1624 __in efsys_mem_t *esmp,
1625 __in size_t n,
1626 __in uint32_t id,
1627 __in efx_evq_t *eep,
1628 __deref_out efx_rxq_t **erpp);
1629
1630typedef struct efx_buffer_s {
1631 efsys_dma_addr_t eb_addr;
1632 size_t eb_size;
1633 boolean_t eb_eop;
1634} efx_buffer_t;
1635
1636extern void
1637efx_rx_qpost(
1638 __in efx_rxq_t *erp,
1639 __in_ecount(n) efsys_dma_addr_t *addrp,
1640 __in size_t size,
1641 __in unsigned int n,
1642 __in unsigned int completed,
1643 __in unsigned int added);
1644
1645extern void
1646efx_rx_qpush(
1647 __in efx_rxq_t *erp,
1648 __in unsigned int added);
1649
1650extern void
1651efx_rx_qflush(
1652 __in efx_rxq_t *erp);
1653
1654extern void
1655efx_rx_qenable(
1656 __in efx_rxq_t *erp);
1657
1658extern void
1659efx_rx_qdestroy(
1660 __in efx_rxq_t *erp);
1661
1662/* TX */
1663
1664typedef struct efx_txq_s efx_txq_t;
1665
1666#if EFSYS_OPT_QSTATS
1667
1668/* START MKCONFIG GENERATED EfxHeaderTransmitQueueBlock 536c5fa5014944bf */
1669typedef enum efx_tx_qstat_e {
1670 TX_POST,
1671 TX_UNALIGNED_SPLIT,
1672 TX_NQSTATS
1673} efx_tx_qstat_t;
1674
1675/* END MKCONFIG GENERATED EfxHeaderTransmitQueueBlock */
1676
1677#endif /* EFSYS_OPT_QSTATS */
1678
1679extern __checkReturn int
1680efx_tx_init(
1681 __in efx_nic_t *enp);
1682
1683extern void
1684efx_tx_fini(
1685 __in efx_nic_t *enp);
1686
1687#define EFX_TXQ_MAXNDESCS 4096
1688#define EFX_TXQ_MINNDESCS 512
1689
1690#define EFX_TXQ_NDESCS_MASK EFX_MASK(EFX_TXQ_MAXNDESCS, EFX_TXQ_MINNDESCS)
1691
1692#define EFX_TXQ_SIZE(_ndescs) ((_ndescs) * sizeof (efx_qword_t))
1693#define EFX_TXQ_NBUFS(_ndescs) (EFX_TXQ_SIZE(_ndescs) / EFX_BUF_SIZE)
1694#define EFX_TXQ_LIMIT(_ndescs) ((_ndescs) - 16)
1695
1696extern __checkReturn int
1697efx_tx_qcreate(
1698 __in efx_nic_t *enp,
1699 __in unsigned int index,
1700 __in unsigned int label,
1701 __in efsys_mem_t *esmp,
1702 __in size_t n,
1703 __in uint32_t id,
1704 __in uint16_t flags,
1705 __in efx_evq_t *eep,
1706 __deref_out efx_txq_t **etpp);
1707
1708extern __checkReturn int
1709efx_tx_qpost(
1710 __in efx_txq_t *etp,
1711 __in_ecount(n) efx_buffer_t *eb,
1712 __in unsigned int n,
1713 __in unsigned int completed,
1714 __inout unsigned int *addedp);
1715
1716extern void
1717efx_tx_qpush(
1718 __in efx_txq_t *etp,
1719 __in unsigned int added);
1720
1721extern void
1722efx_tx_qflush(
1723 __in efx_txq_t *etp);
1724
1725extern void
1726efx_tx_qenable(
1727 __in efx_txq_t *etp);
1728
1729#if EFSYS_OPT_QSTATS
1730
1731#if EFSYS_OPT_NAMES
1732
1733extern const char __cs *
1734efx_tx_qstat_name(
1735 __in efx_nic_t *etp,
1736 __in unsigned int id);
1737
1738#endif /* EFSYS_OPT_NAMES */
1739
1740extern void
1741efx_tx_qstats_update(
1742 __in efx_txq_t *etp,
1743 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat);
1744
1745#endif /* EFSYS_OPT_QSTATS */
1746
1747extern void
1748efx_tx_qdestroy(
1749 __in efx_txq_t *etp);
1750
1751
1752/* FILTER */
1753
1754#if EFSYS_OPT_FILTER
1755
1756typedef enum efx_filter_flag_e {
1757 EFX_FILTER_FLAG_RX_RSS = 0x01, /* use RSS to spread across
1758 * multiple queues */
1759 EFX_FILTER_FLAG_RX_SCATTER = 0x02, /* enable RX scatter */
1760 EFX_FILTER_FLAG_RX_OVERRIDE_IP = 0x04, /* MAC filter overrides
1761 * any matching IP filter */
1762} efx_filter_flag_t;
1763
1764typedef struct efx_filter_spec_s {
1765 uint8_t efs_type;
1766 uint8_t efs_flags;
1767 uint16_t efs_dmaq_id;
1768 uint32_t efs_dword[3];
1769} efx_filter_spec_t;
1770
1771extern __checkReturn int
1772efx_filter_init(
1773 __in efx_nic_t *enp);
1774
1775extern void
1776efx_filter_fini(
1777 __in efx_nic_t *enp);
1778
1779extern __checkReturn int
1780efx_rx_filter_insert(
1781 __in efx_rxq_t *erp,
1782 __inout efx_filter_spec_t *spec);
1783
1784extern __checkReturn int
1785efx_rx_filter_remove(
1786 __in efx_rxq_t *erp,
1787 __inout efx_filter_spec_t *spec);
1788
1789 void
1790efx_filter_restore(
1791 __in efx_nic_t *enp);
1792
1793extern void
1794efx_filter_spec_rx_ipv4_tcp_full(
1795 __inout efx_filter_spec_t *spec,
1796 __in unsigned int flags,
1797 __in uint32_t src_ip,
1798 __in uint16_t src_tcp,
1799 __in uint32_t dest_ip,
1800 __in uint16_t dest_tcp);
1801
1802extern void
1803efx_filter_spec_rx_ipv4_tcp_wild(
1804 __inout efx_filter_spec_t *spec,
1805 __in unsigned int flags,
1806 __in uint32_t dest_ip,
1807 __in uint16_t dest_tcp);
1808
1809extern void
1810efx_filter_spec_rx_ipv4_udp_full(
1811 __inout efx_filter_spec_t *spec,
1812 __in unsigned int flags,
1813 __in uint32_t src_ip,
1814 __in uint16_t src_udp,
1815 __in uint32_t dest_ip,
1816 __in uint16_t dest_udp);
1817
1818extern void
1819efx_filter_spec_rx_ipv4_udp_wild(
1820 __inout efx_filter_spec_t *spec,
1821 __in unsigned int flags,
1822 __in uint32_t dest_ip,
1823 __in uint16_t dest_udp);
1824
1825extern void
1826efx_filter_spec_rx_mac_full(
1827 __inout efx_filter_spec_t *spec,
1828 __in unsigned int flags,
1829 __in uint16_t vlan_id,
1830 __in uint8_t *dest_mac);
1831
1832extern void
1833efx_filter_spec_rx_mac_wild(
1834 __inout efx_filter_spec_t *spec,
1835 __in unsigned int flags,
1836 __in uint8_t *dest_mac);
1837
1838
1839extern __checkReturn int
1840efx_tx_filter_insert(
1841 __in efx_txq_t *etp,
1842 __inout efx_filter_spec_t *spec);
1843
1844extern __checkReturn int
1845efx_tx_filter_remove(
1846 __in efx_txq_t *etp,
1847 __inout efx_filter_spec_t *spec);
1848
1849extern void
1850efx_filter_spec_tx_ipv4_tcp_full(
1851 __inout efx_filter_spec_t *spec,
1852 __in uint32_t src_ip,
1853 __in uint16_t src_tcp,
1854 __in uint32_t dest_ip,
1855 __in uint16_t dest_tcp);
1856
1857extern void
1858efx_filter_spec_tx_ipv4_tcp_wild(
1859 __inout efx_filter_spec_t *spec,
1860 __in uint32_t src_ip,
1861 __in uint16_t src_tcp);
1862
1863extern void
1864efx_filter_spec_tx_ipv4_udp_full(
1865 __inout efx_filter_spec_t *spec,
1866 __in uint32_t src_ip,
1867 __in uint16_t src_udp,
1868 __in uint32_t dest_ip,
1869 __in uint16_t dest_udp);
1870
1871extern void
1872efx_filter_spec_tx_ipv4_udp_wild(
1873 __inout efx_filter_spec_t *spec,
1874 __in uint32_t src_ip,
1875 __in uint16_t src_udp);
1876
1877extern void
1878efx_filter_spec_tx_mac_full(
1879 __inout efx_filter_spec_t *spec,
1880 __in uint16_t vlan_id,
1881 __in uint8_t *src_mac);
1882
1883extern void
1884efx_filter_spec_tx_mac_wild(
1885 __inout efx_filter_spec_t *spec,
1886 __in uint8_t *src_mac);
1887
1888#endif /* EFSYS_OPT_FILTER */
1889
1890
1891#ifdef __cplusplus
1892}
1893#endif
1894
1895#endif /* _SYS_EFX_H */
1374
1375typedef __checkReturn boolean_t
1376(*efx_software_ev_t)(
1377 __in_opt void *arg,
1378 __in uint16_t magic);
1379
1380typedef __checkReturn boolean_t
1381(*efx_sram_ev_t)(
1382 __in_opt void *arg,
1383 __in uint32_t code);
1384
1385#define EFX_SRAM_CLEAR 0
1386#define EFX_SRAM_UPDATE 1
1387#define EFX_SRAM_ILLEGAL_CLEAR 2
1388
1389typedef __checkReturn boolean_t
1390(*efx_wake_up_ev_t)(
1391 __in_opt void *arg,
1392 __in uint32_t label);
1393
1394typedef __checkReturn boolean_t
1395(*efx_timer_ev_t)(
1396 __in_opt void *arg,
1397 __in uint32_t label);
1398
1399typedef __checkReturn boolean_t
1400(*efx_link_change_ev_t)(
1401 __in_opt void *arg,
1402 __in efx_link_mode_t link_mode);
1403
1404#if EFSYS_OPT_MON_STATS
1405
1406typedef __checkReturn boolean_t
1407(*efx_monitor_ev_t)(
1408 __in_opt void *arg,
1409 __in efx_mon_stat_t id,
1410 __in efx_mon_stat_value_t value);
1411
1412#endif /* EFSYS_OPT_MON_STATS */
1413
1414#if EFSYS_OPT_MAC_STATS
1415
1416typedef __checkReturn boolean_t
1417(*efx_mac_stats_ev_t)(
1418 __in_opt void *arg,
1419 __in uint32_t generation
1420 );
1421
1422#endif /* EFSYS_OPT_MAC_STATS */
1423
1424typedef struct efx_ev_callbacks_s {
1425 efx_initialized_ev_t eec_initialized;
1426 efx_rx_ev_t eec_rx;
1427 efx_tx_ev_t eec_tx;
1428 efx_exception_ev_t eec_exception;
1429 efx_rxq_flush_done_ev_t eec_rxq_flush_done;
1430 efx_rxq_flush_failed_ev_t eec_rxq_flush_failed;
1431 efx_txq_flush_done_ev_t eec_txq_flush_done;
1432 efx_software_ev_t eec_software;
1433 efx_sram_ev_t eec_sram;
1434 efx_wake_up_ev_t eec_wake_up;
1435 efx_timer_ev_t eec_timer;
1436 efx_link_change_ev_t eec_link_change;
1437#if EFSYS_OPT_MON_STATS
1438 efx_monitor_ev_t eec_monitor;
1439#endif /* EFSYS_OPT_MON_STATS */
1440#if EFSYS_OPT_MAC_STATS
1441 efx_mac_stats_ev_t eec_mac_stats;
1442#endif /* EFSYS_OPT_MON_STATS */
1443} efx_ev_callbacks_t;
1444
1445extern __checkReturn boolean_t
1446efx_ev_qpending(
1447 __in efx_evq_t *eep,
1448 __in unsigned int count);
1449
1450#if EFSYS_OPT_EV_PREFETCH
1451
1452extern void
1453efx_ev_qprefetch(
1454 __in efx_evq_t *eep,
1455 __in unsigned int count);
1456
1457#endif /* EFSYS_OPT_EV_PREFETCH */
1458
1459extern void
1460efx_ev_qpoll(
1461 __in efx_evq_t *eep,
1462 __inout unsigned int *countp,
1463 __in const efx_ev_callbacks_t *eecp,
1464 __in_opt void *arg);
1465
1466extern __checkReturn int
1467efx_ev_qmoderate(
1468 __in efx_evq_t *eep,
1469 __in unsigned int us);
1470
1471extern __checkReturn int
1472efx_ev_qprime(
1473 __in efx_evq_t *eep,
1474 __in unsigned int count);
1475
1476#if EFSYS_OPT_QSTATS
1477
1478#if EFSYS_OPT_NAMES
1479
1480extern const char __cs *
1481efx_ev_qstat_name(
1482 __in efx_nic_t *enp,
1483 __in unsigned int id);
1484
1485#endif /* EFSYS_OPT_NAMES */
1486
1487extern void
1488efx_ev_qstats_update(
1489 __in efx_evq_t *eep,
1490 __inout_ecount(EV_NQSTATS) efsys_stat_t *stat);
1491
1492#endif /* EFSYS_OPT_QSTATS */
1493
1494extern void
1495efx_ev_qdestroy(
1496 __in efx_evq_t *eep);
1497
1498/* RX */
1499
1500typedef struct efx_rxq_s efx_rxq_t;
1501
1502extern __checkReturn int
1503efx_rx_init(
1504 __in efx_nic_t *enp);
1505
1506extern void
1507efx_rx_fini(
1508 __in efx_nic_t *enp);
1509
1510#if EFSYS_OPT_RX_HDR_SPLIT
1511 __checkReturn int
1512efx_rx_hdr_split_enable(
1513 __in efx_nic_t *enp,
1514 __in unsigned int hdr_buf_size,
1515 __in unsigned int pld_buf_size);
1516
1517#endif /* EFSYS_OPT_RX_HDR_SPLIT */
1518
1519#if EFSYS_OPT_RX_SCATTER
1520 __checkReturn int
1521efx_rx_scatter_enable(
1522 __in efx_nic_t *enp,
1523 __in unsigned int buf_size);
1524#endif /* EFSYS_OPT_RX_SCATTER */
1525
1526#if EFSYS_OPT_RX_SCALE
1527
1528typedef enum efx_rx_hash_alg_e {
1529 EFX_RX_HASHALG_LFSR = 0,
1530 EFX_RX_HASHALG_TOEPLITZ
1531} efx_rx_hash_alg_t;
1532
1533typedef enum efx_rx_hash_type_e {
1534 EFX_RX_HASH_IPV4 = 0,
1535 EFX_RX_HASH_TCPIPV4,
1536 EFX_RX_HASH_IPV6,
1537 EFX_RX_HASH_TCPIPV6,
1538} efx_rx_hash_type_t;
1539
1540#define EFX_RSS_TBL_SIZE 128 /* Rows in RX indirection table */
1541#define EFX_MAXRSS 64 /* RX indirection entry range */
1542#define EFX_MAXRSS_LEGACY 16 /* See bug16611 and bug17213 */
1543
1544extern __checkReturn int
1545efx_rx_scale_mode_set(
1546 __in efx_nic_t *enp,
1547 __in efx_rx_hash_alg_t alg,
1548 __in efx_rx_hash_type_t type,
1549 __in boolean_t insert);
1550
1551extern __checkReturn int
1552efx_rx_scale_tbl_set(
1553 __in efx_nic_t *enp,
1554 __in_ecount(n) unsigned int *table,
1555 __in size_t n);
1556
1557extern __checkReturn int
1558efx_rx_scale_toeplitz_ipv4_key_set(
1559 __in efx_nic_t *enp,
1560 __in_ecount(n) uint8_t *key,
1561 __in size_t n);
1562
1563extern __checkReturn int
1564efx_rx_scale_toeplitz_ipv6_key_set(
1565 __in efx_nic_t *enp,
1566 __in_ecount(n) uint8_t *key,
1567 __in size_t n);
1568
1569/*
1570 * The prefix is a byte array of one of the forms:
1571 *
1572 * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1573 * XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.TT.TT.TT.TT
1574 * XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.LL.LL
1575 *
1576 * where:
1577 *
1578 * TT.TT.TT.TT is a 32-bit Toeplitz hash
1579 * LL.LL is a 16-bit LFSR hash
1580 *
1581 * Hash values are in network (big-endian) byte order.
1582 */
1583
1584#define EFX_RX_PREFIX_SIZE 16
1585
1586#define EFX_RX_HASH_VALUE(_func, _buffer) \
1587 (((_func) == EFX_RX_HASHALG_LFSR) ? \
1588 ((uint16_t)(((_buffer)[14] << 8) | (_buffer)[15])) : \
1589 ((uint32_t)(((_buffer)[12] << 24) | \
1590 ((_buffer)[13] << 16) | \
1591 ((_buffer)[14] << 8) | \
1592 (_buffer)[15])))
1593
1594#define EFX_RX_HASH_SIZE(_func) \
1595 (((_func) == EFX_RX_HASHALG_LFSR) ? \
1596 sizeof (uint16_t) : \
1597 sizeof (uint32_t))
1598
1599#endif /* EFSYS_OPT_RX_SCALE */
1600
1601#define EFX_RXQ_MAXNDESCS 4096
1602#define EFX_RXQ_MINNDESCS 512
1603
1604#define EFX_RXQ_NDESCS_MASK EFX_MASK(EFX_RXQ_MAXNDESCS, EFX_RXQ_MINNDESCS)
1605
1606#define EFX_RXQ_SIZE(_ndescs) ((_ndescs) * sizeof (efx_qword_t))
1607#define EFX_RXQ_NBUFS(_ndescs) (EFX_RXQ_SIZE(_ndescs) / EFX_BUF_SIZE)
1608#define EFX_RXQ_LIMIT(_ndescs) ((_ndescs) - 16)
1609
1610typedef enum efx_rxq_type_e {
1611 EFX_RXQ_TYPE_DEFAULT,
1612 EFX_RXQ_TYPE_SPLIT_HEADER,
1613 EFX_RXQ_TYPE_SPLIT_PAYLOAD,
1614 EFX_RXQ_TYPE_SCATTER,
1615 EFX_RXQ_NTYPES
1616} efx_rxq_type_t;
1617
1618extern __checkReturn int
1619efx_rx_qcreate(
1620 __in efx_nic_t *enp,
1621 __in unsigned int index,
1622 __in unsigned int label,
1623 __in efx_rxq_type_t type,
1624 __in efsys_mem_t *esmp,
1625 __in size_t n,
1626 __in uint32_t id,
1627 __in efx_evq_t *eep,
1628 __deref_out efx_rxq_t **erpp);
1629
1630typedef struct efx_buffer_s {
1631 efsys_dma_addr_t eb_addr;
1632 size_t eb_size;
1633 boolean_t eb_eop;
1634} efx_buffer_t;
1635
1636extern void
1637efx_rx_qpost(
1638 __in efx_rxq_t *erp,
1639 __in_ecount(n) efsys_dma_addr_t *addrp,
1640 __in size_t size,
1641 __in unsigned int n,
1642 __in unsigned int completed,
1643 __in unsigned int added);
1644
1645extern void
1646efx_rx_qpush(
1647 __in efx_rxq_t *erp,
1648 __in unsigned int added);
1649
1650extern void
1651efx_rx_qflush(
1652 __in efx_rxq_t *erp);
1653
1654extern void
1655efx_rx_qenable(
1656 __in efx_rxq_t *erp);
1657
1658extern void
1659efx_rx_qdestroy(
1660 __in efx_rxq_t *erp);
1661
1662/* TX */
1663
1664typedef struct efx_txq_s efx_txq_t;
1665
1666#if EFSYS_OPT_QSTATS
1667
1668/* START MKCONFIG GENERATED EfxHeaderTransmitQueueBlock 536c5fa5014944bf */
1669typedef enum efx_tx_qstat_e {
1670 TX_POST,
1671 TX_UNALIGNED_SPLIT,
1672 TX_NQSTATS
1673} efx_tx_qstat_t;
1674
1675/* END MKCONFIG GENERATED EfxHeaderTransmitQueueBlock */
1676
1677#endif /* EFSYS_OPT_QSTATS */
1678
1679extern __checkReturn int
1680efx_tx_init(
1681 __in efx_nic_t *enp);
1682
1683extern void
1684efx_tx_fini(
1685 __in efx_nic_t *enp);
1686
1687#define EFX_TXQ_MAXNDESCS 4096
1688#define EFX_TXQ_MINNDESCS 512
1689
1690#define EFX_TXQ_NDESCS_MASK EFX_MASK(EFX_TXQ_MAXNDESCS, EFX_TXQ_MINNDESCS)
1691
1692#define EFX_TXQ_SIZE(_ndescs) ((_ndescs) * sizeof (efx_qword_t))
1693#define EFX_TXQ_NBUFS(_ndescs) (EFX_TXQ_SIZE(_ndescs) / EFX_BUF_SIZE)
1694#define EFX_TXQ_LIMIT(_ndescs) ((_ndescs) - 16)
1695
1696extern __checkReturn int
1697efx_tx_qcreate(
1698 __in efx_nic_t *enp,
1699 __in unsigned int index,
1700 __in unsigned int label,
1701 __in efsys_mem_t *esmp,
1702 __in size_t n,
1703 __in uint32_t id,
1704 __in uint16_t flags,
1705 __in efx_evq_t *eep,
1706 __deref_out efx_txq_t **etpp);
1707
1708extern __checkReturn int
1709efx_tx_qpost(
1710 __in efx_txq_t *etp,
1711 __in_ecount(n) efx_buffer_t *eb,
1712 __in unsigned int n,
1713 __in unsigned int completed,
1714 __inout unsigned int *addedp);
1715
1716extern void
1717efx_tx_qpush(
1718 __in efx_txq_t *etp,
1719 __in unsigned int added);
1720
1721extern void
1722efx_tx_qflush(
1723 __in efx_txq_t *etp);
1724
1725extern void
1726efx_tx_qenable(
1727 __in efx_txq_t *etp);
1728
1729#if EFSYS_OPT_QSTATS
1730
1731#if EFSYS_OPT_NAMES
1732
1733extern const char __cs *
1734efx_tx_qstat_name(
1735 __in efx_nic_t *etp,
1736 __in unsigned int id);
1737
1738#endif /* EFSYS_OPT_NAMES */
1739
1740extern void
1741efx_tx_qstats_update(
1742 __in efx_txq_t *etp,
1743 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat);
1744
1745#endif /* EFSYS_OPT_QSTATS */
1746
1747extern void
1748efx_tx_qdestroy(
1749 __in efx_txq_t *etp);
1750
1751
1752/* FILTER */
1753
1754#if EFSYS_OPT_FILTER
1755
1756typedef enum efx_filter_flag_e {
1757 EFX_FILTER_FLAG_RX_RSS = 0x01, /* use RSS to spread across
1758 * multiple queues */
1759 EFX_FILTER_FLAG_RX_SCATTER = 0x02, /* enable RX scatter */
1760 EFX_FILTER_FLAG_RX_OVERRIDE_IP = 0x04, /* MAC filter overrides
1761 * any matching IP filter */
1762} efx_filter_flag_t;
1763
1764typedef struct efx_filter_spec_s {
1765 uint8_t efs_type;
1766 uint8_t efs_flags;
1767 uint16_t efs_dmaq_id;
1768 uint32_t efs_dword[3];
1769} efx_filter_spec_t;
1770
1771extern __checkReturn int
1772efx_filter_init(
1773 __in efx_nic_t *enp);
1774
1775extern void
1776efx_filter_fini(
1777 __in efx_nic_t *enp);
1778
1779extern __checkReturn int
1780efx_rx_filter_insert(
1781 __in efx_rxq_t *erp,
1782 __inout efx_filter_spec_t *spec);
1783
1784extern __checkReturn int
1785efx_rx_filter_remove(
1786 __in efx_rxq_t *erp,
1787 __inout efx_filter_spec_t *spec);
1788
1789 void
1790efx_filter_restore(
1791 __in efx_nic_t *enp);
1792
1793extern void
1794efx_filter_spec_rx_ipv4_tcp_full(
1795 __inout efx_filter_spec_t *spec,
1796 __in unsigned int flags,
1797 __in uint32_t src_ip,
1798 __in uint16_t src_tcp,
1799 __in uint32_t dest_ip,
1800 __in uint16_t dest_tcp);
1801
1802extern void
1803efx_filter_spec_rx_ipv4_tcp_wild(
1804 __inout efx_filter_spec_t *spec,
1805 __in unsigned int flags,
1806 __in uint32_t dest_ip,
1807 __in uint16_t dest_tcp);
1808
1809extern void
1810efx_filter_spec_rx_ipv4_udp_full(
1811 __inout efx_filter_spec_t *spec,
1812 __in unsigned int flags,
1813 __in uint32_t src_ip,
1814 __in uint16_t src_udp,
1815 __in uint32_t dest_ip,
1816 __in uint16_t dest_udp);
1817
1818extern void
1819efx_filter_spec_rx_ipv4_udp_wild(
1820 __inout efx_filter_spec_t *spec,
1821 __in unsigned int flags,
1822 __in uint32_t dest_ip,
1823 __in uint16_t dest_udp);
1824
1825extern void
1826efx_filter_spec_rx_mac_full(
1827 __inout efx_filter_spec_t *spec,
1828 __in unsigned int flags,
1829 __in uint16_t vlan_id,
1830 __in uint8_t *dest_mac);
1831
1832extern void
1833efx_filter_spec_rx_mac_wild(
1834 __inout efx_filter_spec_t *spec,
1835 __in unsigned int flags,
1836 __in uint8_t *dest_mac);
1837
1838
1839extern __checkReturn int
1840efx_tx_filter_insert(
1841 __in efx_txq_t *etp,
1842 __inout efx_filter_spec_t *spec);
1843
1844extern __checkReturn int
1845efx_tx_filter_remove(
1846 __in efx_txq_t *etp,
1847 __inout efx_filter_spec_t *spec);
1848
1849extern void
1850efx_filter_spec_tx_ipv4_tcp_full(
1851 __inout efx_filter_spec_t *spec,
1852 __in uint32_t src_ip,
1853 __in uint16_t src_tcp,
1854 __in uint32_t dest_ip,
1855 __in uint16_t dest_tcp);
1856
1857extern void
1858efx_filter_spec_tx_ipv4_tcp_wild(
1859 __inout efx_filter_spec_t *spec,
1860 __in uint32_t src_ip,
1861 __in uint16_t src_tcp);
1862
1863extern void
1864efx_filter_spec_tx_ipv4_udp_full(
1865 __inout efx_filter_spec_t *spec,
1866 __in uint32_t src_ip,
1867 __in uint16_t src_udp,
1868 __in uint32_t dest_ip,
1869 __in uint16_t dest_udp);
1870
1871extern void
1872efx_filter_spec_tx_ipv4_udp_wild(
1873 __inout efx_filter_spec_t *spec,
1874 __in uint32_t src_ip,
1875 __in uint16_t src_udp);
1876
1877extern void
1878efx_filter_spec_tx_mac_full(
1879 __inout efx_filter_spec_t *spec,
1880 __in uint16_t vlan_id,
1881 __in uint8_t *src_mac);
1882
1883extern void
1884efx_filter_spec_tx_mac_wild(
1885 __inout efx_filter_spec_t *spec,
1886 __in uint8_t *src_mac);
1887
1888#endif /* EFSYS_OPT_FILTER */
1889
1890
1891#ifdef __cplusplus
1892}
1893#endif
1894
1895#endif /* _SYS_EFX_H */