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