2 * Copyright (c) 2012-2015 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.
33 #ifndef _SYS_HUNT_IMPL_H
34 #define _SYS_HUNT_IMPL_H
38 #include "efx_regs_ef10.h"
45 #define HUNTINGTON_NVRAM_CHUNK 0x80
47 /* Alignment requirement for value written to RX WPTR:
48 * the WPTR must be aligned to an 8 descriptor boundary
50 #define HUNTINGTON_RX_WPTR_ALIGN 8
52 /* Invalid RSS context handle */
53 #define HUNTINGTON_RSS_CONTEXT_INVALID (0xffffffff)
58 __checkReturn efx_rc_t
66 __checkReturn efx_rc_t
69 __in unsigned int index,
70 __in efsys_mem_t *esmp,
79 __checkReturn efx_rc_t
82 __in unsigned int count);
89 __checkReturn efx_rc_t
92 __in unsigned int us);
96 hunt_ev_qstats_update(
98 __inout_ecount(EV_NQSTATS) efsys_stat_t *stat);
99 #endif /* EFSYS_OPT_QSTATS */
102 hunt_ev_rxlabel_init(
105 __in unsigned int label);
108 hunt_ev_rxlabel_fini(
110 __in unsigned int label);
114 __checkReturn efx_rc_t
117 __in efx_intr_type_t type,
118 __in efsys_mem_t *esmp);
122 __in efx_nic_t *enp);
126 __in efx_nic_t *enp);
129 hunt_intr_disable_unlocked(
130 __in efx_nic_t *enp);
132 __checkReturn efx_rc_t
135 __in unsigned int level);
139 __in efx_nic_t *enp);
143 extern __checkReturn efx_rc_t
145 __in efx_nic_t *enp);
147 extern __checkReturn efx_rc_t
148 hunt_nic_set_drv_limits(
149 __inout efx_nic_t *enp,
150 __in efx_drv_limits_t *edlp);
152 extern __checkReturn efx_rc_t
153 hunt_nic_get_vi_pool(
155 __out uint32_t *vi_countp);
157 extern __checkReturn efx_rc_t
158 hunt_nic_get_bar_region(
160 __in efx_nic_region_t region,
161 __out uint32_t *offsetp,
162 __out size_t *sizep);
164 extern __checkReturn efx_rc_t
166 __in efx_nic_t *enp);
168 extern __checkReturn efx_rc_t
170 __in efx_nic_t *enp);
174 extern __checkReturn efx_rc_t
175 hunt_nic_register_test(
176 __in efx_nic_t *enp);
178 #endif /* EFSYS_OPT_DIAG */
182 __in efx_nic_t *enp);
186 __in efx_nic_t *enp);
191 extern __checkReturn efx_rc_t
194 __out efx_link_mode_t *link_modep);
196 extern __checkReturn efx_rc_t
199 __out boolean_t *mac_upp);
201 extern __checkReturn efx_rc_t
203 __in efx_nic_t *enp);
205 extern __checkReturn efx_rc_t
206 hunt_mac_reconfigure(
207 __in efx_nic_t *enp);
209 extern __checkReturn efx_rc_t
210 hunt_mac_multicast_list_set(
211 __in efx_nic_t *enp);
213 extern __checkReturn efx_rc_t
214 hunt_mac_filter_default_rxq_set(
217 __in boolean_t using_rss);
220 hunt_mac_filter_default_rxq_clear(
221 __in efx_nic_t *enp);
223 #if EFSYS_OPT_LOOPBACK
225 extern __checkReturn efx_rc_t
226 hunt_mac_loopback_set(
228 __in efx_link_mode_t link_mode,
229 __in efx_loopback_type_t loopback_type);
231 #endif /* EFSYS_OPT_LOOPBACK */
233 #if EFSYS_OPT_MAC_STATS
235 extern __checkReturn efx_rc_t
236 hunt_mac_stats_update(
238 __in efsys_mem_t *esmp,
239 __inout_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat,
240 __inout_opt uint32_t *generationp);
242 #endif /* EFSYS_OPT_MAC_STATS */
249 extern __checkReturn efx_rc_t
252 __in const efx_mcdi_transport_t *mtp);
256 __in efx_nic_t *enp);
259 hunt_mcdi_request_copyin(
261 __in efx_mcdi_req_t *emrp,
262 __in unsigned int seq,
263 __in boolean_t ev_cpl,
264 __in boolean_t new_epoch);
266 extern __checkReturn boolean_t
267 hunt_mcdi_poll_response(
268 __in efx_nic_t *enp);
271 hunt_mcdi_read_response(
278 hunt_mcdi_request_copyout(
280 __in efx_mcdi_req_t *emrp);
283 hunt_mcdi_poll_reboot(
284 __in efx_nic_t *enp);
286 extern __checkReturn efx_rc_t
287 hunt_mcdi_feature_supported(
289 __in efx_mcdi_feature_id_t id,
290 __out boolean_t *supportedp);
292 #endif /* EFSYS_OPT_MCDI */
296 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
298 extern __checkReturn efx_rc_t
299 hunt_nvram_buf_read_tlv(
301 __in_bcount(max_seg_size) caddr_t seg_data,
302 __in size_t max_seg_size,
304 __deref_out_bcount_opt(*sizep) caddr_t *datap,
305 __out size_t *sizep);
307 extern __checkReturn efx_rc_t
308 hunt_nvram_buf_write_tlv(
309 __inout_bcount(partn_size) caddr_t partn_data,
310 __in size_t partn_size,
312 __in_bcount(tag_size) caddr_t tag_data,
313 __in size_t tag_size,
314 __out size_t *total_lengthp);
316 extern __checkReturn efx_rc_t
317 hunt_nvram_partn_read_tlv(
321 __deref_out_bcount_opt(*sizep) caddr_t *datap,
322 __out size_t *sizep);
324 extern __checkReturn efx_rc_t
325 hunt_nvram_partn_write_tlv(
329 __in_bcount(size) caddr_t data,
332 extern __checkReturn efx_rc_t
333 hunt_nvram_partn_write_segment_tlv(
337 __in_bcount(size) caddr_t data,
339 __in boolean_t all_segments);
341 extern __checkReturn efx_rc_t
342 hunt_nvram_partn_size(
344 __in unsigned int partn,
345 __out size_t *sizep);
347 extern __checkReturn efx_rc_t
348 hunt_nvram_partn_lock(
350 __in unsigned int partn);
352 extern __checkReturn efx_rc_t
353 hunt_nvram_partn_read(
355 __in unsigned int partn,
356 __in unsigned int offset,
357 __out_bcount(size) caddr_t data,
360 extern __checkReturn efx_rc_t
361 hunt_nvram_partn_erase(
363 __in unsigned int partn,
364 __in unsigned int offset,
367 extern __checkReturn efx_rc_t
368 hunt_nvram_partn_write(
370 __in unsigned int partn,
371 __in unsigned int offset,
372 __out_bcount(size) caddr_t data,
376 hunt_nvram_partn_unlock(
378 __in unsigned int partn);
380 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
386 extern __checkReturn efx_rc_t
388 __in efx_nic_t *enp);
390 #endif /* EFSYS_OPT_DIAG */
392 extern __checkReturn efx_rc_t
395 __in efx_nvram_type_t type,
396 __out size_t *sizep);
398 extern __checkReturn efx_rc_t
399 hunt_nvram_get_version(
401 __in efx_nvram_type_t type,
402 __out uint32_t *subtypep,
403 __out_ecount(4) uint16_t version[4]);
405 extern __checkReturn efx_rc_t
408 __in efx_nvram_type_t type,
409 __out size_t *pref_chunkp);
411 extern __checkReturn efx_rc_t
412 hunt_nvram_read_chunk(
414 __in efx_nvram_type_t type,
415 __in unsigned int offset,
416 __out_bcount(size) caddr_t data,
419 extern __checkReturn efx_rc_t
422 __in efx_nvram_type_t type);
424 extern __checkReturn efx_rc_t
425 hunt_nvram_write_chunk(
427 __in efx_nvram_type_t type,
428 __in unsigned int offset,
429 __in_bcount(size) caddr_t data,
433 hunt_nvram_rw_finish(
435 __in efx_nvram_type_t type);
437 extern __checkReturn efx_rc_t
438 hunt_nvram_partn_set_version(
440 __in unsigned int partn,
441 __in_ecount(4) uint16_t version[4]);
443 extern __checkReturn efx_rc_t
444 hunt_nvram_set_version(
446 __in efx_nvram_type_t type,
447 __in_ecount(4) uint16_t version[4]);
449 #endif /* EFSYS_OPT_NVRAM */
454 typedef struct hunt_link_state_s {
455 uint32_t hls_adv_cap_mask;
456 uint32_t hls_lp_cap_mask;
457 unsigned int hls_fcntl;
458 efx_link_mode_t hls_link_mode;
459 #if EFSYS_OPT_LOOPBACK
460 efx_loopback_type_t hls_loopback;
462 boolean_t hls_mac_up;
468 __in efx_qword_t *eqp,
469 __out efx_link_mode_t *link_modep);
471 extern __checkReturn efx_rc_t
474 __out hunt_link_state_t *hlsp);
476 extern __checkReturn efx_rc_t
481 extern __checkReturn efx_rc_t
482 hunt_phy_reconfigure(
483 __in efx_nic_t *enp);
485 extern __checkReturn efx_rc_t
487 __in efx_nic_t *enp);
489 extern __checkReturn efx_rc_t
492 __out uint32_t *ouip);
494 #if EFSYS_OPT_PHY_STATS
496 extern __checkReturn efx_rc_t
497 hunt_phy_stats_update(
499 __in efsys_mem_t *esmp,
500 __inout_ecount(EFX_PHY_NSTATS) uint32_t *stat);
502 #endif /* EFSYS_OPT_PHY_STATS */
504 #if EFSYS_OPT_PHY_PROPS
511 __in unsigned int id);
513 #endif /* EFSYS_OPT_NAMES */
515 extern __checkReturn efx_rc_t
518 __in unsigned int id,
520 __out uint32_t *valp);
522 extern __checkReturn efx_rc_t
525 __in unsigned int id,
528 #endif /* EFSYS_OPT_PHY_PROPS */
532 extern __checkReturn efx_rc_t
533 hunt_bist_enable_offline(
534 __in efx_nic_t *enp);
536 extern __checkReturn efx_rc_t
539 __in efx_bist_type_t type);
541 extern __checkReturn efx_rc_t
544 __in efx_bist_type_t type,
545 __out efx_bist_result_t *resultp,
546 __out_opt __drv_when(count > 0, __notnull)
547 uint32_t *value_maskp,
548 __out_ecount_opt(count) __drv_when(count > 0, __notnull)
549 unsigned long *valuesp,
555 __in efx_bist_type_t type);
557 #endif /* EFSYS_OPT_BIST */
564 extern __checkReturn efx_rc_t
567 __in efx_sram_pattern_fn_t func);
569 #endif /* EFSYS_OPT_DIAG */
574 extern __checkReturn efx_rc_t
576 __in efx_nic_t *enp);
580 __in efx_nic_t *enp);
582 extern __checkReturn efx_rc_t
585 __in unsigned int index,
586 __in unsigned int label,
587 __in efsys_mem_t *esmp,
593 __out unsigned int *addedp);
597 __in efx_txq_t *etp);
599 extern __checkReturn efx_rc_t
602 __in_ecount(n) efx_buffer_t *eb,
604 __in unsigned int completed,
605 __inout unsigned int *addedp);
610 __in unsigned int added,
611 __in unsigned int pushed);
613 extern __checkReturn efx_rc_t
616 __in unsigned int ns);
618 extern __checkReturn efx_rc_t
620 __in efx_txq_t *etp);
624 __in efx_txq_t *etp);
626 extern __checkReturn efx_rc_t
628 __in efx_txq_t *etp);
631 hunt_tx_qpio_disable(
632 __in efx_txq_t *etp);
634 extern __checkReturn efx_rc_t
637 __in_ecount(buf_length) uint8_t *buffer,
638 __in size_t buf_length,
639 __in size_t pio_buf_offset);
641 extern __checkReturn efx_rc_t
644 __in size_t pkt_length,
645 __in unsigned int completed,
646 __inout unsigned int *addedp);
648 extern __checkReturn efx_rc_t
651 __in_ecount(n) efx_desc_t *ed,
653 __in unsigned int completed,
654 __inout unsigned int *addedp);
657 hunt_tx_qdesc_dma_create(
659 __in efsys_dma_addr_t addr,
662 __out efx_desc_t *edp);
665 hunt_tx_qdesc_tso_create(
667 __in uint16_t ipv4_id,
668 __in uint32_t tcp_seq,
669 __in uint8_t tcp_flags,
670 __out efx_desc_t *edp);
673 hunt_tx_qdesc_vlantci_create(
675 __in uint16_t vlan_tci,
676 __out efx_desc_t *edp);
682 hunt_tx_qstats_update(
684 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat);
686 #endif /* EFSYS_OPT_QSTATS */
690 /* Missing register definitions */
691 #ifndef ER_DZ_TX_PIOBUF_OFST
692 #define ER_DZ_TX_PIOBUF_OFST 0x00001000
694 #ifndef ER_DZ_TX_PIOBUF_STEP
695 #define ER_DZ_TX_PIOBUF_STEP 8192
697 #ifndef ER_DZ_TX_PIOBUF_ROWS
698 #define ER_DZ_TX_PIOBUF_ROWS 2048
701 #ifndef ER_DZ_TX_PIOBUF_SIZE
702 #define ER_DZ_TX_PIOBUF_SIZE 2048
705 #define HUNT_PIOBUF_NBUFS (16)
706 #define HUNT_PIOBUF_SIZE (ER_DZ_TX_PIOBUF_SIZE)
708 #define HUNT_MIN_PIO_ALLOC_SIZE (HUNT_PIOBUF_SIZE / 32)
710 #define HUNT_LEGACY_PF_PRIVILEGE_MASK \
711 (MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN | \
712 MC_CMD_PRIVILEGE_MASK_IN_GRP_LINK | \
713 MC_CMD_PRIVILEGE_MASK_IN_GRP_ONLOAD | \
714 MC_CMD_PRIVILEGE_MASK_IN_GRP_PTP | \
715 MC_CMD_PRIVILEGE_MASK_IN_GRP_INSECURE_FILTERS | \
716 MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING | \
717 MC_CMD_PRIVILEGE_MASK_IN_GRP_UNICAST | \
718 MC_CMD_PRIVILEGE_MASK_IN_GRP_MULTICAST | \
719 MC_CMD_PRIVILEGE_MASK_IN_GRP_BROADCAST | \
720 MC_CMD_PRIVILEGE_MASK_IN_GRP_ALL_MULTICAST | \
721 MC_CMD_PRIVILEGE_MASK_IN_GRP_PROMISCUOUS)
723 #define HUNT_LEGACY_VF_PRIVILEGE_MASK 0
725 typedef uint32_t efx_piobuf_handle_t;
727 #define EFX_PIOBUF_HANDLE_INVALID ((efx_piobuf_handle_t) -1)
729 extern __checkReturn efx_rc_t
731 __inout efx_nic_t *enp,
732 __out uint32_t *bufnump,
733 __out efx_piobuf_handle_t *handlep,
734 __out uint32_t *blknump,
735 __out uint32_t *offsetp,
736 __out size_t *sizep);
738 extern __checkReturn efx_rc_t
740 __inout efx_nic_t *enp,
741 __in uint32_t bufnum,
742 __in uint32_t blknum);
744 extern __checkReturn efx_rc_t
746 __inout efx_nic_t *enp,
747 __in uint32_t vi_index,
748 __in efx_piobuf_handle_t handle);
750 extern __checkReturn efx_rc_t
752 __inout efx_nic_t *enp,
753 __in uint32_t vi_index);
760 extern __checkReturn efx_rc_t
762 __in efx_nic_t *enp);
764 extern __checkReturn efx_rc_t
767 __out size_t *sizep);
769 extern __checkReturn efx_rc_t
772 __out_bcount(size) caddr_t data,
775 extern __checkReturn efx_rc_t
778 __in_bcount(size) caddr_t data,
781 extern __checkReturn efx_rc_t
784 __in_bcount(size) caddr_t data,
787 extern __checkReturn efx_rc_t
790 __in_bcount(size) caddr_t data,
792 __inout efx_vpd_value_t *evvp);
794 extern __checkReturn efx_rc_t
797 __in_bcount(size) caddr_t data,
799 __in efx_vpd_value_t *evvp);
801 extern __checkReturn efx_rc_t
804 __in_bcount(size) caddr_t data,
806 __out efx_vpd_value_t *evvp,
807 __inout unsigned int *contp);
809 extern __checkReturn efx_rc_t
812 __in_bcount(size) caddr_t data,
817 __in efx_nic_t *enp);
819 #endif /* EFSYS_OPT_VPD */
824 extern __checkReturn efx_rc_t
826 __in efx_nic_t *enp);
828 #if EFSYS_OPT_RX_HDR_SPLIT
829 extern __checkReturn efx_rc_t
830 hunt_rx_hdr_split_enable(
832 __in unsigned int hdr_buf_size,
833 __in unsigned int pld_buf_size);
834 #endif /* EFSYS_OPT_RX_HDR_SPLIT */
836 #if EFSYS_OPT_RX_SCATTER
837 extern __checkReturn efx_rc_t
838 hunt_rx_scatter_enable(
840 __in unsigned int buf_size);
841 #endif /* EFSYS_OPT_RX_SCATTER */
844 #if EFSYS_OPT_RX_SCALE
846 extern __checkReturn efx_rc_t
847 hunt_rx_scale_mode_set(
849 __in efx_rx_hash_alg_t alg,
850 __in efx_rx_hash_type_t type,
851 __in boolean_t insert);
853 extern __checkReturn efx_rc_t
854 hunt_rx_scale_key_set(
856 __in_ecount(n) uint8_t *key,
859 extern __checkReturn efx_rc_t
860 hunt_rx_scale_tbl_set(
862 __in_ecount(n) unsigned int *table,
865 #endif /* EFSYS_OPT_RX_SCALE */
870 __in_ecount(n) efsys_dma_addr_t *addrp,
873 __in unsigned int completed,
874 __in unsigned int added);
879 __in unsigned int added,
880 __inout unsigned int *pushedp);
882 extern __checkReturn efx_rc_t
884 __in efx_rxq_t *erp);
888 __in efx_rxq_t *erp);
890 extern __checkReturn efx_rc_t
893 __in unsigned int index,
894 __in unsigned int label,
895 __in efx_rxq_type_t type,
896 __in efsys_mem_t *esmp,
900 __in efx_rxq_t *erp);
904 __in efx_rxq_t *erp);
908 __in efx_nic_t *enp);
912 typedef struct hunt_filter_handle_s {
915 } hunt_filter_handle_t;
917 typedef struct hunt_filter_entry_s {
918 uintptr_t hfe_spec; /* pointer to filter spec plus busy bit */
919 hunt_filter_handle_t hfe_handle;
920 } hunt_filter_entry_t;
923 * BUSY flag indicates that an update is in progress.
924 * AUTO_OLD flag is used to mark and sweep MAC packet filters.
926 #define EFX_HUNT_FILTER_FLAG_BUSY 1U
927 #define EFX_HUNT_FILTER_FLAG_AUTO_OLD 2U
928 #define EFX_HUNT_FILTER_FLAGS 3U
930 #define EFX_HUNT_FILTER_TBL_ROWS 8192
932 /* Allow for the broadcast address to be added to the multicast list */
933 #define EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX (EFX_MAC_MULTICAST_LIST_MAX + 1)
935 typedef struct hunt_filter_table_s {
936 hunt_filter_entry_t hft_entry[EFX_HUNT_FILTER_TBL_ROWS];
937 efx_rxq_t * hft_default_rxq;
938 boolean_t hft_using_rss;
939 uint32_t hft_unicst_filter_index;
940 boolean_t hft_unicst_filter_set;
941 uint32_t hft_mulcst_filter_indexes[
942 EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX];
943 uint32_t hft_mulcst_filter_count;
944 } hunt_filter_table_t;
946 __checkReturn efx_rc_t
948 __in efx_nic_t *enp);
952 __in efx_nic_t *enp);
954 __checkReturn efx_rc_t
956 __in efx_nic_t *enp);
958 __checkReturn efx_rc_t
961 __inout efx_filter_spec_t *spec,
962 __in boolean_t may_replace);
964 __checkReturn efx_rc_t
967 __inout efx_filter_spec_t *spec);
969 extern __checkReturn efx_rc_t
970 hunt_filter_supported_filters(
972 __out uint32_t *list,
973 __out size_t *length);
975 extern __checkReturn efx_rc_t
976 hunt_filter_reconfigure(
978 __in_ecount(6) uint8_t const *mac_addr,
979 __in boolean_t all_unicst,
980 __in boolean_t mulcst,
981 __in boolean_t all_mulcst,
982 __in boolean_t brdcst,
983 __in_ecount(6*count) uint8_t const *addrs,
987 hunt_filter_get_default_rxq(
989 __out efx_rxq_t **erpp,
990 __out boolean_t *using_rss);
993 hunt_filter_default_rxq_set(
996 __in boolean_t using_rss);
999 hunt_filter_default_rxq_clear(
1000 __in efx_nic_t *enp);
1003 #endif /* EFSYS_OPT_FILTER */
1005 extern __checkReturn efx_rc_t
1007 __in efx_nic_t *enp,
1008 __in boolean_t unicst,
1009 __in boolean_t brdcst);
1011 #if EFSYS_OPT_MCAST_FILTER_LIST
1013 extern __checkReturn efx_rc_t
1014 hunt_pktfilter_mcast_set(
1015 __in efx_nic_t *enp,
1016 __in uint8_t const *addrs,
1019 #endif /* EFSYS_OPT_MCAST_FILTER_LIST */
1021 extern __checkReturn efx_rc_t
1022 hunt_pktfilter_mcast_all(
1023 __in efx_nic_t *enp);
1025 extern __checkReturn efx_rc_t
1026 efx_mcdi_get_function_info(
1027 __in efx_nic_t *enp,
1028 __out uint32_t *pfp,
1029 __out_opt uint32_t *vfp);
1031 extern __checkReturn efx_rc_t
1032 efx_mcdi_privilege_mask(
1033 __in efx_nic_t *enp,
1036 __out uint32_t *maskp);
1042 #endif /* _SYS_HUNT_IMPL_H */