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)
69 __in unsigned int index,
70 __in efsys_mem_t *esmp,
82 __in unsigned int count);
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);
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);
135 __in unsigned int level);
139 __in efx_nic_t *enp);
143 extern __checkReturn int
145 __in efx_nic_t *enp);
147 extern __checkReturn int
148 hunt_nic_set_drv_limits(
149 __inout efx_nic_t *enp,
150 __in efx_drv_limits_t *edlp);
152 extern __checkReturn int
153 hunt_nic_get_vi_pool(
155 __out uint32_t *vi_countp);
157 extern __checkReturn int
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 int
166 __in efx_nic_t *enp);
168 extern __checkReturn int
170 __in efx_nic_t *enp);
174 extern __checkReturn int
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 int
194 __out efx_link_mode_t *link_modep);
196 extern __checkReturn int
199 __out boolean_t *mac_upp);
201 extern __checkReturn int
203 __in efx_nic_t *enp);
205 extern __checkReturn int
206 hunt_mac_reconfigure(
207 __in efx_nic_t *enp);
209 extern __checkReturn int
210 hunt_mac_multicast_list_set(
211 __in efx_nic_t *enp);
213 extern __checkReturn int
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 int
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 int
236 hunt_mac_stats_update(
238 __in efsys_mem_t *esmp,
239 __out_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat,
240 __out_opt uint32_t *generationp);
242 #endif /* EFSYS_OPT_MAC_STATS */
249 extern __checkReturn int
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_request_poll(
268 __in efx_nic_t *enp);
271 hunt_mcdi_request_copyout(
273 __in efx_mcdi_req_t *emrp);
276 hunt_mcdi_poll_reboot(
277 __in efx_nic_t *enp);
279 extern __checkReturn int
280 hunt_mcdi_fw_update_supported(
282 __out boolean_t *supportedp);
284 extern __checkReturn int
285 hunt_mcdi_macaddr_change_supported(
287 __out boolean_t *supportedp);
289 #endif /* EFSYS_OPT_MCDI */
293 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD
295 extern __checkReturn int
296 hunt_nvram_buf_read_tlv(
298 __in_bcount(partn_size) caddr_t partn_data,
299 __in size_t partn_size,
301 __deref_out_bcount_opt(*sizep) caddr_t *datap,
302 __out size_t *sizep);
304 extern __checkReturn int
305 hunt_nvram_buf_write_tlv(
306 __inout_bcount(partn_size) caddr_t partn_data,
307 __in size_t partn_size,
309 __in_bcount(tag_size) caddr_t tag_data,
310 __in size_t tag_size,
311 __out size_t *total_lengthp);
313 extern __checkReturn int
314 hunt_nvram_partn_read_tlv(
318 __deref_out_bcount_opt(*sizep) caddr_t *datap,
319 __out size_t *sizep);
321 extern __checkReturn int
322 hunt_nvram_partn_write_tlv(
326 __in_bcount(size) caddr_t data,
329 extern __checkReturn int
330 hunt_nvram_partn_size(
332 __in unsigned int partn,
333 __out size_t *sizep);
335 extern __checkReturn int
336 hunt_nvram_partn_lock(
338 __in unsigned int partn);
340 extern __checkReturn int
341 hunt_nvram_partn_read(
343 __in unsigned int partn,
344 __in unsigned int offset,
345 __out_bcount(size) caddr_t data,
348 extern __checkReturn int
349 hunt_nvram_partn_erase(
351 __in unsigned int partn,
352 __in unsigned int offset,
355 extern __checkReturn int
356 hunt_nvram_partn_write(
358 __in unsigned int partn,
359 __in unsigned int offset,
360 __out_bcount(size) caddr_t data,
364 hunt_nvram_partn_unlock(
366 __in unsigned int partn);
368 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */
374 extern __checkReturn int
376 __in efx_nic_t *enp);
378 #endif /* EFSYS_OPT_DIAG */
380 extern __checkReturn int
383 __in efx_nvram_type_t type,
384 __out size_t *sizep);
386 extern __checkReturn int
387 hunt_nvram_get_version(
389 __in efx_nvram_type_t type,
390 __out uint32_t *subtypep,
391 __out_ecount(4) uint16_t version[4]);
393 extern __checkReturn int
396 __in efx_nvram_type_t type,
397 __out size_t *pref_chunkp);
399 extern __checkReturn int
400 hunt_nvram_read_chunk(
402 __in efx_nvram_type_t type,
403 __in unsigned int offset,
404 __out_bcount(size) caddr_t data,
407 extern __checkReturn int
410 __in efx_nvram_type_t type);
412 extern __checkReturn int
413 hunt_nvram_write_chunk(
415 __in efx_nvram_type_t type,
416 __in unsigned int offset,
417 __in_bcount(size) caddr_t data,
421 hunt_nvram_rw_finish(
423 __in efx_nvram_type_t type);
425 extern __checkReturn int
426 hunt_nvram_partn_set_version(
428 __in unsigned int partn,
429 __in_ecount(4) uint16_t version[4]);
431 extern __checkReturn int
432 hunt_nvram_set_version(
434 __in efx_nvram_type_t type,
435 __in_ecount(4) uint16_t version[4]);
437 #endif /* EFSYS_OPT_NVRAM */
442 typedef struct hunt_link_state_s {
443 uint32_t hls_adv_cap_mask;
444 uint32_t hls_lp_cap_mask;
445 unsigned int hls_fcntl;
446 efx_link_mode_t hls_link_mode;
447 #if EFSYS_OPT_LOOPBACK
448 efx_loopback_type_t hls_loopback;
450 boolean_t hls_mac_up;
456 __in efx_qword_t *eqp,
457 __out efx_link_mode_t *link_modep);
459 extern __checkReturn int
462 __out hunt_link_state_t *hlsp);
464 extern __checkReturn int
469 extern __checkReturn int
470 hunt_phy_reconfigure(
471 __in efx_nic_t *enp);
473 extern __checkReturn int
475 __in efx_nic_t *enp);
477 extern __checkReturn int
480 __out uint32_t *ouip);
482 #if EFSYS_OPT_PHY_STATS
484 extern __checkReturn int
485 hunt_phy_stats_update(
487 __in efsys_mem_t *esmp,
488 __out_ecount(EFX_PHY_NSTATS) uint32_t *stat);
490 #endif /* EFSYS_OPT_PHY_STATS */
492 #if EFSYS_OPT_PHY_PROPS
499 __in unsigned int id);
501 #endif /* EFSYS_OPT_NAMES */
503 extern __checkReturn int
506 __in unsigned int id,
508 __out uint32_t *valp);
510 extern __checkReturn int
513 __in unsigned int id,
516 #endif /* EFSYS_OPT_PHY_PROPS */
520 extern __checkReturn int
521 hunt_bist_enable_offline(
522 __in efx_nic_t *enp);
524 extern __checkReturn int
527 __in efx_bist_type_t type);
529 extern __checkReturn int
532 __in efx_bist_type_t type,
533 __out efx_bist_result_t *resultp,
534 __out_opt __drv_when(count > 0, __notnull)
535 uint32_t *value_maskp,
536 __out_ecount_opt(count) __drv_when(count > 0, __notnull)
537 unsigned long *valuesp,
543 __in efx_bist_type_t type);
545 #endif /* EFSYS_OPT_BIST */
552 extern __checkReturn int
555 __in efx_sram_pattern_fn_t func);
557 #endif /* EFSYS_OPT_DIAG */
562 extern __checkReturn int
564 __in efx_nic_t *enp);
568 __in efx_nic_t *enp);
570 extern __checkReturn int
573 __in unsigned int index,
574 __in unsigned int label,
575 __in efsys_mem_t *esmp,
581 __out unsigned int *addedp);
585 __in efx_txq_t *etp);
587 extern __checkReturn int
590 __in_ecount(n) efx_buffer_t *eb,
592 __in unsigned int completed,
593 __inout unsigned int *addedp);
598 __in unsigned int added,
599 __in unsigned int pushed);
601 extern __checkReturn int
604 __in unsigned int ns);
606 extern __checkReturn int
608 __in efx_txq_t *etp);
612 __in efx_txq_t *etp);
614 extern __checkReturn int
616 __in efx_txq_t *etp);
619 hunt_tx_qpio_disable(
620 __in efx_txq_t *etp);
622 extern __checkReturn int
625 __in_ecount(buf_length) uint8_t *buffer,
626 __in size_t buf_length,
627 __in size_t pio_buf_offset);
629 extern __checkReturn int
632 __in size_t pkt_length,
633 __in unsigned int completed,
634 __inout unsigned int *addedp);
636 extern __checkReturn int
639 __in_ecount(n) efx_desc_t *ed,
641 __in unsigned int completed,
642 __inout unsigned int *addedp);
645 hunt_tx_qdesc_dma_create(
647 __in efsys_dma_addr_t addr,
650 __out efx_desc_t *edp);
653 hunt_tx_qdesc_tso_create(
655 __in uint16_t ipv4_id,
656 __in uint32_t tcp_seq,
657 __in uint8_t tcp_flags,
658 __out efx_desc_t *edp);
661 hunt_tx_qdesc_vlantci_create(
663 __in uint16_t vlan_tci,
664 __out efx_desc_t *edp);
670 hunt_tx_qstats_update(
672 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat);
674 #endif /* EFSYS_OPT_QSTATS */
678 /* Missing register definitions */
679 #ifndef ER_DZ_TX_PIOBUF_OFST
680 #define ER_DZ_TX_PIOBUF_OFST 0x00001000
682 #ifndef ER_DZ_TX_PIOBUF_STEP
683 #define ER_DZ_TX_PIOBUF_STEP 8192
685 #ifndef ER_DZ_TX_PIOBUF_ROWS
686 #define ER_DZ_TX_PIOBUF_ROWS 2048
689 #ifndef ER_DZ_TX_PIOBUF_SIZE
690 #define ER_DZ_TX_PIOBUF_SIZE 2048
693 #define HUNT_PIOBUF_NBUFS (16)
694 #define HUNT_PIOBUF_SIZE (ER_DZ_TX_PIOBUF_SIZE)
696 #define HUNT_MIN_PIO_ALLOC_SIZE (HUNT_PIOBUF_SIZE / 32)
698 #define HUNT_LEGACY_PF_PRIVILEGE_MASK \
699 (MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN | \
700 MC_CMD_PRIVILEGE_MASK_IN_GRP_LINK | \
701 MC_CMD_PRIVILEGE_MASK_IN_GRP_ONLOAD | \
702 MC_CMD_PRIVILEGE_MASK_IN_GRP_PTP | \
703 MC_CMD_PRIVILEGE_MASK_IN_GRP_INSECURE_FILTERS | \
704 MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING | \
705 MC_CMD_PRIVILEGE_MASK_IN_GRP_UNICAST | \
706 MC_CMD_PRIVILEGE_MASK_IN_GRP_MULTICAST | \
707 MC_CMD_PRIVILEGE_MASK_IN_GRP_BROADCAST | \
708 MC_CMD_PRIVILEGE_MASK_IN_GRP_ALL_MULTICAST | \
709 MC_CMD_PRIVILEGE_MASK_IN_GRP_PROMISCUOUS)
711 #define HUNT_LEGACY_VF_PRIVILEGE_MASK 0
713 typedef uint32_t efx_piobuf_handle_t;
715 #define EFX_PIOBUF_HANDLE_INVALID ((efx_piobuf_handle_t) -1)
717 extern __checkReturn int
719 __inout efx_nic_t *enp,
720 __out uint32_t *bufnump,
721 __out efx_piobuf_handle_t *handlep,
722 __out uint32_t *blknump,
723 __out uint32_t *offsetp,
724 __out size_t *sizep);
726 extern __checkReturn int
728 __inout efx_nic_t *enp,
729 __in uint32_t bufnum,
730 __in uint32_t blknum);
732 extern __checkReturn int
734 __inout efx_nic_t *enp,
735 __in uint32_t vi_index,
736 __in efx_piobuf_handle_t handle);
738 extern __checkReturn int
740 __inout efx_nic_t *enp,
741 __in uint32_t vi_index);
748 extern __checkReturn int
750 __in efx_nic_t *enp);
752 extern __checkReturn int
755 __out size_t *sizep);
757 extern __checkReturn int
760 __out_bcount(size) caddr_t data,
763 extern __checkReturn int
766 __in_bcount(size) caddr_t data,
769 extern __checkReturn int
772 __in_bcount(size) caddr_t data,
775 extern __checkReturn int
778 __in_bcount(size) caddr_t data,
780 __inout efx_vpd_value_t *evvp);
782 extern __checkReturn int
785 __in_bcount(size) caddr_t data,
787 __in efx_vpd_value_t *evvp);
789 extern __checkReturn int
792 __in_bcount(size) caddr_t data,
794 __out efx_vpd_value_t *evvp,
795 __inout unsigned int *contp);
797 extern __checkReturn int
800 __in_bcount(size) caddr_t data,
805 __in efx_nic_t *enp);
807 #endif /* EFSYS_OPT_VPD */
812 extern __checkReturn int
814 __in efx_nic_t *enp);
816 #if EFSYS_OPT_RX_HDR_SPLIT
817 extern __checkReturn int
818 hunt_rx_hdr_split_enable(
820 __in unsigned int hdr_buf_size,
821 __in unsigned int pld_buf_size);
822 #endif /* EFSYS_OPT_RX_HDR_SPLIT */
824 #if EFSYS_OPT_RX_SCATTER
825 extern __checkReturn int
826 hunt_rx_scatter_enable(
828 __in unsigned int buf_size);
829 #endif /* EFSYS_OPT_RX_SCATTER */
832 #if EFSYS_OPT_RX_SCALE
834 extern __checkReturn int
835 hunt_rx_scale_mode_set(
837 __in efx_rx_hash_alg_t alg,
838 __in efx_rx_hash_type_t type,
839 __in boolean_t insert);
841 extern __checkReturn int
842 hunt_rx_scale_key_set(
844 __in_ecount(n) uint8_t *key,
847 extern __checkReturn int
848 hunt_rx_scale_tbl_set(
850 __in_ecount(n) unsigned int *table,
853 #endif /* EFSYS_OPT_RX_SCALE */
858 __in_ecount(n) efsys_dma_addr_t *addrp,
861 __in unsigned int completed,
862 __in unsigned int added);
867 __in unsigned int added,
868 __inout unsigned int *pushedp);
870 extern __checkReturn int
872 __in efx_rxq_t *erp);
876 __in efx_rxq_t *erp);
878 extern __checkReturn int
881 __in unsigned int index,
882 __in unsigned int label,
883 __in efx_rxq_type_t type,
884 __in efsys_mem_t *esmp,
888 __in efx_rxq_t *erp);
892 __in efx_rxq_t *erp);
896 __in efx_nic_t *enp);
900 typedef struct hunt_filter_handle_s {
903 } hunt_filter_handle_t;
905 typedef struct hunt_filter_entry_s {
906 uintptr_t hfe_spec; /* pointer to filter spec plus busy bit */
907 hunt_filter_handle_t hfe_handle;
908 } hunt_filter_entry_t;
911 * BUSY flag indicates that an update is in progress.
912 * AUTO_OLD flag is used to mark and sweep MAC packet filters.
914 #define EFX_HUNT_FILTER_FLAG_BUSY 1U
915 #define EFX_HUNT_FILTER_FLAG_AUTO_OLD 2U
916 #define EFX_HUNT_FILTER_FLAGS 3U
918 #define EFX_HUNT_FILTER_TBL_ROWS 8192
920 /* Allow for the broadcast address to be added to the multicast list */
921 #define EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX (EFX_MAC_MULTICAST_LIST_MAX + 1)
923 typedef struct hunt_filter_table_s {
924 hunt_filter_entry_t hft_entry[EFX_HUNT_FILTER_TBL_ROWS];
925 efx_rxq_t * hft_default_rxq;
926 boolean_t hft_using_rss;
927 uint32_t hft_unicst_filter_index;
928 boolean_t hft_unicst_filter_set;
929 uint32_t hft_mulcst_filter_indexes[
930 EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX];
931 uint32_t hft_mulcst_filter_count;
932 } hunt_filter_table_t;
936 __in efx_nic_t *enp);
940 __in efx_nic_t *enp);
944 __in efx_nic_t *enp);
949 __inout efx_filter_spec_t *spec,
950 __in boolean_t may_replace);
955 __inout efx_filter_spec_t *spec);
957 extern __checkReturn int
958 hunt_filter_supported_filters(
960 __out uint32_t *list,
961 __out size_t *length);
963 extern __checkReturn int
964 hunt_filter_reconfigure(
966 __in_ecount(6) uint8_t const *mac_addr,
967 __in boolean_t all_unicst,
968 __in boolean_t mulcst,
969 __in boolean_t all_mulcst,
970 __in boolean_t brdcst,
971 __in_ecount(6*count) uint8_t const *addrs,
975 hunt_filter_get_default_rxq(
977 __out efx_rxq_t **erpp,
978 __out boolean_t *using_rss);
981 hunt_filter_default_rxq_set(
984 __in boolean_t using_rss);
987 hunt_filter_default_rxq_clear(
988 __in efx_nic_t *enp);
991 #endif /* EFSYS_OPT_FILTER */
993 extern __checkReturn int
996 __in boolean_t unicst,
997 __in boolean_t brdcst);
999 #if EFSYS_OPT_MCAST_FILTER_LIST
1001 extern __checkReturn int
1002 hunt_pktfilter_mcast_set(
1003 __in efx_nic_t *enp,
1004 __in uint8_t const *addrs,
1007 #endif /* EFSYS_OPT_MCAST_FILTER_LIST */
1009 extern __checkReturn int
1010 hunt_pktfilter_mcast_all(
1011 __in efx_nic_t *enp);
1013 extern __checkReturn int
1014 efx_mcdi_get_function_info(
1015 __in efx_nic_t *enp,
1016 __out uint32_t *pfp,
1017 __out_opt uint32_t *vfp);
1019 extern __checkReturn int
1020 efx_mcdi_privilege_mask(
1021 __in efx_nic_t *enp,
1024 __out uint32_t *maskp);
1030 #endif /* _SYS_HUNT_IMPL_H */