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