]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/sfxge/common/ef10_impl.h
sfxge(4): improve RxQ label init prototype
[FreeBSD/FreeBSD.git] / sys / dev / sfxge / common / ef10_impl.h
1 /*-
2  * Copyright (c) 2015-2016 Solarflare Communications Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  *    this list of conditions and the following disclaimer in the documentation
12  *    and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  * The views and conclusions contained in the software and documentation are
27  * those of the authors and should not be interpreted as representing official
28  * policies, either expressed or implied, of the FreeBSD Project.
29  *
30  * $FreeBSD$
31  */
32
33 #ifndef _SYS_EF10_IMPL_H
34 #define _SYS_EF10_IMPL_H
35
36 #ifdef  __cplusplus
37 extern "C" {
38 #endif
39
40 #if (EFSYS_OPT_HUNTINGTON && EFSYS_OPT_MEDFORD)
41 #define EF10_MAX_PIOBUF_NBUFS   MAX(HUNT_PIOBUF_NBUFS, MEDFORD_PIOBUF_NBUFS)
42 #elif EFSYS_OPT_HUNTINGTON
43 #define EF10_MAX_PIOBUF_NBUFS   HUNT_PIOBUF_NBUFS
44 #elif EFSYS_OPT_MEDFORD
45 #define EF10_MAX_PIOBUF_NBUFS   MEDFORD_PIOBUF_NBUFS
46 #endif
47
48 /*
49  * FIXME: This is just a power of 2 which fits in an MCDI v1 message, and could
50  * possibly be increased, or the write size reported by newer firmware used
51  * instead.
52  */
53 #define EF10_NVRAM_CHUNK 0x80
54
55 /* Alignment requirement for value written to RX WPTR:
56  *  the WPTR must be aligned to an 8 descriptor boundary
57  */
58 #define EF10_RX_WPTR_ALIGN 8
59
60 /*
61  * Max byte offset into the packet the TCP header must start for the hardware
62  * to be able to parse the packet correctly.
63  */
64 #define EF10_TCP_HEADER_OFFSET_LIMIT    208
65
66 /* Invalid RSS context handle */
67 #define EF10_RSS_CONTEXT_INVALID        (0xffffffff)
68
69
70 /* EV */
71
72         __checkReturn   efx_rc_t
73 ef10_ev_init(
74         __in            efx_nic_t *enp);
75
76                         void
77 ef10_ev_fini(
78         __in            efx_nic_t *enp);
79
80         __checkReturn   efx_rc_t
81 ef10_ev_qcreate(
82         __in            efx_nic_t *enp,
83         __in            unsigned int index,
84         __in            efsys_mem_t *esmp,
85         __in            size_t n,
86         __in            uint32_t id,
87         __in            uint32_t us,
88         __in            uint32_t flags,
89         __in            efx_evq_t *eep);
90
91                         void
92 ef10_ev_qdestroy(
93         __in            efx_evq_t *eep);
94
95         __checkReturn   efx_rc_t
96 ef10_ev_qprime(
97         __in            efx_evq_t *eep,
98         __in            unsigned int count);
99
100                         void
101 ef10_ev_qpost(
102         __in    efx_evq_t *eep,
103         __in    uint16_t data);
104
105         __checkReturn   efx_rc_t
106 ef10_ev_qmoderate(
107         __in            efx_evq_t *eep,
108         __in            unsigned int us);
109
110 #if EFSYS_OPT_QSTATS
111                         void
112 ef10_ev_qstats_update(
113         __in                            efx_evq_t *eep,
114         __inout_ecount(EV_NQSTATS)      efsys_stat_t *stat);
115 #endif /* EFSYS_OPT_QSTATS */
116
117                 void
118 ef10_ev_rxlabel_init(
119         __in            efx_evq_t *eep,
120         __in            efx_rxq_t *erp,
121         __in            unsigned int label,
122         __in            efx_rxq_type_t type);
123
124                 void
125 ef10_ev_rxlabel_fini(
126         __in            efx_evq_t *eep,
127         __in            unsigned int label);
128
129 /* INTR */
130
131         __checkReturn   efx_rc_t
132 ef10_intr_init(
133         __in            efx_nic_t *enp,
134         __in            efx_intr_type_t type,
135         __in            efsys_mem_t *esmp);
136
137                         void
138 ef10_intr_enable(
139         __in            efx_nic_t *enp);
140
141                         void
142 ef10_intr_disable(
143         __in            efx_nic_t *enp);
144
145                         void
146 ef10_intr_disable_unlocked(
147         __in            efx_nic_t *enp);
148
149         __checkReturn   efx_rc_t
150 ef10_intr_trigger(
151         __in            efx_nic_t *enp,
152         __in            unsigned int level);
153
154                         void
155 ef10_intr_status_line(
156         __in            efx_nic_t *enp,
157         __out           boolean_t *fatalp,
158         __out           uint32_t *qmaskp);
159
160                         void
161 ef10_intr_status_message(
162         __in            efx_nic_t *enp,
163         __in            unsigned int message,
164         __out           boolean_t *fatalp);
165
166                         void
167 ef10_intr_fatal(
168         __in            efx_nic_t *enp);
169                         void
170 ef10_intr_fini(
171         __in            efx_nic_t *enp);
172
173 /* NIC */
174
175 extern  __checkReturn   efx_rc_t
176 ef10_nic_probe(
177         __in            efx_nic_t *enp);
178
179 extern  __checkReturn   efx_rc_t
180 ef10_nic_set_drv_limits(
181         __inout         efx_nic_t *enp,
182         __in            efx_drv_limits_t *edlp);
183
184 extern  __checkReturn   efx_rc_t
185 ef10_nic_get_vi_pool(
186         __in            efx_nic_t *enp,
187         __out           uint32_t *vi_countp);
188
189 extern  __checkReturn   efx_rc_t
190 ef10_nic_get_bar_region(
191         __in            efx_nic_t *enp,
192         __in            efx_nic_region_t region,
193         __out           uint32_t *offsetp,
194         __out           size_t *sizep);
195
196 extern  __checkReturn   efx_rc_t
197 ef10_nic_reset(
198         __in            efx_nic_t *enp);
199
200 extern  __checkReturn   efx_rc_t
201 ef10_nic_init(
202         __in            efx_nic_t *enp);
203
204 #if EFSYS_OPT_DIAG
205
206 extern  __checkReturn   efx_rc_t
207 ef10_nic_register_test(
208         __in            efx_nic_t *enp);
209
210 #endif  /* EFSYS_OPT_DIAG */
211
212 extern                  void
213 ef10_nic_fini(
214         __in            efx_nic_t *enp);
215
216 extern                  void
217 ef10_nic_unprobe(
218         __in            efx_nic_t *enp);
219
220
221 /* MAC */
222
223 extern  __checkReturn   efx_rc_t
224 ef10_mac_poll(
225         __in            efx_nic_t *enp,
226         __out           efx_link_mode_t *link_modep);
227
228 extern  __checkReturn   efx_rc_t
229 ef10_mac_up(
230         __in            efx_nic_t *enp,
231         __out           boolean_t *mac_upp);
232
233 extern  __checkReturn   efx_rc_t
234 ef10_mac_addr_set(
235         __in    efx_nic_t *enp);
236
237 extern  __checkReturn   efx_rc_t
238 ef10_mac_pdu_set(
239         __in    efx_nic_t *enp);
240
241 extern  __checkReturn   efx_rc_t
242 ef10_mac_pdu_get(
243         __in    efx_nic_t *enp,
244         __out   size_t *pdu);
245
246 extern  __checkReturn   efx_rc_t
247 ef10_mac_reconfigure(
248         __in    efx_nic_t *enp);
249
250 extern  __checkReturn   efx_rc_t
251 ef10_mac_multicast_list_set(
252         __in                            efx_nic_t *enp);
253
254 extern  __checkReturn   efx_rc_t
255 ef10_mac_filter_default_rxq_set(
256         __in            efx_nic_t *enp,
257         __in            efx_rxq_t *erp,
258         __in            boolean_t using_rss);
259
260 extern                  void
261 ef10_mac_filter_default_rxq_clear(
262         __in            efx_nic_t *enp);
263
264 #if EFSYS_OPT_LOOPBACK
265
266 extern  __checkReturn   efx_rc_t
267 ef10_mac_loopback_set(
268         __in            efx_nic_t *enp,
269         __in            efx_link_mode_t link_mode,
270         __in            efx_loopback_type_t loopback_type);
271
272 #endif  /* EFSYS_OPT_LOOPBACK */
273
274 #if EFSYS_OPT_MAC_STATS
275
276 extern  __checkReturn                   efx_rc_t
277 ef10_mac_stats_get_mask(
278         __in                            efx_nic_t *enp,
279         __inout_bcount(mask_size)       uint32_t *maskp,
280         __in                            size_t mask_size);
281
282 extern  __checkReturn                   efx_rc_t
283 ef10_mac_stats_update(
284         __in                            efx_nic_t *enp,
285         __in                            efsys_mem_t *esmp,
286         __inout_ecount(EFX_MAC_NSTATS)  efsys_stat_t *stat,
287         __inout_opt                     uint32_t *generationp);
288
289 #endif  /* EFSYS_OPT_MAC_STATS */
290
291
292 /* MCDI */
293
294 #if EFSYS_OPT_MCDI
295
296 extern  __checkReturn   efx_rc_t
297 ef10_mcdi_init(
298         __in            efx_nic_t *enp,
299         __in            const efx_mcdi_transport_t *mtp);
300
301 extern                  void
302 ef10_mcdi_fini(
303         __in            efx_nic_t *enp);
304
305 extern                  void
306 ef10_mcdi_send_request(
307         __in                    efx_nic_t *enp,
308         __in_bcount(hdr_len)    void *hdrp,
309         __in                    size_t hdr_len,
310         __in_bcount(sdu_len)    void *sdup,
311         __in                    size_t sdu_len);
312
313 extern  __checkReturn   boolean_t
314 ef10_mcdi_poll_response(
315         __in            efx_nic_t *enp);
316
317 extern                  void
318 ef10_mcdi_read_response(
319         __in                    efx_nic_t *enp,
320         __out_bcount(length)    void *bufferp,
321         __in                    size_t offset,
322         __in                    size_t length);
323
324 extern                  efx_rc_t
325 ef10_mcdi_poll_reboot(
326         __in            efx_nic_t *enp);
327
328 extern  __checkReturn   efx_rc_t
329 ef10_mcdi_feature_supported(
330         __in            efx_nic_t *enp,
331         __in            efx_mcdi_feature_id_t id,
332         __out           boolean_t *supportedp);
333
334 extern                  void
335 ef10_mcdi_get_timeout(
336         __in            efx_nic_t *enp,
337         __in            efx_mcdi_req_t *emrp,
338         __out           uint32_t *timeoutp);
339
340 #endif /* EFSYS_OPT_MCDI */
341
342 /* NVRAM */
343
344 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
345
346 extern  __checkReturn           efx_rc_t
347 ef10_nvram_buf_read_tlv(
348         __in                            efx_nic_t *enp,
349         __in_bcount(max_seg_size)       caddr_t seg_data,
350         __in                            size_t max_seg_size,
351         __in                            uint32_t tag,
352         __deref_out_bcount_opt(*sizep)  caddr_t *datap,
353         __out                           size_t *sizep);
354
355 extern  __checkReturn           efx_rc_t
356 ef10_nvram_buf_write_tlv(
357         __inout_bcount(partn_size)      caddr_t partn_data,
358         __in                            size_t partn_size,
359         __in                            uint32_t tag,
360         __in_bcount(tag_size)           caddr_t tag_data,
361         __in                            size_t tag_size,
362         __out                           size_t *total_lengthp);
363
364 extern  __checkReturn           efx_rc_t
365 ef10_nvram_partn_read_tlv(
366         __in                            efx_nic_t *enp,
367         __in                            uint32_t partn,
368         __in                            uint32_t tag,
369         __deref_out_bcount_opt(*sizep)  caddr_t *datap,
370         __out                           size_t *sizep);
371
372 extern  __checkReturn           efx_rc_t
373 ef10_nvram_partn_write_tlv(
374         __in                    efx_nic_t *enp,
375         __in                    uint32_t partn,
376         __in                    uint32_t tag,
377         __in_bcount(size)       caddr_t data,
378         __in                    size_t size);
379
380 extern  __checkReturn           efx_rc_t
381 ef10_nvram_partn_write_segment_tlv(
382         __in                    efx_nic_t *enp,
383         __in                    uint32_t partn,
384         __in                    uint32_t tag,
385         __in_bcount(size)       caddr_t data,
386         __in                    size_t size,
387         __in                    boolean_t all_segments);
388
389 extern  __checkReturn           efx_rc_t
390 ef10_nvram_partn_lock(
391         __in                    efx_nic_t *enp,
392         __in                    uint32_t partn);
393
394 extern  __checkReturn           efx_rc_t
395 ef10_nvram_partn_unlock(
396         __in                    efx_nic_t *enp,
397         __in                    uint32_t partn,
398         __out_opt               uint32_t *resultp);
399
400 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
401
402 #if EFSYS_OPT_NVRAM
403
404 #if EFSYS_OPT_DIAG
405
406 extern  __checkReturn           efx_rc_t
407 ef10_nvram_test(
408         __in                    efx_nic_t *enp);
409
410 #endif  /* EFSYS_OPT_DIAG */
411
412 extern  __checkReturn           efx_rc_t
413 ef10_nvram_type_to_partn(
414         __in                    efx_nic_t *enp,
415         __in                    efx_nvram_type_t type,
416         __out                   uint32_t *partnp);
417
418 extern  __checkReturn           efx_rc_t
419 ef10_nvram_partn_size(
420         __in                    efx_nic_t *enp,
421         __in                    uint32_t partn,
422         __out                   size_t *sizep);
423
424 extern  __checkReturn           efx_rc_t
425 ef10_nvram_partn_rw_start(
426         __in                    efx_nic_t *enp,
427         __in                    uint32_t partn,
428         __out                   size_t *chunk_sizep);
429
430 extern  __checkReturn           efx_rc_t
431 ef10_nvram_partn_read_mode(
432         __in                    efx_nic_t *enp,
433         __in                    uint32_t partn,
434         __in                    unsigned int offset,
435         __out_bcount(size)      caddr_t data,
436         __in                    size_t size,
437         __in                    uint32_t mode);
438
439 extern  __checkReturn           efx_rc_t
440 ef10_nvram_partn_read(
441         __in                    efx_nic_t *enp,
442         __in                    uint32_t partn,
443         __in                    unsigned int offset,
444         __out_bcount(size)      caddr_t data,
445         __in                    size_t size);
446
447 extern  __checkReturn           efx_rc_t
448 ef10_nvram_partn_read_backup(
449         __in                    efx_nic_t *enp,
450         __in                    uint32_t partn,
451         __in                    unsigned int offset,
452         __out_bcount(size)      caddr_t data,
453         __in                    size_t size);
454
455 extern  __checkReturn           efx_rc_t
456 ef10_nvram_partn_erase(
457         __in                    efx_nic_t *enp,
458         __in                    uint32_t partn,
459         __in                    unsigned int offset,
460         __in                    size_t size);
461
462 extern  __checkReturn           efx_rc_t
463 ef10_nvram_partn_write(
464         __in                    efx_nic_t *enp,
465         __in                    uint32_t partn,
466         __in                    unsigned int offset,
467         __out_bcount(size)      caddr_t data,
468         __in                    size_t size);
469
470 extern  __checkReturn           efx_rc_t
471 ef10_nvram_partn_rw_finish(
472         __in                    efx_nic_t *enp,
473         __in                    uint32_t partn,
474         __out_opt               uint32_t *verify_resultp);
475
476 extern  __checkReturn           efx_rc_t
477 ef10_nvram_partn_get_version(
478         __in                    efx_nic_t *enp,
479         __in                    uint32_t partn,
480         __out                   uint32_t *subtypep,
481         __out_ecount(4)         uint16_t version[4]);
482
483 extern  __checkReturn           efx_rc_t
484 ef10_nvram_partn_set_version(
485         __in                    efx_nic_t *enp,
486         __in                    uint32_t partn,
487         __in_ecount(4)          uint16_t version[4]);
488
489 extern  __checkReturn           efx_rc_t
490 ef10_nvram_buffer_validate(
491         __in                    efx_nic_t *enp,
492         __in                    uint32_t partn,
493         __in_bcount(buffer_size)
494                                 caddr_t bufferp,
495         __in                    size_t buffer_size);
496
497 extern  __checkReturn           efx_rc_t
498 ef10_nvram_buffer_create(
499         __in                    efx_nic_t *enp,
500         __in                    uint16_t partn_type,
501         __in_bcount(buffer_size)
502                                 caddr_t bufferp,
503         __in                    size_t buffer_size);
504
505 extern  __checkReturn           efx_rc_t
506 ef10_nvram_buffer_find_item_start(
507         __in_bcount(buffer_size)
508                                 caddr_t bufferp,
509         __in                    size_t buffer_size,
510         __out                   uint32_t *startp
511         );
512
513 extern  __checkReturn           efx_rc_t
514 ef10_nvram_buffer_find_end(
515         __in_bcount(buffer_size)
516                                 caddr_t bufferp,
517         __in                    size_t buffer_size,
518         __in                    uint32_t offset,
519         __out                   uint32_t *endp
520         );
521
522 extern  __checkReturn   __success(return != B_FALSE)    boolean_t
523 ef10_nvram_buffer_find_item(
524         __in_bcount(buffer_size)
525                                 caddr_t bufferp,
526         __in                    size_t buffer_size,
527         __in                    uint32_t offset,
528         __out                   uint32_t *startp,
529         __out                   uint32_t *lengthp
530         );
531
532 extern  __checkReturn           efx_rc_t
533 ef10_nvram_buffer_get_item(
534         __in_bcount(buffer_size)
535                                 caddr_t bufferp,
536         __in                    size_t buffer_size,
537         __in                    uint32_t offset,
538         __in                    uint32_t length,
539         __out_bcount_part(item_max_size, *lengthp)
540                                 caddr_t itemp,
541         __in                    size_t item_max_size,
542         __out                   uint32_t *lengthp
543         );
544
545 extern  __checkReturn           efx_rc_t
546 ef10_nvram_buffer_insert_item(
547         __in_bcount(buffer_size)
548                                 caddr_t bufferp,
549         __in                    size_t buffer_size,
550         __in                    uint32_t offset,
551         __in_bcount(length)     caddr_t keyp,
552         __in                    uint32_t length,
553         __out                   uint32_t *lengthp
554         );
555
556 extern  __checkReturn           efx_rc_t
557 ef10_nvram_buffer_delete_item(
558         __in_bcount(buffer_size)
559                                 caddr_t bufferp,
560         __in                    size_t buffer_size,
561         __in                    uint32_t offset,
562         __in                    uint32_t length,
563         __in                    uint32_t end
564         );
565
566 extern  __checkReturn           efx_rc_t
567 ef10_nvram_buffer_finish(
568         __in_bcount(buffer_size)
569                                 caddr_t bufferp,
570         __in                    size_t buffer_size
571         );
572
573 #endif  /* EFSYS_OPT_NVRAM */
574
575
576 /* PHY */
577
578 typedef struct ef10_link_state_s {
579         uint32_t                els_adv_cap_mask;
580         uint32_t                els_lp_cap_mask;
581         unsigned int            els_fcntl;
582         efx_link_mode_t         els_link_mode;
583 #if EFSYS_OPT_LOOPBACK
584         efx_loopback_type_t     els_loopback;
585 #endif
586         boolean_t               els_mac_up;
587 } ef10_link_state_t;
588
589 extern                  void
590 ef10_phy_link_ev(
591         __in            efx_nic_t *enp,
592         __in            efx_qword_t *eqp,
593         __out           efx_link_mode_t *link_modep);
594
595 extern  __checkReturn   efx_rc_t
596 ef10_phy_get_link(
597         __in            efx_nic_t *enp,
598         __out           ef10_link_state_t *elsp);
599
600 extern  __checkReturn   efx_rc_t
601 ef10_phy_power(
602         __in            efx_nic_t *enp,
603         __in            boolean_t on);
604
605 extern  __checkReturn   efx_rc_t
606 ef10_phy_reconfigure(
607         __in            efx_nic_t *enp);
608
609 extern  __checkReturn   efx_rc_t
610 ef10_phy_verify(
611         __in            efx_nic_t *enp);
612
613 extern  __checkReturn   efx_rc_t
614 ef10_phy_oui_get(
615         __in            efx_nic_t *enp,
616         __out           uint32_t *ouip);
617
618 #if EFSYS_OPT_PHY_STATS
619
620 extern  __checkReturn                   efx_rc_t
621 ef10_phy_stats_update(
622         __in                            efx_nic_t *enp,
623         __in                            efsys_mem_t *esmp,
624         __inout_ecount(EFX_PHY_NSTATS)  uint32_t *stat);
625
626 #endif  /* EFSYS_OPT_PHY_STATS */
627
628 #if EFSYS_OPT_BIST
629
630 extern  __checkReturn           efx_rc_t
631 ef10_bist_enable_offline(
632         __in                    efx_nic_t *enp);
633
634 extern  __checkReturn           efx_rc_t
635 ef10_bist_start(
636         __in                    efx_nic_t *enp,
637         __in                    efx_bist_type_t type);
638
639 extern  __checkReturn           efx_rc_t
640 ef10_bist_poll(
641         __in                    efx_nic_t *enp,
642         __in                    efx_bist_type_t type,
643         __out                   efx_bist_result_t *resultp,
644         __out_opt __drv_when(count > 0, __notnull)
645         uint32_t        *value_maskp,
646         __out_ecount_opt(count) __drv_when(count > 0, __notnull)
647         unsigned long   *valuesp,
648         __in                    size_t count);
649
650 extern                          void
651 ef10_bist_stop(
652         __in                    efx_nic_t *enp,
653         __in                    efx_bist_type_t type);
654
655 #endif  /* EFSYS_OPT_BIST */
656
657 /* TX */
658
659 extern  __checkReturn   efx_rc_t
660 ef10_tx_init(
661         __in            efx_nic_t *enp);
662
663 extern                  void
664 ef10_tx_fini(
665         __in            efx_nic_t *enp);
666
667 extern  __checkReturn   efx_rc_t
668 ef10_tx_qcreate(
669         __in            efx_nic_t *enp,
670         __in            unsigned int index,
671         __in            unsigned int label,
672         __in            efsys_mem_t *esmp,
673         __in            size_t n,
674         __in            uint32_t id,
675         __in            uint16_t flags,
676         __in            efx_evq_t *eep,
677         __in            efx_txq_t *etp,
678         __out           unsigned int *addedp);
679
680 extern          void
681 ef10_tx_qdestroy(
682         __in            efx_txq_t *etp);
683
684 extern  __checkReturn   efx_rc_t
685 ef10_tx_qpost(
686         __in            efx_txq_t *etp,
687         __in_ecount(n)  efx_buffer_t *eb,
688         __in            unsigned int n,
689         __in            unsigned int completed,
690         __inout         unsigned int *addedp);
691
692 extern                  void
693 ef10_tx_qpush(
694         __in            efx_txq_t *etp,
695         __in            unsigned int added,
696         __in            unsigned int pushed);
697
698 #if EFSYS_OPT_RX_PACKED_STREAM
699 extern                  void
700 ef10_rx_qpush_ps_credits(
701         __in            efx_rxq_t *erp);
702
703 extern  __checkReturn   uint8_t *
704 ef10_rx_qps_packet_info(
705         __in            efx_rxq_t *erp,
706         __in            uint8_t *buffer,
707         __in            uint32_t buffer_length,
708         __in            uint32_t current_offset,
709         __out           uint16_t *lengthp,
710         __out           uint32_t *next_offsetp,
711         __out           uint32_t *timestamp);
712 #endif
713
714 extern  __checkReturn   efx_rc_t
715 ef10_tx_qpace(
716         __in            efx_txq_t *etp,
717         __in            unsigned int ns);
718
719 extern  __checkReturn   efx_rc_t
720 ef10_tx_qflush(
721         __in            efx_txq_t *etp);
722
723 extern                  void
724 ef10_tx_qenable(
725         __in            efx_txq_t *etp);
726
727 extern  __checkReturn   efx_rc_t
728 ef10_tx_qpio_enable(
729         __in            efx_txq_t *etp);
730
731 extern                  void
732 ef10_tx_qpio_disable(
733         __in            efx_txq_t *etp);
734
735 extern  __checkReturn   efx_rc_t
736 ef10_tx_qpio_write(
737         __in                    efx_txq_t *etp,
738         __in_ecount(buf_length) uint8_t *buffer,
739         __in                    size_t buf_length,
740         __in                    size_t pio_buf_offset);
741
742 extern  __checkReturn   efx_rc_t
743 ef10_tx_qpio_post(
744         __in                    efx_txq_t *etp,
745         __in                    size_t pkt_length,
746         __in                    unsigned int completed,
747         __inout                 unsigned int *addedp);
748
749 extern  __checkReturn   efx_rc_t
750 ef10_tx_qdesc_post(
751         __in            efx_txq_t *etp,
752         __in_ecount(n)  efx_desc_t *ed,
753         __in            unsigned int n,
754         __in            unsigned int completed,
755         __inout         unsigned int *addedp);
756
757 extern  void
758 ef10_tx_qdesc_dma_create(
759         __in    efx_txq_t *etp,
760         __in    efsys_dma_addr_t addr,
761         __in    size_t size,
762         __in    boolean_t eop,
763         __out   efx_desc_t *edp);
764
765 extern  void
766 ef10_tx_qdesc_tso_create(
767         __in    efx_txq_t *etp,
768         __in    uint16_t ipv4_id,
769         __in    uint32_t tcp_seq,
770         __in    uint8_t  tcp_flags,
771         __out   efx_desc_t *edp);
772
773 extern  void
774 ef10_tx_qdesc_tso2_create(
775         __in                    efx_txq_t *etp,
776         __in                    uint16_t ipv4_id,
777         __in                    uint32_t tcp_seq,
778         __in                    uint16_t tcp_mss,
779         __out_ecount(count)     efx_desc_t *edp,
780         __in                    int count);
781
782 extern  void
783 ef10_tx_qdesc_vlantci_create(
784         __in    efx_txq_t *etp,
785         __in    uint16_t vlan_tci,
786         __out   efx_desc_t *edp);
787
788
789 #if EFSYS_OPT_QSTATS
790
791 extern                  void
792 ef10_tx_qstats_update(
793         __in                            efx_txq_t *etp,
794         __inout_ecount(TX_NQSTATS)      efsys_stat_t *stat);
795
796 #endif /* EFSYS_OPT_QSTATS */
797
798 typedef uint32_t        efx_piobuf_handle_t;
799
800 #define EFX_PIOBUF_HANDLE_INVALID       ((efx_piobuf_handle_t) -1)
801
802 extern  __checkReturn   efx_rc_t
803 ef10_nic_pio_alloc(
804         __inout         efx_nic_t *enp,
805         __out           uint32_t *bufnump,
806         __out           efx_piobuf_handle_t *handlep,
807         __out           uint32_t *blknump,
808         __out           uint32_t *offsetp,
809         __out           size_t *sizep);
810
811 extern  __checkReturn   efx_rc_t
812 ef10_nic_pio_free(
813         __inout         efx_nic_t *enp,
814         __in            uint32_t bufnum,
815         __in            uint32_t blknum);
816
817 extern  __checkReturn   efx_rc_t
818 ef10_nic_pio_link(
819         __inout         efx_nic_t *enp,
820         __in            uint32_t vi_index,
821         __in            efx_piobuf_handle_t handle);
822
823 extern  __checkReturn   efx_rc_t
824 ef10_nic_pio_unlink(
825         __inout         efx_nic_t *enp,
826         __in            uint32_t vi_index);
827
828
829 /* VPD */
830
831 #if EFSYS_OPT_VPD
832
833 extern  __checkReturn           efx_rc_t
834 ef10_vpd_init(
835         __in                    efx_nic_t *enp);
836
837 extern  __checkReturn           efx_rc_t
838 ef10_vpd_size(
839         __in                    efx_nic_t *enp,
840         __out                   size_t *sizep);
841
842 extern  __checkReturn           efx_rc_t
843 ef10_vpd_read(
844         __in                    efx_nic_t *enp,
845         __out_bcount(size)      caddr_t data,
846         __in                    size_t size);
847
848 extern  __checkReturn           efx_rc_t
849 ef10_vpd_verify(
850         __in                    efx_nic_t *enp,
851         __in_bcount(size)       caddr_t data,
852         __in                    size_t size);
853
854 extern  __checkReturn           efx_rc_t
855 ef10_vpd_reinit(
856         __in                    efx_nic_t *enp,
857         __in_bcount(size)       caddr_t data,
858         __in                    size_t size);
859
860 extern  __checkReturn           efx_rc_t
861 ef10_vpd_get(
862         __in                    efx_nic_t *enp,
863         __in_bcount(size)       caddr_t data,
864         __in                    size_t size,
865         __inout                 efx_vpd_value_t *evvp);
866
867 extern  __checkReturn           efx_rc_t
868 ef10_vpd_set(
869         __in                    efx_nic_t *enp,
870         __in_bcount(size)       caddr_t data,
871         __in                    size_t size,
872         __in                    efx_vpd_value_t *evvp);
873
874 extern  __checkReturn           efx_rc_t
875 ef10_vpd_next(
876         __in                    efx_nic_t *enp,
877         __in_bcount(size)       caddr_t data,
878         __in                    size_t size,
879         __out                   efx_vpd_value_t *evvp,
880         __inout                 unsigned int *contp);
881
882 extern __checkReturn            efx_rc_t
883 ef10_vpd_write(
884         __in                    efx_nic_t *enp,
885         __in_bcount(size)       caddr_t data,
886         __in                    size_t size);
887
888 extern                          void
889 ef10_vpd_fini(
890         __in                    efx_nic_t *enp);
891
892 #endif  /* EFSYS_OPT_VPD */
893
894
895 /* RX */
896
897 extern  __checkReturn   efx_rc_t
898 ef10_rx_init(
899         __in            efx_nic_t *enp);
900
901 #if EFSYS_OPT_RX_SCATTER
902 extern  __checkReturn   efx_rc_t
903 ef10_rx_scatter_enable(
904         __in            efx_nic_t *enp,
905         __in            unsigned int buf_size);
906 #endif  /* EFSYS_OPT_RX_SCATTER */
907
908
909 #if EFSYS_OPT_RX_SCALE
910
911 extern  __checkReturn   efx_rc_t
912 ef10_rx_scale_context_alloc(
913         __in            efx_nic_t *enp,
914         __in            efx_rx_scale_context_type_t type,
915         __in            uint32_t num_queues,
916         __out           uint32_t *rss_contextp);
917
918 extern  __checkReturn   efx_rc_t
919 ef10_rx_scale_context_free(
920         __in            efx_nic_t *enp,
921         __in            uint32_t rss_context);
922
923 extern  __checkReturn   efx_rc_t
924 ef10_rx_scale_mode_set(
925         __in            efx_nic_t *enp,
926         __in            uint32_t rss_context,
927         __in            efx_rx_hash_alg_t alg,
928         __in            efx_rx_hash_type_t type,
929         __in            boolean_t insert);
930
931 extern  __checkReturn   efx_rc_t
932 ef10_rx_scale_key_set(
933         __in            efx_nic_t *enp,
934         __in            uint32_t rss_context,
935         __in_ecount(n)  uint8_t *key,
936         __in            size_t n);
937
938 extern  __checkReturn   efx_rc_t
939 ef10_rx_scale_tbl_set(
940         __in            efx_nic_t *enp,
941         __in            uint32_t rss_context,
942         __in_ecount(n)  unsigned int *table,
943         __in            size_t n);
944
945 extern  __checkReturn   uint32_t
946 ef10_rx_prefix_hash(
947         __in            efx_nic_t *enp,
948         __in            efx_rx_hash_alg_t func,
949         __in            uint8_t *buffer);
950
951 #endif /* EFSYS_OPT_RX_SCALE */
952
953 extern  __checkReturn   efx_rc_t
954 ef10_rx_prefix_pktlen(
955         __in            efx_nic_t *enp,
956         __in            uint8_t *buffer,
957         __out           uint16_t *lengthp);
958
959 extern                  void
960 ef10_rx_qpost(
961         __in            efx_rxq_t *erp,
962         __in_ecount(n)  efsys_dma_addr_t *addrp,
963         __in            size_t size,
964         __in            unsigned int n,
965         __in            unsigned int completed,
966         __in            unsigned int added);
967
968 extern                  void
969 ef10_rx_qpush(
970         __in            efx_rxq_t *erp,
971         __in            unsigned int added,
972         __inout         unsigned int *pushedp);
973
974 extern  __checkReturn   efx_rc_t
975 ef10_rx_qflush(
976         __in            efx_rxq_t *erp);
977
978 extern          void
979 ef10_rx_qenable(
980         __in            efx_rxq_t *erp);
981
982 extern  __checkReturn   efx_rc_t
983 ef10_rx_qcreate(
984         __in            efx_nic_t *enp,
985         __in            unsigned int index,
986         __in            unsigned int label,
987         __in            efx_rxq_type_t type,
988         __in            efsys_mem_t *esmp,
989         __in            size_t n,
990         __in            uint32_t id,
991         __in            efx_evq_t *eep,
992         __in            efx_rxq_t *erp);
993
994 extern                  void
995 ef10_rx_qdestroy(
996         __in            efx_rxq_t *erp);
997
998 extern                  void
999 ef10_rx_fini(
1000         __in            efx_nic_t *enp);
1001
1002 #if EFSYS_OPT_FILTER
1003
1004 typedef struct ef10_filter_handle_s {
1005         uint32_t        efh_lo;
1006         uint32_t        efh_hi;
1007 } ef10_filter_handle_t;
1008
1009 typedef struct ef10_filter_entry_s {
1010         uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
1011         ef10_filter_handle_t efe_handle;
1012 } ef10_filter_entry_t;
1013
1014 /*
1015  * BUSY flag indicates that an update is in progress.
1016  * AUTO_OLD flag is used to mark and sweep MAC packet filters.
1017  */
1018 #define EFX_EF10_FILTER_FLAG_BUSY       1U
1019 #define EFX_EF10_FILTER_FLAG_AUTO_OLD   2U
1020 #define EFX_EF10_FILTER_FLAGS           3U
1021
1022 /*
1023  * Size of the hash table used by the driver. Doesn't need to be the
1024  * same size as the hardware's table.
1025  */
1026 #define EFX_EF10_FILTER_TBL_ROWS 8192
1027
1028 /* Only need to allow for one directed and one unknown unicast filter */
1029 #define EFX_EF10_FILTER_UNICAST_FILTERS_MAX     2
1030
1031 /* Allow for the broadcast address to be added to the multicast list */
1032 #define EFX_EF10_FILTER_MULTICAST_FILTERS_MAX   (EFX_MAC_MULTICAST_LIST_MAX + 1)
1033
1034 /*
1035  * For encapsulated packets, there is one filter each for each combination of
1036  * IPv4 or IPv6 outer frame, VXLAN, GENEVE or NVGRE packet type, and unicast or
1037  * multicast inner frames.
1038  */
1039 #define EFX_EF10_FILTER_ENCAP_FILTERS_MAX       12
1040
1041 typedef struct ef10_filter_table_s {
1042         ef10_filter_entry_t     eft_entry[EFX_EF10_FILTER_TBL_ROWS];
1043         efx_rxq_t               *eft_default_rxq;
1044         boolean_t               eft_using_rss;
1045         uint32_t                eft_unicst_filter_indexes[
1046             EFX_EF10_FILTER_UNICAST_FILTERS_MAX];
1047         uint32_t                eft_unicst_filter_count;
1048         uint32_t                eft_mulcst_filter_indexes[
1049             EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
1050         uint32_t                eft_mulcst_filter_count;
1051         boolean_t               eft_using_all_mulcst;
1052         uint32_t                eft_encap_filter_indexes[
1053             EFX_EF10_FILTER_ENCAP_FILTERS_MAX];
1054         uint32_t                eft_encap_filter_count;
1055 } ef10_filter_table_t;
1056
1057         __checkReturn   efx_rc_t
1058 ef10_filter_init(
1059         __in            efx_nic_t *enp);
1060
1061                         void
1062 ef10_filter_fini(
1063         __in            efx_nic_t *enp);
1064
1065         __checkReturn   efx_rc_t
1066 ef10_filter_restore(
1067         __in            efx_nic_t *enp);
1068
1069         __checkReturn   efx_rc_t
1070 ef10_filter_add(
1071         __in            efx_nic_t *enp,
1072         __inout         efx_filter_spec_t *spec,
1073         __in            boolean_t may_replace);
1074
1075         __checkReturn   efx_rc_t
1076 ef10_filter_delete(
1077         __in            efx_nic_t *enp,
1078         __inout         efx_filter_spec_t *spec);
1079
1080 extern  __checkReturn   efx_rc_t
1081 ef10_filter_supported_filters(
1082         __in                            efx_nic_t *enp,
1083         __out_ecount(buffer_length)     uint32_t *buffer,
1084         __in                            size_t buffer_length,
1085         __out                           size_t *list_lengthp);
1086
1087 extern  __checkReturn   efx_rc_t
1088 ef10_filter_reconfigure(
1089         __in                            efx_nic_t *enp,
1090         __in_ecount(6)                  uint8_t const *mac_addr,
1091         __in                            boolean_t all_unicst,
1092         __in                            boolean_t mulcst,
1093         __in                            boolean_t all_mulcst,
1094         __in                            boolean_t brdcst,
1095         __in_ecount(6*count)            uint8_t const *addrs,
1096         __in                            uint32_t count);
1097
1098 extern          void
1099 ef10_filter_get_default_rxq(
1100         __in            efx_nic_t *enp,
1101         __out           efx_rxq_t **erpp,
1102         __out           boolean_t *using_rss);
1103
1104 extern          void
1105 ef10_filter_default_rxq_set(
1106         __in            efx_nic_t *enp,
1107         __in            efx_rxq_t *erp,
1108         __in            boolean_t using_rss);
1109
1110 extern          void
1111 ef10_filter_default_rxq_clear(
1112         __in            efx_nic_t *enp);
1113
1114
1115 #endif /* EFSYS_OPT_FILTER */
1116
1117 extern  __checkReturn                   efx_rc_t
1118 efx_mcdi_get_function_info(
1119         __in                            efx_nic_t *enp,
1120         __out                           uint32_t *pfp,
1121         __out_opt                       uint32_t *vfp);
1122
1123 extern  __checkReturn           efx_rc_t
1124 efx_mcdi_privilege_mask(
1125         __in                    efx_nic_t *enp,
1126         __in                    uint32_t pf,
1127         __in                    uint32_t vf,
1128         __out                   uint32_t *maskp);
1129
1130 extern  __checkReturn   efx_rc_t
1131 efx_mcdi_get_port_assignment(
1132         __in            efx_nic_t *enp,
1133         __out           uint32_t *portp);
1134
1135 extern  __checkReturn   efx_rc_t
1136 efx_mcdi_get_port_modes(
1137         __in            efx_nic_t *enp,
1138         __out           uint32_t *modesp,
1139         __out_opt       uint32_t *current_modep);
1140
1141 extern  __checkReturn   efx_rc_t
1142 ef10_nic_get_port_mode_bandwidth(
1143         __in            uint32_t port_mode,
1144         __out           uint32_t *bandwidth_mbpsp);
1145
1146 extern  __checkReturn   efx_rc_t
1147 efx_mcdi_get_mac_address_pf(
1148         __in                    efx_nic_t *enp,
1149         __out_ecount_opt(6)     uint8_t mac_addrp[6]);
1150
1151 extern  __checkReturn   efx_rc_t
1152 efx_mcdi_get_mac_address_vf(
1153         __in                    efx_nic_t *enp,
1154         __out_ecount_opt(6)     uint8_t mac_addrp[6]);
1155
1156 extern  __checkReturn   efx_rc_t
1157 efx_mcdi_get_clock(
1158         __in            efx_nic_t *enp,
1159         __out           uint32_t *sys_freqp,
1160         __out           uint32_t *dpcpu_freqp);
1161
1162
1163 extern  __checkReturn   efx_rc_t
1164 efx_mcdi_get_vector_cfg(
1165         __in            efx_nic_t *enp,
1166         __out_opt       uint32_t *vec_basep,
1167         __out_opt       uint32_t *pf_nvecp,
1168         __out_opt       uint32_t *vf_nvecp);
1169
1170 extern  __checkReturn   efx_rc_t
1171 ef10_get_datapath_caps(
1172         __in            efx_nic_t *enp);
1173
1174 extern  __checkReturn           efx_rc_t
1175 ef10_get_privilege_mask(
1176         __in                    efx_nic_t *enp,
1177         __out                   uint32_t *maskp);
1178
1179 extern  __checkReturn   efx_rc_t
1180 ef10_external_port_mapping(
1181         __in            efx_nic_t *enp,
1182         __in            uint32_t port,
1183         __out           uint8_t *external_portp);
1184
1185 #if EFSYS_OPT_RX_PACKED_STREAM
1186
1187 /* Data space per credit in packed stream mode */
1188 #define EFX_RX_PACKED_STREAM_MEM_PER_CREDIT (1 << 16)
1189
1190 /*
1191  * Received packets are always aligned at this boundary. Also there always
1192  * exists a gap of this size between packets.
1193  * (see SF-112241-TC, 4.5)
1194  */
1195 #define EFX_RX_PACKED_STREAM_ALIGNMENT 64
1196
1197 /*
1198  * Size of a pseudo-header prepended to received packets
1199  * in packed stream mode
1200  */
1201 #define EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE 8
1202
1203 /* Minimum space for packet in packed stream mode */
1204 #define EFX_RX_PACKED_STREAM_MIN_PACKET_SPACE                \
1205         P2ROUNDUP(EFX_RX_PACKED_STREAM_RX_PREFIX_SIZE +      \
1206                   EFX_MAC_PDU_MIN +                          \
1207                   EFX_RX_PACKED_STREAM_ALIGNMENT,            \
1208                   EFX_RX_PACKED_STREAM_ALIGNMENT)
1209
1210 /* Maximum number of credits */
1211 #define EFX_RX_PACKED_STREAM_MAX_CREDITS 127
1212
1213 #endif /* EFSYS_OPT_RX_PACKED_STREAM */
1214
1215 #ifdef  __cplusplus
1216 }
1217 #endif
1218
1219 #endif  /* _SYS_EF10_IMPL_H */