2 * Copyright (c) 2015-2016 Solarflare Communications Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
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.
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.
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.
31 #ifndef _SYS_EF10_IMPL_H
32 #define _SYS_EF10_IMPL_H
38 #if EFSYS_OPT_HUNTINGTON
39 #define EF10_MAX_PIOBUF_NBUFS HUNT_PIOBUF_NBUFS
43 * FIXME: This is just a power of 2 which fits in an MCDI v1 message, and could
44 * possibly be increased, or the write size reported by newer firmware used
47 #define EF10_NVRAM_CHUNK 0x80
49 /* Alignment requirement for value written to RX WPTR:
50 * the WPTR must be aligned to an 8 descriptor boundary
52 #define EF10_RX_WPTR_ALIGN 8
55 * Max byte offset into the packet the TCP header must start for the hardware
56 * to be able to parse the packet correctly.
58 #define EF10_TCP_HEADER_OFFSET_LIMIT 208
60 /* Invalid RSS context handle */
61 #define EF10_RSS_CONTEXT_INVALID (0xffffffff)
66 __checkReturn efx_rc_t
74 __checkReturn efx_rc_t
77 __in unsigned int index,
78 __in efsys_mem_t *esmp,
89 __checkReturn efx_rc_t
92 __in unsigned int count);
99 __checkReturn efx_rc_t
102 __in unsigned int us);
105 ef10_ev_rxlabel_init(
108 __in unsigned int label,
109 __in boolean_t packed_stream);
112 ef10_ev_rxlabel_fini(
114 __in unsigned int label);
118 __checkReturn efx_rc_t
121 __in efx_intr_type_t type,
122 __in efsys_mem_t *esmp);
126 __in efx_nic_t *enp);
130 __in efx_nic_t *enp);
133 ef10_intr_disable_unlocked(
134 __in efx_nic_t *enp);
136 __checkReturn efx_rc_t
139 __in unsigned int level);
142 ef10_intr_status_line(
144 __out boolean_t *fatalp,
145 __out uint32_t *qmaskp);
148 ef10_intr_status_message(
150 __in unsigned int message,
151 __out boolean_t *fatalp);
155 __in efx_nic_t *enp);
158 __in efx_nic_t *enp);
162 extern __checkReturn efx_rc_t
164 __in efx_nic_t *enp);
166 extern __checkReturn efx_rc_t
167 ef10_nic_set_drv_limits(
168 __inout efx_nic_t *enp,
169 __in efx_drv_limits_t *edlp);
171 extern __checkReturn efx_rc_t
172 ef10_nic_get_vi_pool(
174 __out uint32_t *vi_countp);
176 extern __checkReturn efx_rc_t
177 ef10_nic_get_bar_region(
179 __in efx_nic_region_t region,
180 __out uint32_t *offsetp,
181 __out size_t *sizep);
183 extern __checkReturn efx_rc_t
185 __in efx_nic_t *enp);
187 extern __checkReturn efx_rc_t
189 __in efx_nic_t *enp);
193 __in efx_nic_t *enp);
197 __in efx_nic_t *enp);
202 extern __checkReturn efx_rc_t
205 __out efx_link_mode_t *link_modep);
207 extern __checkReturn efx_rc_t
210 __out boolean_t *mac_upp);
212 extern __checkReturn efx_rc_t
214 __in efx_nic_t *enp);
216 extern __checkReturn efx_rc_t
218 __in efx_nic_t *enp);
220 extern __checkReturn efx_rc_t
225 extern __checkReturn efx_rc_t
226 ef10_mac_reconfigure(
227 __in efx_nic_t *enp);
229 extern __checkReturn efx_rc_t
230 ef10_mac_multicast_list_set(
231 __in efx_nic_t *enp);
233 extern __checkReturn efx_rc_t
234 ef10_mac_filter_default_rxq_set(
237 __in boolean_t using_rss);
240 ef10_mac_filter_default_rxq_clear(
241 __in efx_nic_t *enp);
248 extern __checkReturn efx_rc_t
251 __in const efx_mcdi_transport_t *mtp);
255 __in efx_nic_t *enp);
258 ef10_mcdi_send_request(
260 __in_bcount(hdr_len) void *hdrp,
262 __in_bcount(sdu_len) void *sdup,
263 __in size_t sdu_len);
265 extern __checkReturn boolean_t
266 ef10_mcdi_poll_response(
267 __in efx_nic_t *enp);
270 ef10_mcdi_read_response(
272 __out_bcount(length) void *bufferp,
277 ef10_mcdi_poll_reboot(
278 __in efx_nic_t *enp);
280 extern __checkReturn efx_rc_t
281 ef10_mcdi_feature_supported(
283 __in efx_mcdi_feature_id_t id,
284 __out boolean_t *supportedp);
287 ef10_mcdi_get_timeout(
289 __in efx_mcdi_req_t *emrp,
290 __out uint32_t *timeoutp);
292 #endif /* EFSYS_OPT_MCDI */
299 typedef struct ef10_link_state_s {
300 uint32_t els_adv_cap_mask;
301 uint32_t els_lp_cap_mask;
302 unsigned int els_fcntl;
303 efx_link_mode_t els_link_mode;
304 boolean_t els_mac_up;
310 __in efx_qword_t *eqp,
311 __out efx_link_mode_t *link_modep);
313 extern __checkReturn efx_rc_t
316 __out ef10_link_state_t *elsp);
318 extern __checkReturn efx_rc_t
323 extern __checkReturn efx_rc_t
324 ef10_phy_reconfigure(
325 __in efx_nic_t *enp);
327 extern __checkReturn efx_rc_t
329 __in efx_nic_t *enp);
331 extern __checkReturn efx_rc_t
334 __out uint32_t *ouip);
338 extern __checkReturn efx_rc_t
340 __in efx_nic_t *enp);
344 __in efx_nic_t *enp);
346 extern __checkReturn efx_rc_t
349 __in unsigned int index,
350 __in unsigned int label,
351 __in efsys_mem_t *esmp,
357 __out unsigned int *addedp);
361 __in efx_txq_t *etp);
363 extern __checkReturn efx_rc_t
366 __in_ecount(n) efx_buffer_t *eb,
368 __in unsigned int completed,
369 __inout unsigned int *addedp);
374 __in unsigned int added,
375 __in unsigned int pushed);
377 extern __checkReturn efx_rc_t
380 __in unsigned int ns);
382 extern __checkReturn efx_rc_t
384 __in efx_txq_t *etp);
388 __in efx_txq_t *etp);
390 extern __checkReturn efx_rc_t
392 __in efx_txq_t *etp);
395 ef10_tx_qpio_disable(
396 __in efx_txq_t *etp);
398 extern __checkReturn efx_rc_t
401 __in_ecount(buf_length) uint8_t *buffer,
402 __in size_t buf_length,
403 __in size_t pio_buf_offset);
405 extern __checkReturn efx_rc_t
408 __in size_t pkt_length,
409 __in unsigned int completed,
410 __inout unsigned int *addedp);
412 extern __checkReturn efx_rc_t
415 __in_ecount(n) efx_desc_t *ed,
417 __in unsigned int completed,
418 __inout unsigned int *addedp);
421 ef10_tx_qdesc_dma_create(
423 __in efsys_dma_addr_t addr,
426 __out efx_desc_t *edp);
429 ef10_tx_qdesc_tso_create(
431 __in uint16_t ipv4_id,
432 __in uint32_t tcp_seq,
433 __in uint8_t tcp_flags,
434 __out efx_desc_t *edp);
437 ef10_tx_qdesc_tso2_create(
439 __in uint16_t ipv4_id,
440 __in uint32_t tcp_seq,
441 __in uint16_t tcp_mss,
442 __out_ecount(count) efx_desc_t *edp,
446 ef10_tx_qdesc_vlantci_create(
448 __in uint16_t vlan_tci,
449 __out efx_desc_t *edp);
452 typedef uint32_t efx_piobuf_handle_t;
454 #define EFX_PIOBUF_HANDLE_INVALID ((efx_piobuf_handle_t) -1)
456 extern __checkReturn efx_rc_t
458 __inout efx_nic_t *enp,
459 __out uint32_t *bufnump,
460 __out efx_piobuf_handle_t *handlep,
461 __out uint32_t *blknump,
462 __out uint32_t *offsetp,
463 __out size_t *sizep);
465 extern __checkReturn efx_rc_t
467 __inout efx_nic_t *enp,
468 __in uint32_t bufnum,
469 __in uint32_t blknum);
471 extern __checkReturn efx_rc_t
473 __inout efx_nic_t *enp,
474 __in uint32_t vi_index,
475 __in efx_piobuf_handle_t handle);
477 extern __checkReturn efx_rc_t
479 __inout efx_nic_t *enp,
480 __in uint32_t vi_index);
488 extern __checkReturn efx_rc_t
490 __in efx_nic_t *enp);
493 extern __checkReturn efx_rc_t
494 ef10_rx_prefix_pktlen(
496 __in uint8_t *buffer,
497 __out uint16_t *lengthp);
502 __in_ecount(n) efsys_dma_addr_t *addrp,
505 __in unsigned int completed,
506 __in unsigned int added);
511 __in unsigned int added,
512 __inout unsigned int *pushedp);
514 extern __checkReturn efx_rc_t
516 __in efx_rxq_t *erp);
520 __in efx_rxq_t *erp);
522 extern __checkReturn efx_rc_t
525 __in unsigned int index,
526 __in unsigned int label,
527 __in efx_rxq_type_t type,
528 __in efsys_mem_t *esmp,
532 __in efx_rxq_t *erp);
536 __in efx_rxq_t *erp);
540 __in efx_nic_t *enp);
544 typedef struct ef10_filter_handle_s {
547 } ef10_filter_handle_t;
549 typedef struct ef10_filter_entry_s {
550 uintptr_t efe_spec; /* pointer to filter spec plus busy bit */
551 ef10_filter_handle_t efe_handle;
552 } ef10_filter_entry_t;
555 * BUSY flag indicates that an update is in progress.
556 * AUTO_OLD flag is used to mark and sweep MAC packet filters.
558 #define EFX_EF10_FILTER_FLAG_BUSY 1U
559 #define EFX_EF10_FILTER_FLAG_AUTO_OLD 2U
560 #define EFX_EF10_FILTER_FLAGS 3U
563 * Size of the hash table used by the driver. Doesn't need to be the
564 * same size as the hardware's table.
566 #define EFX_EF10_FILTER_TBL_ROWS 8192
568 /* Only need to allow for one directed and one unknown unicast filter */
569 #define EFX_EF10_FILTER_UNICAST_FILTERS_MAX 2
571 /* Allow for the broadcast address to be added to the multicast list */
572 #define EFX_EF10_FILTER_MULTICAST_FILTERS_MAX (EFX_MAC_MULTICAST_LIST_MAX + 1)
574 typedef struct ef10_filter_table_s {
575 ef10_filter_entry_t eft_entry[EFX_EF10_FILTER_TBL_ROWS];
576 efx_rxq_t *eft_default_rxq;
577 boolean_t eft_using_rss;
578 uint32_t eft_unicst_filter_indexes[
579 EFX_EF10_FILTER_UNICAST_FILTERS_MAX];
580 uint32_t eft_unicst_filter_count;
581 uint32_t eft_mulcst_filter_indexes[
582 EFX_EF10_FILTER_MULTICAST_FILTERS_MAX];
583 uint32_t eft_mulcst_filter_count;
584 boolean_t eft_using_all_mulcst;
585 } ef10_filter_table_t;
587 __checkReturn efx_rc_t
589 __in efx_nic_t *enp);
593 __in efx_nic_t *enp);
595 __checkReturn efx_rc_t
597 __in efx_nic_t *enp);
599 __checkReturn efx_rc_t
602 __inout efx_filter_spec_t *spec,
603 __in boolean_t may_replace);
605 __checkReturn efx_rc_t
608 __inout efx_filter_spec_t *spec);
610 extern __checkReturn efx_rc_t
611 ef10_filter_supported_filters(
613 __out uint32_t *list,
614 __out size_t *length);
616 extern __checkReturn efx_rc_t
617 ef10_filter_reconfigure(
619 __in_ecount(6) uint8_t const *mac_addr,
620 __in boolean_t all_unicst,
621 __in boolean_t mulcst,
622 __in boolean_t all_mulcst,
623 __in boolean_t brdcst,
624 __in_ecount(6*count) uint8_t const *addrs,
625 __in uint32_t count);
628 ef10_filter_get_default_rxq(
630 __out efx_rxq_t **erpp,
631 __out boolean_t *using_rss);
634 ef10_filter_default_rxq_set(
637 __in boolean_t using_rss);
640 ef10_filter_default_rxq_clear(
641 __in efx_nic_t *enp);
644 #endif /* EFSYS_OPT_FILTER */
646 extern __checkReturn efx_rc_t
647 efx_mcdi_get_function_info(
650 __out_opt uint32_t *vfp);
652 extern __checkReturn efx_rc_t
653 efx_mcdi_privilege_mask(
657 __out uint32_t *maskp);
659 extern __checkReturn efx_rc_t
660 efx_mcdi_get_port_assignment(
662 __out uint32_t *portp);
664 extern __checkReturn efx_rc_t
665 efx_mcdi_get_port_modes(
667 __out uint32_t *modesp,
668 __out_opt uint32_t *current_modep);
670 extern __checkReturn efx_rc_t
671 ef10_nic_get_port_mode_bandwidth(
672 __in uint32_t port_mode,
673 __out uint32_t *bandwidth_mbpsp);
675 extern __checkReturn efx_rc_t
676 efx_mcdi_get_mac_address_pf(
678 __out_ecount_opt(6) uint8_t mac_addrp[6]);
680 extern __checkReturn efx_rc_t
681 efx_mcdi_get_mac_address_vf(
683 __out_ecount_opt(6) uint8_t mac_addrp[6]);
685 extern __checkReturn efx_rc_t
688 __out uint32_t *sys_freqp,
689 __out uint32_t *dpcpu_freqp);
692 extern __checkReturn efx_rc_t
693 efx_mcdi_get_vector_cfg(
695 __out_opt uint32_t *vec_basep,
696 __out_opt uint32_t *pf_nvecp,
697 __out_opt uint32_t *vf_nvecp);
699 extern __checkReturn efx_rc_t
700 ef10_get_datapath_caps(
701 __in efx_nic_t *enp);
703 extern __checkReturn efx_rc_t
704 ef10_get_privilege_mask(
706 __out uint32_t *maskp);
708 extern __checkReturn efx_rc_t
709 ef10_external_port_mapping(
712 __out uint8_t *external_portp);
718 #endif /* _SYS_EF10_IMPL_H */