1227569Sphilip/*- 2301388Sarybchik * Copyright (c) 2007-2016 Solarflare Communications Inc. 3284555Sarybchik * All rights reserved. 4227569Sphilip * 5227569Sphilip * Redistribution and use in source and binary forms, with or without 6284555Sarybchik * modification, are permitted provided that the following conditions are met: 7227569Sphilip * 8284555Sarybchik * 1. Redistributions of source code must retain the above copyright notice, 9284555Sarybchik * this list of conditions and the following disclaimer. 10284555Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice, 11284555Sarybchik * this list of conditions and the following disclaimer in the documentation 12284555Sarybchik * and/or other materials provided with the distribution. 13228078Sphilip * 14284555Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15284555Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 16284555Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17284555Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 18284555Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19284555Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20284555Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21284555Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22284555Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23284555Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 24284555Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25284555Sarybchik * 26284555Sarybchik * The views and conclusions contained in the software and documentation are 27284555Sarybchik * those of the authors and should not be interpreted as representing official 28284555Sarybchik * policies, either expressed or implied, of the FreeBSD Project. 29284555Sarybchik * 30228078Sphilip * $FreeBSD: stable/10/sys/dev/sfxge/common/efx_impl.h 342512 2018-12-26 10:21:40Z arybchik $ 31227569Sphilip */ 32227569Sphilip 33227569Sphilip#ifndef _SYS_EFX_IMPL_H 34227569Sphilip#define _SYS_EFX_IMPL_H 35227569Sphilip 36227569Sphilip#include "efx.h" 37227569Sphilip#include "efx_regs.h" 38284555Sarybchik#include "efx_regs_ef10.h" 39227569Sphilip 40284555Sarybchik/* FIXME: Add definition for driver generated software events */ 41284555Sarybchik#ifndef ESE_DZ_EV_CODE_DRV_GEN_EV 42284555Sarybchik#define ESE_DZ_EV_CODE_DRV_GEN_EV FSE_AZ_EV_CODE_DRV_GEN_EV 43284555Sarybchik#endif 44284555Sarybchik 45284555Sarybchik 46227569Sphilip#if EFSYS_OPT_SIENA 47227569Sphilip#include "siena_impl.h" 48227569Sphilip#endif /* EFSYS_OPT_SIENA */ 49227569Sphilip 50284555Sarybchik#if EFSYS_OPT_HUNTINGTON 51284555Sarybchik#include "hunt_impl.h" 52284555Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 53284555Sarybchik 54293980Sarybchik#if EFSYS_OPT_MEDFORD 55293980Sarybchik#include "medford_impl.h" 56293980Sarybchik#endif /* EFSYS_OPT_MEDFORD */ 57293980Sarybchik 58293980Sarybchik#if (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) 59293980Sarybchik#include "ef10_impl.h" 60293980Sarybchik#endif /* (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) */ 61293980Sarybchik 62227569Sphilip#ifdef __cplusplus 63227569Sphilipextern "C" { 64227569Sphilip#endif 65227569Sphilip 66284555Sarybchik#define EFX_MOD_MCDI 0x00000001 67284555Sarybchik#define EFX_MOD_PROBE 0x00000002 68284555Sarybchik#define EFX_MOD_NVRAM 0x00000004 69284555Sarybchik#define EFX_MOD_VPD 0x00000008 70284555Sarybchik#define EFX_MOD_NIC 0x00000010 71284555Sarybchik#define EFX_MOD_INTR 0x00000020 72284555Sarybchik#define EFX_MOD_EV 0x00000040 73284555Sarybchik#define EFX_MOD_RX 0x00000080 74284555Sarybchik#define EFX_MOD_TX 0x00000100 75284555Sarybchik#define EFX_MOD_PORT 0x00000200 76284555Sarybchik#define EFX_MOD_MON 0x00000400 77284555Sarybchik#define EFX_MOD_FILTER 0x00001000 78301327Sarybchik#define EFX_MOD_LIC 0x00002000 79227569Sphilip 80301355Sarybchik#define EFX_RESET_PHY 0x00000001 81301355Sarybchik#define EFX_RESET_RXQ_ERR 0x00000002 82301355Sarybchik#define EFX_RESET_TXQ_ERR 0x00000004 83227569Sphilip 84227569Sphiliptypedef enum efx_mac_type_e { 85227569Sphilip EFX_MAC_INVALID = 0, 86227569Sphilip EFX_MAC_SIENA, 87284555Sarybchik EFX_MAC_HUNTINGTON, 88294395Sarybchik EFX_MAC_MEDFORD, 89227569Sphilip EFX_MAC_NTYPES 90227569Sphilip} efx_mac_type_t; 91227569Sphilip 92284555Sarybchiktypedef struct efx_ev_ops_s { 93293927Sarybchik efx_rc_t (*eevo_init)(efx_nic_t *); 94284555Sarybchik void (*eevo_fini)(efx_nic_t *); 95293927Sarybchik efx_rc_t (*eevo_qcreate)(efx_nic_t *, unsigned int, 96284555Sarybchik efsys_mem_t *, size_t, uint32_t, 97311070Sarybchik uint32_t, uint32_t, efx_evq_t *); 98284555Sarybchik void (*eevo_qdestroy)(efx_evq_t *); 99293927Sarybchik efx_rc_t (*eevo_qprime)(efx_evq_t *, unsigned int); 100284555Sarybchik void (*eevo_qpost)(efx_evq_t *, uint16_t); 101293927Sarybchik efx_rc_t (*eevo_qmoderate)(efx_evq_t *, unsigned int); 102284555Sarybchik#if EFSYS_OPT_QSTATS 103284555Sarybchik void (*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *); 104284555Sarybchik#endif 105284555Sarybchik} efx_ev_ops_t; 106284555Sarybchik 107284555Sarybchiktypedef struct efx_tx_ops_s { 108293927Sarybchik efx_rc_t (*etxo_init)(efx_nic_t *); 109284555Sarybchik void (*etxo_fini)(efx_nic_t *); 110293927Sarybchik efx_rc_t (*etxo_qcreate)(efx_nic_t *, 111284555Sarybchik unsigned int, unsigned int, 112284555Sarybchik efsys_mem_t *, size_t, 113284555Sarybchik uint32_t, uint16_t, 114284555Sarybchik efx_evq_t *, efx_txq_t *, 115284555Sarybchik unsigned int *); 116284555Sarybchik void (*etxo_qdestroy)(efx_txq_t *); 117293927Sarybchik efx_rc_t (*etxo_qpost)(efx_txq_t *, efx_buffer_t *, 118284555Sarybchik unsigned int, unsigned int, 119284555Sarybchik unsigned int *); 120284555Sarybchik void (*etxo_qpush)(efx_txq_t *, unsigned int, unsigned int); 121293927Sarybchik efx_rc_t (*etxo_qpace)(efx_txq_t *, unsigned int); 122293927Sarybchik efx_rc_t (*etxo_qflush)(efx_txq_t *); 123284555Sarybchik void (*etxo_qenable)(efx_txq_t *); 124293927Sarybchik efx_rc_t (*etxo_qpio_enable)(efx_txq_t *); 125284555Sarybchik void (*etxo_qpio_disable)(efx_txq_t *); 126311063Sarybchik efx_rc_t (*etxo_qpio_write)(efx_txq_t *, uint8_t *, size_t, 127284555Sarybchik size_t); 128293927Sarybchik efx_rc_t (*etxo_qpio_post)(efx_txq_t *, size_t, unsigned int, 129284555Sarybchik unsigned int *); 130293927Sarybchik efx_rc_t (*etxo_qdesc_post)(efx_txq_t *, efx_desc_t *, 131284555Sarybchik unsigned int, unsigned int, 132284555Sarybchik unsigned int *); 133284555Sarybchik void (*etxo_qdesc_dma_create)(efx_txq_t *, efsys_dma_addr_t, 134284555Sarybchik size_t, boolean_t, 135284555Sarybchik efx_desc_t *); 136284555Sarybchik void (*etxo_qdesc_tso_create)(efx_txq_t *, uint16_t, 137284555Sarybchik uint32_t, uint8_t, 138284555Sarybchik efx_desc_t *); 139294381Sarybchik void (*etxo_qdesc_tso2_create)(efx_txq_t *, uint16_t, 140294381Sarybchik uint32_t, uint16_t, 141294381Sarybchik efx_desc_t *, int); 142284555Sarybchik void (*etxo_qdesc_vlantci_create)(efx_txq_t *, uint16_t, 143284555Sarybchik efx_desc_t *); 144342509Sarybchik void (*etxo_qdesc_checksum_create)(efx_txq_t *, uint16_t, 145342509Sarybchik efx_desc_t *); 146284555Sarybchik#if EFSYS_OPT_QSTATS 147284555Sarybchik void (*etxo_qstats_update)(efx_txq_t *, 148284555Sarybchik efsys_stat_t *); 149284555Sarybchik#endif 150284555Sarybchik} efx_tx_ops_t; 151284555Sarybchik 152284555Sarybchiktypedef struct efx_rx_ops_s { 153293927Sarybchik efx_rc_t (*erxo_init)(efx_nic_t *); 154284555Sarybchik void (*erxo_fini)(efx_nic_t *); 155284555Sarybchik#if EFSYS_OPT_RX_SCATTER 156293927Sarybchik efx_rc_t (*erxo_scatter_enable)(efx_nic_t *, unsigned int); 157284555Sarybchik#endif 158284555Sarybchik#if EFSYS_OPT_RX_SCALE 159293927Sarybchik efx_rc_t (*erxo_scale_mode_set)(efx_nic_t *, efx_rx_hash_alg_t, 160284555Sarybchik efx_rx_hash_type_t, boolean_t); 161293927Sarybchik efx_rc_t (*erxo_scale_key_set)(efx_nic_t *, uint8_t *, size_t); 162293927Sarybchik efx_rc_t (*erxo_scale_tbl_set)(efx_nic_t *, unsigned int *, 163284555Sarybchik size_t); 164294008Sarybchik uint32_t (*erxo_prefix_hash)(efx_nic_t *, efx_rx_hash_alg_t, 165294008Sarybchik uint8_t *); 166294008Sarybchik#endif /* EFSYS_OPT_RX_SCALE */ 167294008Sarybchik efx_rc_t (*erxo_prefix_pktlen)(efx_nic_t *, uint8_t *, 168294008Sarybchik uint16_t *); 169284555Sarybchik void (*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t, 170284555Sarybchik unsigned int, unsigned int, 171284555Sarybchik unsigned int); 172284555Sarybchik void (*erxo_qpush)(efx_rxq_t *, unsigned int, unsigned int *); 173293927Sarybchik efx_rc_t (*erxo_qflush)(efx_rxq_t *); 174284555Sarybchik void (*erxo_qenable)(efx_rxq_t *); 175293927Sarybchik efx_rc_t (*erxo_qcreate)(efx_nic_t *enp, unsigned int, 176284555Sarybchik unsigned int, efx_rxq_type_t, 177284555Sarybchik efsys_mem_t *, size_t, uint32_t, 178284555Sarybchik efx_evq_t *, efx_rxq_t *); 179284555Sarybchik void (*erxo_qdestroy)(efx_rxq_t *); 180284555Sarybchik} efx_rx_ops_t; 181284555Sarybchik 182227569Sphiliptypedef struct efx_mac_ops_s { 183293927Sarybchik efx_rc_t (*emo_poll)(efx_nic_t *, efx_link_mode_t *); 184293927Sarybchik efx_rc_t (*emo_up)(efx_nic_t *, boolean_t *); 185293927Sarybchik efx_rc_t (*emo_addr_set)(efx_nic_t *); 186294397Sarybchik efx_rc_t (*emo_pdu_set)(efx_nic_t *); 187301380Sarybchik efx_rc_t (*emo_pdu_get)(efx_nic_t *, size_t *); 188293927Sarybchik efx_rc_t (*emo_reconfigure)(efx_nic_t *); 189293927Sarybchik efx_rc_t (*emo_multicast_list_set)(efx_nic_t *); 190293927Sarybchik efx_rc_t (*emo_filter_default_rxq_set)(efx_nic_t *, 191284555Sarybchik efx_rxq_t *, boolean_t); 192284555Sarybchik void (*emo_filter_default_rxq_clear)(efx_nic_t *); 193227569Sphilip#if EFSYS_OPT_LOOPBACK 194293927Sarybchik efx_rc_t (*emo_loopback_set)(efx_nic_t *, efx_link_mode_t, 195227569Sphilip efx_loopback_type_t); 196227569Sphilip#endif /* EFSYS_OPT_LOOPBACK */ 197227569Sphilip#if EFSYS_OPT_MAC_STATS 198311080Sarybchik efx_rc_t (*emo_stats_get_mask)(efx_nic_t *, uint32_t *, size_t); 199293927Sarybchik efx_rc_t (*emo_stats_upload)(efx_nic_t *, efsys_mem_t *); 200293927Sarybchik efx_rc_t (*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *, 201227569Sphilip uint16_t, boolean_t); 202293927Sarybchik efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 203227569Sphilip efsys_stat_t *, uint32_t *); 204227569Sphilip#endif /* EFSYS_OPT_MAC_STATS */ 205227569Sphilip} efx_mac_ops_t; 206227569Sphilip 207227569Sphiliptypedef struct efx_phy_ops_s { 208293927Sarybchik efx_rc_t (*epo_power)(efx_nic_t *, boolean_t); /* optional */ 209293927Sarybchik efx_rc_t (*epo_reset)(efx_nic_t *); 210293927Sarybchik efx_rc_t (*epo_reconfigure)(efx_nic_t *); 211293927Sarybchik efx_rc_t (*epo_verify)(efx_nic_t *); 212293927Sarybchik efx_rc_t (*epo_oui_get)(efx_nic_t *, uint32_t *); 213227569Sphilip#if EFSYS_OPT_PHY_STATS 214293927Sarybchik efx_rc_t (*epo_stats_update)(efx_nic_t *, efsys_mem_t *, 215227569Sphilip uint32_t *); 216227569Sphilip#endif /* EFSYS_OPT_PHY_STATS */ 217284555Sarybchik#if EFSYS_OPT_BIST 218293927Sarybchik efx_rc_t (*epo_bist_enable_offline)(efx_nic_t *); 219293927Sarybchik efx_rc_t (*epo_bist_start)(efx_nic_t *, efx_bist_type_t); 220293927Sarybchik efx_rc_t (*epo_bist_poll)(efx_nic_t *, efx_bist_type_t, 221284555Sarybchik efx_bist_result_t *, uint32_t *, 222227569Sphilip unsigned long *, size_t); 223284555Sarybchik void (*epo_bist_stop)(efx_nic_t *, efx_bist_type_t); 224284555Sarybchik#endif /* EFSYS_OPT_BIST */ 225227569Sphilip} efx_phy_ops_t; 226227569Sphilip 227284555Sarybchik#if EFSYS_OPT_FILTER 228284555Sarybchiktypedef struct efx_filter_ops_s { 229293927Sarybchik efx_rc_t (*efo_init)(efx_nic_t *); 230293927Sarybchik void (*efo_fini)(efx_nic_t *); 231293927Sarybchik efx_rc_t (*efo_restore)(efx_nic_t *); 232293927Sarybchik efx_rc_t (*efo_add)(efx_nic_t *, efx_filter_spec_t *, 233293927Sarybchik boolean_t may_replace); 234293927Sarybchik efx_rc_t (*efo_delete)(efx_nic_t *, efx_filter_spec_t *); 235311494Sarybchik efx_rc_t (*efo_supported_filters)(efx_nic_t *, uint32_t *, 236311494Sarybchik size_t, size_t *); 237293927Sarybchik efx_rc_t (*efo_reconfigure)(efx_nic_t *, uint8_t const *, boolean_t, 238284555Sarybchik boolean_t, boolean_t, boolean_t, 239301337Sarybchik uint8_t const *, uint32_t); 240284555Sarybchik} efx_filter_ops_t; 241284555Sarybchik 242293927Sarybchikextern __checkReturn efx_rc_t 243284555Sarybchikefx_filter_reconfigure( 244284555Sarybchik __in efx_nic_t *enp, 245284555Sarybchik __in_ecount(6) uint8_t const *mac_addr, 246284555Sarybchik __in boolean_t all_unicst, 247284555Sarybchik __in boolean_t mulcst, 248284555Sarybchik __in boolean_t all_mulcst, 249284555Sarybchik __in boolean_t brdcst, 250284555Sarybchik __in_ecount(6*count) uint8_t const *addrs, 251301337Sarybchik __in uint32_t count); 252284555Sarybchik 253284555Sarybchik#endif /* EFSYS_OPT_FILTER */ 254284555Sarybchik 255284555Sarybchik 256227569Sphiliptypedef struct efx_port_s { 257227569Sphilip efx_mac_type_t ep_mac_type; 258311056Sarybchik uint32_t ep_phy_type; 259227569Sphilip uint8_t ep_port; 260227569Sphilip uint32_t ep_mac_pdu; 261227569Sphilip uint8_t ep_mac_addr[6]; 262227569Sphilip efx_link_mode_t ep_link_mode; 263284555Sarybchik boolean_t ep_all_unicst; 264284555Sarybchik boolean_t ep_mulcst; 265284555Sarybchik boolean_t ep_all_mulcst; 266227569Sphilip boolean_t ep_brdcst; 267227569Sphilip unsigned int ep_fcntl; 268227569Sphilip boolean_t ep_fcntl_autoneg; 269227569Sphilip efx_oword_t ep_multicst_hash[2]; 270284555Sarybchik uint8_t ep_mulcst_addr_list[EFX_MAC_ADDR_LEN * 271284555Sarybchik EFX_MAC_MULTICAST_LIST_MAX]; 272284555Sarybchik uint32_t ep_mulcst_addr_count; 273227569Sphilip#if EFSYS_OPT_LOOPBACK 274227569Sphilip efx_loopback_type_t ep_loopback_type; 275227569Sphilip efx_link_mode_t ep_loopback_link_mode; 276227569Sphilip#endif /* EFSYS_OPT_LOOPBACK */ 277227569Sphilip#if EFSYS_OPT_PHY_FLAGS 278227569Sphilip uint32_t ep_phy_flags; 279227569Sphilip#endif /* EFSYS_OPT_PHY_FLAGS */ 280227569Sphilip#if EFSYS_OPT_PHY_LED_CONTROL 281227569Sphilip efx_phy_led_mode_t ep_phy_led_mode; 282227569Sphilip#endif /* EFSYS_OPT_PHY_LED_CONTROL */ 283227569Sphilip efx_phy_media_type_t ep_fixed_port_type; 284227569Sphilip efx_phy_media_type_t ep_module_type; 285227569Sphilip uint32_t ep_adv_cap_mask; 286227569Sphilip uint32_t ep_lp_cap_mask; 287227569Sphilip uint32_t ep_default_adv_cap_mask; 288227569Sphilip uint32_t ep_phy_cap_mask; 289227569Sphilip boolean_t ep_mac_drain; 290284555Sarybchik#if EFSYS_OPT_BIST 291284555Sarybchik efx_bist_type_t ep_current_bist; 292227569Sphilip#endif 293301340Sarybchik const efx_mac_ops_t *ep_emop; 294301340Sarybchik const efx_phy_ops_t *ep_epop; 295227569Sphilip} efx_port_t; 296227569Sphilip 297227569Sphiliptypedef struct efx_mon_ops_s { 298227569Sphilip#if EFSYS_OPT_MON_STATS 299293927Sarybchik efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 300293927Sarybchik efx_mon_stat_value_t *); 301227569Sphilip#endif /* EFSYS_OPT_MON_STATS */ 302227569Sphilip} efx_mon_ops_t; 303227569Sphilip 304227569Sphiliptypedef struct efx_mon_s { 305301340Sarybchik efx_mon_type_t em_type; 306301340Sarybchik const efx_mon_ops_t *em_emop; 307227569Sphilip} efx_mon_t; 308227569Sphilip 309284555Sarybchiktypedef struct efx_intr_ops_s { 310293927Sarybchik efx_rc_t (*eio_init)(efx_nic_t *, efx_intr_type_t, efsys_mem_t *); 311284555Sarybchik void (*eio_enable)(efx_nic_t *); 312284555Sarybchik void (*eio_disable)(efx_nic_t *); 313284555Sarybchik void (*eio_disable_unlocked)(efx_nic_t *); 314293927Sarybchik efx_rc_t (*eio_trigger)(efx_nic_t *, unsigned int); 315294001Sarybchik void (*eio_status_line)(efx_nic_t *, boolean_t *, uint32_t *); 316294001Sarybchik void (*eio_status_message)(efx_nic_t *, unsigned int, 317294001Sarybchik boolean_t *); 318294001Sarybchik void (*eio_fatal)(efx_nic_t *); 319284555Sarybchik void (*eio_fini)(efx_nic_t *); 320284555Sarybchik} efx_intr_ops_t; 321284555Sarybchik 322227569Sphiliptypedef struct efx_intr_s { 323301340Sarybchik const efx_intr_ops_t *ei_eiop; 324301340Sarybchik efsys_mem_t *ei_esmp; 325301340Sarybchik efx_intr_type_t ei_type; 326301340Sarybchik unsigned int ei_level; 327227569Sphilip} efx_intr_t; 328227569Sphilip 329227569Sphiliptypedef struct efx_nic_ops_s { 330293927Sarybchik efx_rc_t (*eno_probe)(efx_nic_t *); 331294377Sarybchik efx_rc_t (*eno_board_cfg)(efx_nic_t *); 332293927Sarybchik efx_rc_t (*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*); 333293927Sarybchik efx_rc_t (*eno_reset)(efx_nic_t *); 334293927Sarybchik efx_rc_t (*eno_init)(efx_nic_t *); 335293927Sarybchik efx_rc_t (*eno_get_vi_pool)(efx_nic_t *, uint32_t *); 336293927Sarybchik efx_rc_t (*eno_get_bar_region)(efx_nic_t *, efx_nic_region_t, 337284555Sarybchik uint32_t *, size_t *); 338227569Sphilip#if EFSYS_OPT_DIAG 339293927Sarybchik efx_rc_t (*eno_register_test)(efx_nic_t *); 340227569Sphilip#endif /* EFSYS_OPT_DIAG */ 341293927Sarybchik void (*eno_fini)(efx_nic_t *); 342293927Sarybchik void (*eno_unprobe)(efx_nic_t *); 343227569Sphilip} efx_nic_ops_t; 344227569Sphilip 345280562Sarybchik#ifndef EFX_TXQ_LIMIT_TARGET 346284555Sarybchik#define EFX_TXQ_LIMIT_TARGET 259 347280562Sarybchik#endif 348280562Sarybchik#ifndef EFX_RXQ_LIMIT_TARGET 349284555Sarybchik#define EFX_RXQ_LIMIT_TARGET 512 350280562Sarybchik#endif 351280562Sarybchik#ifndef EFX_TXQ_DC_SIZE 352284555Sarybchik#define EFX_TXQ_DC_SIZE 1 /* 16 descriptors */ 353280562Sarybchik#endif 354280562Sarybchik#ifndef EFX_RXQ_DC_SIZE 355284555Sarybchik#define EFX_RXQ_DC_SIZE 3 /* 64 descriptors */ 356280562Sarybchik#endif 357227569Sphilip 358227569Sphilip#if EFSYS_OPT_FILTER 359227569Sphilip 360301346Sarybchiktypedef struct siena_filter_spec_s { 361301346Sarybchik uint8_t sfs_type; 362301346Sarybchik uint32_t sfs_flags; 363301346Sarybchik uint32_t sfs_dmaq_id; 364301346Sarybchik uint32_t sfs_dword[3]; 365301346Sarybchik} siena_filter_spec_t; 366227569Sphilip 367301346Sarybchiktypedef enum siena_filter_type_e { 368301346Sarybchik EFX_SIENA_FILTER_RX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 369301346Sarybchik EFX_SIENA_FILTER_RX_TCP_WILD, /* TCP/IPv4 {dIP,dTCP, -, -} */ 370301346Sarybchik EFX_SIENA_FILTER_RX_UDP_FULL, /* UDP/IPv4 {dIP,dUDP,sIP,sUDP} */ 371301346Sarybchik EFX_SIENA_FILTER_RX_UDP_WILD, /* UDP/IPv4 {dIP,dUDP, -, -} */ 372301346Sarybchik EFX_SIENA_FILTER_RX_MAC_FULL, /* Ethernet {dMAC,VLAN} */ 373301346Sarybchik EFX_SIENA_FILTER_RX_MAC_WILD, /* Ethernet {dMAC, -} */ 374284555Sarybchik 375301346Sarybchik EFX_SIENA_FILTER_TX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 376301346Sarybchik EFX_SIENA_FILTER_TX_TCP_WILD, /* TCP/IPv4 { -, -,sIP,sTCP} */ 377301346Sarybchik EFX_SIENA_FILTER_TX_UDP_FULL, /* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */ 378301346Sarybchik EFX_SIENA_FILTER_TX_UDP_WILD, /* UDP/IPv4 { -, -,sIP,sUDP} */ 379301346Sarybchik EFX_SIENA_FILTER_TX_MAC_FULL, /* Ethernet {sMAC,VLAN} */ 380301346Sarybchik EFX_SIENA_FILTER_TX_MAC_WILD, /* Ethernet {sMAC, -} */ 381227569Sphilip 382301346Sarybchik EFX_SIENA_FILTER_NTYPES 383301346Sarybchik} siena_filter_type_t; 384227569Sphilip 385301346Sarybchiktypedef enum siena_filter_tbl_id_e { 386301346Sarybchik EFX_SIENA_FILTER_TBL_RX_IP = 0, 387301346Sarybchik EFX_SIENA_FILTER_TBL_RX_MAC, 388301346Sarybchik EFX_SIENA_FILTER_TBL_TX_IP, 389301346Sarybchik EFX_SIENA_FILTER_TBL_TX_MAC, 390301346Sarybchik EFX_SIENA_FILTER_NTBLS 391301346Sarybchik} siena_filter_tbl_id_t; 392227569Sphilip 393301346Sarybchiktypedef struct siena_filter_tbl_s { 394301346Sarybchik int sft_size; /* number of entries */ 395301346Sarybchik int sft_used; /* active count */ 396301346Sarybchik uint32_t *sft_bitmap; /* active bitmap */ 397301346Sarybchik siena_filter_spec_t *sft_spec; /* array of saved specs */ 398301346Sarybchik} siena_filter_tbl_t; 399227569Sphilip 400301346Sarybchiktypedef struct siena_filter_s { 401301346Sarybchik siena_filter_tbl_t sf_tbl[EFX_SIENA_FILTER_NTBLS]; 402301346Sarybchik unsigned int sf_depth[EFX_SIENA_FILTER_NTYPES]; 403301346Sarybchik} siena_filter_t; 404227569Sphilip 405227569Sphiliptypedef struct efx_filter_s { 406301324Sarybchik#if EFSYS_OPT_SIENA 407301346Sarybchik siena_filter_t *ef_siena_filter; 408301324Sarybchik#endif /* EFSYS_OPT_SIENA */ 409293996Sarybchik#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD 410293996Sarybchik ef10_filter_table_t *ef_ef10_filter_table; 411293996Sarybchik#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */ 412227569Sphilip} efx_filter_t; 413227569Sphilip 414284555Sarybchikextern void 415301345Sarybchiksiena_filter_tbl_clear( 416227569Sphilip __in efx_nic_t *enp, 417301346Sarybchik __in siena_filter_tbl_id_t tbl); 418227569Sphilip 419284555Sarybchik#endif /* EFSYS_OPT_FILTER */ 420227569Sphilip 421284555Sarybchik#if EFSYS_OPT_MCDI 422227569Sphilip 423284555Sarybchiktypedef struct efx_mcdi_ops_s { 424293927Sarybchik efx_rc_t (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *); 425294378Sarybchik void (*emco_send_request)(efx_nic_t *, void *, size_t, 426294378Sarybchik void *, size_t); 427293927Sarybchik efx_rc_t (*emco_poll_reboot)(efx_nic_t *); 428293972Sarybchik boolean_t (*emco_poll_response)(efx_nic_t *); 429293972Sarybchik void (*emco_read_response)(efx_nic_t *, void *, size_t, size_t); 430284555Sarybchik void (*emco_fini)(efx_nic_t *); 431311496Sarybchik efx_rc_t (*emco_feature_supported)(efx_nic_t *, 432311496Sarybchik efx_mcdi_feature_id_t, boolean_t *); 433311496Sarybchik void (*emco_get_timeout)(efx_nic_t *, efx_mcdi_req_t *, 434311496Sarybchik uint32_t *); 435284555Sarybchik} efx_mcdi_ops_t; 436227569Sphilip 437284555Sarybchiktypedef struct efx_mcdi_s { 438301340Sarybchik const efx_mcdi_ops_t *em_emcop; 439284555Sarybchik const efx_mcdi_transport_t *em_emtp; 440284555Sarybchik efx_mcdi_iface_t em_emip; 441284555Sarybchik} efx_mcdi_t; 442227569Sphilip 443284555Sarybchik#endif /* EFSYS_OPT_MCDI */ 444227569Sphilip 445227569Sphilip#if EFSYS_OPT_NVRAM 446227569Sphiliptypedef struct efx_nvram_ops_s { 447227569Sphilip#if EFSYS_OPT_DIAG 448293927Sarybchik efx_rc_t (*envo_test)(efx_nic_t *); 449227569Sphilip#endif /* EFSYS_OPT_DIAG */ 450294379Sarybchik efx_rc_t (*envo_type_to_partn)(efx_nic_t *, efx_nvram_type_t, 451294379Sarybchik uint32_t *); 452294379Sarybchik efx_rc_t (*envo_partn_size)(efx_nic_t *, uint32_t, size_t *); 453294379Sarybchik efx_rc_t (*envo_partn_rw_start)(efx_nic_t *, uint32_t, size_t *); 454294379Sarybchik efx_rc_t (*envo_partn_read)(efx_nic_t *, uint32_t, 455293927Sarybchik unsigned int, caddr_t, size_t); 456294379Sarybchik efx_rc_t (*envo_partn_erase)(efx_nic_t *, uint32_t, 457294379Sarybchik unsigned int, size_t); 458294379Sarybchik efx_rc_t (*envo_partn_write)(efx_nic_t *, uint32_t, 459293927Sarybchik unsigned int, caddr_t, size_t); 460311495Sarybchik efx_rc_t (*envo_partn_rw_finish)(efx_nic_t *, uint32_t); 461294379Sarybchik efx_rc_t (*envo_partn_get_version)(efx_nic_t *, uint32_t, 462294379Sarybchik uint32_t *, uint16_t *); 463294379Sarybchik efx_rc_t (*envo_partn_set_version)(efx_nic_t *, uint32_t, 464293927Sarybchik uint16_t *); 465301321Sarybchik efx_rc_t (*envo_buffer_validate)(efx_nic_t *, uint32_t, 466301321Sarybchik caddr_t, size_t); 467227569Sphilip} efx_nvram_ops_t; 468227569Sphilip#endif /* EFSYS_OPT_NVRAM */ 469227569Sphilip 470227569Sphilip#if EFSYS_OPT_VPD 471227569Sphiliptypedef struct efx_vpd_ops_s { 472293927Sarybchik efx_rc_t (*evpdo_init)(efx_nic_t *); 473293927Sarybchik efx_rc_t (*evpdo_size)(efx_nic_t *, size_t *); 474293927Sarybchik efx_rc_t (*evpdo_read)(efx_nic_t *, caddr_t, size_t); 475293927Sarybchik efx_rc_t (*evpdo_verify)(efx_nic_t *, caddr_t, size_t); 476293927Sarybchik efx_rc_t (*evpdo_reinit)(efx_nic_t *, caddr_t, size_t); 477293927Sarybchik efx_rc_t (*evpdo_get)(efx_nic_t *, caddr_t, size_t, 478293927Sarybchik efx_vpd_value_t *); 479293927Sarybchik efx_rc_t (*evpdo_set)(efx_nic_t *, caddr_t, size_t, 480293927Sarybchik efx_vpd_value_t *); 481293927Sarybchik efx_rc_t (*evpdo_next)(efx_nic_t *, caddr_t, size_t, 482293927Sarybchik efx_vpd_value_t *, unsigned int *); 483293927Sarybchik efx_rc_t (*evpdo_write)(efx_nic_t *, caddr_t, size_t); 484293927Sarybchik void (*evpdo_fini)(efx_nic_t *); 485227569Sphilip} efx_vpd_ops_t; 486227569Sphilip#endif /* EFSYS_OPT_VPD */ 487227569Sphilip 488284555Sarybchik#if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM 489284555Sarybchik 490293927Sarybchik __checkReturn efx_rc_t 491284555Sarybchikefx_mcdi_nvram_partitions( 492284555Sarybchik __in efx_nic_t *enp, 493284555Sarybchik __out_bcount(size) caddr_t data, 494284555Sarybchik __in size_t size, 495284555Sarybchik __out unsigned int *npartnp); 496284555Sarybchik 497293927Sarybchik __checkReturn efx_rc_t 498284555Sarybchikefx_mcdi_nvram_metadata( 499284555Sarybchik __in efx_nic_t *enp, 500284555Sarybchik __in uint32_t partn, 501284555Sarybchik __out uint32_t *subtypep, 502284555Sarybchik __out_ecount(4) uint16_t version[4], 503284555Sarybchik __out_bcount_opt(size) char *descp, 504284555Sarybchik __in size_t size); 505284555Sarybchik 506293927Sarybchik __checkReturn efx_rc_t 507284555Sarybchikefx_mcdi_nvram_info( 508284555Sarybchik __in efx_nic_t *enp, 509284555Sarybchik __in uint32_t partn, 510284555Sarybchik __out_opt size_t *sizep, 511284555Sarybchik __out_opt uint32_t *addressp, 512293944Sarybchik __out_opt uint32_t *erase_sizep, 513293944Sarybchik __out_opt uint32_t *write_sizep); 514284555Sarybchik 515293927Sarybchik __checkReturn efx_rc_t 516284555Sarybchikefx_mcdi_nvram_update_start( 517284555Sarybchik __in efx_nic_t *enp, 518284555Sarybchik __in uint32_t partn); 519284555Sarybchik 520293927Sarybchik __checkReturn efx_rc_t 521284555Sarybchikefx_mcdi_nvram_read( 522284555Sarybchik __in efx_nic_t *enp, 523284555Sarybchik __in uint32_t partn, 524284555Sarybchik __in uint32_t offset, 525284555Sarybchik __out_bcount(size) caddr_t data, 526294403Sarybchik __in size_t size, 527294403Sarybchik __in uint32_t mode); 528284555Sarybchik 529293927Sarybchik __checkReturn efx_rc_t 530284555Sarybchikefx_mcdi_nvram_erase( 531284555Sarybchik __in efx_nic_t *enp, 532284555Sarybchik __in uint32_t partn, 533284555Sarybchik __in uint32_t offset, 534284555Sarybchik __in size_t size); 535284555Sarybchik 536293927Sarybchik __checkReturn efx_rc_t 537284555Sarybchikefx_mcdi_nvram_write( 538284555Sarybchik __in efx_nic_t *enp, 539284555Sarybchik __in uint32_t partn, 540284555Sarybchik __in uint32_t offset, 541342512Sarybchik __in_bcount(size) caddr_t data, 542284555Sarybchik __in size_t size); 543284555Sarybchik 544293927Sarybchik __checkReturn efx_rc_t 545284555Sarybchikefx_mcdi_nvram_update_finish( 546284555Sarybchik __in efx_nic_t *enp, 547284555Sarybchik __in uint32_t partn, 548311495Sarybchik __in boolean_t reboot, 549311495Sarybchik __out_opt uint32_t *resultp); 550284555Sarybchik 551284555Sarybchik#if EFSYS_OPT_DIAG 552284555Sarybchik 553293927Sarybchik __checkReturn efx_rc_t 554284555Sarybchikefx_mcdi_nvram_test( 555284555Sarybchik __in efx_nic_t *enp, 556284555Sarybchik __in uint32_t partn); 557284555Sarybchik 558284555Sarybchik#endif /* EFSYS_OPT_DIAG */ 559284555Sarybchik 560284555Sarybchik#endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */ 561284555Sarybchik 562294386Sarybchik#if EFSYS_OPT_LICENSING 563294386Sarybchik 564294386Sarybchiktypedef struct efx_lic_ops_s { 565294386Sarybchik efx_rc_t (*elo_update_licenses)(efx_nic_t *); 566294386Sarybchik efx_rc_t (*elo_get_key_stats)(efx_nic_t *, efx_key_stats_t *); 567294386Sarybchik efx_rc_t (*elo_app_state)(efx_nic_t *, uint64_t, boolean_t *); 568294386Sarybchik efx_rc_t (*elo_get_id)(efx_nic_t *, size_t, uint32_t *, 569294386Sarybchik size_t *, uint8_t *); 570301361Sarybchik efx_rc_t (*elo_find_start) 571301361Sarybchik (efx_nic_t *, caddr_t, size_t, uint32_t *); 572301361Sarybchik efx_rc_t (*elo_find_end)(efx_nic_t *, caddr_t, size_t, 573310842Sarybchik uint32_t, uint32_t *); 574301361Sarybchik boolean_t (*elo_find_key)(efx_nic_t *, caddr_t, size_t, 575301361Sarybchik uint32_t, uint32_t *, uint32_t *); 576301361Sarybchik boolean_t (*elo_validate_key)(efx_nic_t *, 577301361Sarybchik caddr_t, uint32_t); 578301361Sarybchik efx_rc_t (*elo_read_key)(efx_nic_t *, 579301361Sarybchik caddr_t, size_t, uint32_t, uint32_t, 580301361Sarybchik caddr_t, size_t, uint32_t *); 581301361Sarybchik efx_rc_t (*elo_write_key)(efx_nic_t *, 582301361Sarybchik caddr_t, size_t, uint32_t, 583301361Sarybchik caddr_t, uint32_t, uint32_t *); 584301361Sarybchik efx_rc_t (*elo_delete_key)(efx_nic_t *, 585301361Sarybchik caddr_t, size_t, uint32_t, 586301361Sarybchik uint32_t, uint32_t, uint32_t *); 587301361Sarybchik efx_rc_t (*elo_create_partition)(efx_nic_t *, 588301361Sarybchik caddr_t, size_t); 589301361Sarybchik efx_rc_t (*elo_finish_partition)(efx_nic_t *, 590301361Sarybchik caddr_t, size_t); 591294386Sarybchik} efx_lic_ops_t; 592294386Sarybchik 593294386Sarybchik#endif 594294386Sarybchik 595284555Sarybchiktypedef struct efx_drv_cfg_s { 596284555Sarybchik uint32_t edc_min_vi_count; 597284555Sarybchik uint32_t edc_max_vi_count; 598284555Sarybchik 599284555Sarybchik uint32_t edc_max_piobuf_count; 600284555Sarybchik uint32_t edc_pio_alloc_size; 601284555Sarybchik} efx_drv_cfg_t; 602284555Sarybchik 603227569Sphilipstruct efx_nic_s { 604227569Sphilip uint32_t en_magic; 605227569Sphilip efx_family_t en_family; 606227569Sphilip uint32_t en_features; 607227569Sphilip efsys_identifier_t *en_esip; 608227569Sphilip efsys_lock_t *en_eslp; 609311056Sarybchik efsys_bar_t *en_esbp; 610227569Sphilip unsigned int en_mod_flags; 611227569Sphilip unsigned int en_reset_flags; 612227569Sphilip efx_nic_cfg_t en_nic_cfg; 613284555Sarybchik efx_drv_cfg_t en_drv_cfg; 614227569Sphilip efx_port_t en_port; 615227569Sphilip efx_mon_t en_mon; 616227569Sphilip efx_intr_t en_intr; 617227569Sphilip uint32_t en_ev_qcount; 618227569Sphilip uint32_t en_rx_qcount; 619227569Sphilip uint32_t en_tx_qcount; 620301340Sarybchik const efx_nic_ops_t *en_enop; 621301340Sarybchik const efx_ev_ops_t *en_eevop; 622301340Sarybchik const efx_tx_ops_t *en_etxop; 623301340Sarybchik const efx_rx_ops_t *en_erxop; 624227569Sphilip#if EFSYS_OPT_FILTER 625227569Sphilip efx_filter_t en_filter; 626301340Sarybchik const efx_filter_ops_t *en_efop; 627227569Sphilip#endif /* EFSYS_OPT_FILTER */ 628284555Sarybchik#if EFSYS_OPT_MCDI 629284555Sarybchik efx_mcdi_t en_mcdi; 630284555Sarybchik#endif /* EFSYS_OPT_MCDI */ 631227569Sphilip#if EFSYS_OPT_NVRAM 632227569Sphilip efx_nvram_type_t en_nvram_locked; 633301340Sarybchik const efx_nvram_ops_t *en_envop; 634227569Sphilip#endif /* EFSYS_OPT_NVRAM */ 635227569Sphilip#if EFSYS_OPT_VPD 636301340Sarybchik const efx_vpd_ops_t *en_evpdop; 637227569Sphilip#endif /* EFSYS_OPT_VPD */ 638284555Sarybchik#if EFSYS_OPT_RX_SCALE 639284555Sarybchik efx_rx_hash_support_t en_hash_support; 640284555Sarybchik efx_rx_scale_support_t en_rss_support; 641284555Sarybchik uint32_t en_rss_context; 642284555Sarybchik#endif /* EFSYS_OPT_RX_SCALE */ 643284555Sarybchik uint32_t en_vport_id; 644294386Sarybchik#if EFSYS_OPT_LICENSING 645301340Sarybchik const efx_lic_ops_t *en_elop; 646301379Sarybchik boolean_t en_licensing_supported; 647294386Sarybchik#endif 648227569Sphilip union { 649227569Sphilip#if EFSYS_OPT_SIENA 650227569Sphilip struct { 651227569Sphilip#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 652227569Sphilip unsigned int enu_partn_mask; 653227569Sphilip#endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 654227569Sphilip#if EFSYS_OPT_VPD 655227569Sphilip caddr_t enu_svpd; 656227569Sphilip size_t enu_svpd_length; 657227569Sphilip#endif /* EFSYS_OPT_VPD */ 658284555Sarybchik int enu_unused; 659227569Sphilip } siena; 660227569Sphilip#endif /* EFSYS_OPT_SIENA */ 661293982Sarybchik int enu_unused; 662293982Sarybchik } en_u; 663293982Sarybchik#if (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) 664293982Sarybchik union en_arch { 665284555Sarybchik struct { 666293982Sarybchik int ena_vi_base; 667293982Sarybchik int ena_vi_count; 668294009Sarybchik int ena_vi_shift; 669284555Sarybchik#if EFSYS_OPT_VPD 670293982Sarybchik caddr_t ena_svpd; 671293982Sarybchik size_t ena_svpd_length; 672284555Sarybchik#endif /* EFSYS_OPT_VPD */ 673293982Sarybchik efx_piobuf_handle_t ena_piobuf_handle[EF10_MAX_PIOBUF_NBUFS]; 674293982Sarybchik uint32_t ena_piobuf_count; 675293982Sarybchik uint32_t ena_pio_alloc_map[EF10_MAX_PIOBUF_NBUFS]; 676293982Sarybchik uint32_t ena_pio_write_vi_base; 677284555Sarybchik /* Memory BAR mapping regions */ 678293982Sarybchik uint32_t ena_uc_mem_map_offset; 679293982Sarybchik size_t ena_uc_mem_map_size; 680293982Sarybchik uint32_t ena_wc_mem_map_offset; 681293982Sarybchik size_t ena_wc_mem_map_size; 682293982Sarybchik } ef10; 683293982Sarybchik } en_arch; 684293982Sarybchik#endif /* (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) */ 685227569Sphilip}; 686227569Sphilip 687227569Sphilip 688227569Sphilip#define EFX_NIC_MAGIC 0x02121996 689227569Sphilip 690227569Sphiliptypedef boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *, 691227569Sphilip const efx_ev_callbacks_t *, void *); 692227569Sphilip 693284555Sarybchiktypedef struct efx_evq_rxq_state_s { 694284555Sarybchik unsigned int eers_rx_read_ptr; 695284555Sarybchik unsigned int eers_rx_mask; 696284555Sarybchik} efx_evq_rxq_state_t; 697284555Sarybchik 698227569Sphilipstruct efx_evq_s { 699227569Sphilip uint32_t ee_magic; 700227569Sphilip efx_nic_t *ee_enp; 701227569Sphilip unsigned int ee_index; 702227569Sphilip unsigned int ee_mask; 703227569Sphilip efsys_mem_t *ee_esmp; 704227569Sphilip#if EFSYS_OPT_QSTATS 705227569Sphilip uint32_t ee_stat[EV_NQSTATS]; 706227569Sphilip#endif /* EFSYS_OPT_QSTATS */ 707284555Sarybchik 708284555Sarybchik efx_ev_handler_t ee_rx; 709284555Sarybchik efx_ev_handler_t ee_tx; 710284555Sarybchik efx_ev_handler_t ee_driver; 711284555Sarybchik efx_ev_handler_t ee_global; 712284555Sarybchik efx_ev_handler_t ee_drv_gen; 713284555Sarybchik#if EFSYS_OPT_MCDI 714284555Sarybchik efx_ev_handler_t ee_mcdi; 715284555Sarybchik#endif /* EFSYS_OPT_MCDI */ 716284555Sarybchik 717284555Sarybchik efx_evq_rxq_state_t ee_rxq_state[EFX_EV_RX_NLABELS]; 718311094Sarybchik 719311094Sarybchik uint32_t ee_flags; 720227569Sphilip}; 721227569Sphilip 722227569Sphilip#define EFX_EVQ_MAGIC 0x08081997 723227569Sphilip 724280588Sarybchik#define EFX_EVQ_SIENA_TIMER_QUANTUM_NS 6144 /* 768 cycles */ 725227569Sphilip 726227569Sphilipstruct efx_rxq_s { 727227569Sphilip uint32_t er_magic; 728227569Sphilip efx_nic_t *er_enp; 729284555Sarybchik efx_evq_t *er_eep; 730227569Sphilip unsigned int er_index; 731284555Sarybchik unsigned int er_label; 732227569Sphilip unsigned int er_mask; 733227569Sphilip efsys_mem_t *er_esmp; 734227569Sphilip}; 735227569Sphilip 736227569Sphilip#define EFX_RXQ_MAGIC 0x15022005 737227569Sphilip 738227569Sphilipstruct efx_txq_s { 739227569Sphilip uint32_t et_magic; 740227569Sphilip efx_nic_t *et_enp; 741227569Sphilip unsigned int et_index; 742227569Sphilip unsigned int et_mask; 743227569Sphilip efsys_mem_t *et_esmp; 744284555Sarybchik#if EFSYS_OPT_HUNTINGTON 745284555Sarybchik uint32_t et_pio_bufnum; 746284555Sarybchik uint32_t et_pio_blknum; 747284555Sarybchik uint32_t et_pio_write_offset; 748284555Sarybchik uint32_t et_pio_offset; 749284555Sarybchik size_t et_pio_size; 750284555Sarybchik#endif 751227569Sphilip#if EFSYS_OPT_QSTATS 752227569Sphilip uint32_t et_stat[TX_NQSTATS]; 753227569Sphilip#endif /* EFSYS_OPT_QSTATS */ 754227569Sphilip}; 755227569Sphilip 756227569Sphilip#define EFX_TXQ_MAGIC 0x05092005 757227569Sphilip 758227569Sphilip#define EFX_MAC_ADDR_COPY(_dst, _src) \ 759227569Sphilip do { \ 760227569Sphilip (_dst)[0] = (_src)[0]; \ 761227569Sphilip (_dst)[1] = (_src)[1]; \ 762227569Sphilip (_dst)[2] = (_src)[2]; \ 763227569Sphilip (_dst)[3] = (_src)[3]; \ 764227569Sphilip (_dst)[4] = (_src)[4]; \ 765227569Sphilip (_dst)[5] = (_src)[5]; \ 766227569Sphilip _NOTE(CONSTANTCONDITION) \ 767227569Sphilip } while (B_FALSE) 768227569Sphilip 769284555Sarybchik#define EFX_MAC_BROADCAST_ADDR_SET(_dst) \ 770284555Sarybchik do { \ 771284555Sarybchik uint16_t *_d = (uint16_t *)(_dst); \ 772284555Sarybchik _d[0] = 0xffff; \ 773284555Sarybchik _d[1] = 0xffff; \ 774284555Sarybchik _d[2] = 0xffff; \ 775284555Sarybchik _NOTE(CONSTANTCONDITION) \ 776284555Sarybchik } while (B_FALSE) 777284555Sarybchik 778227569Sphilip#if EFSYS_OPT_CHECK_REG 779227569Sphilip#define EFX_CHECK_REG(_enp, _reg) \ 780227569Sphilip do { \ 781284555Sarybchik const char *name = #_reg; \ 782227569Sphilip char min = name[4]; \ 783227569Sphilip char max = name[5]; \ 784227569Sphilip char rev; \ 785227569Sphilip \ 786227569Sphilip switch ((_enp)->en_family) { \ 787227569Sphilip case EFX_FAMILY_SIENA: \ 788227569Sphilip rev = 'C'; \ 789227569Sphilip break; \ 790227569Sphilip \ 791284555Sarybchik case EFX_FAMILY_HUNTINGTON: \ 792284555Sarybchik rev = 'D'; \ 793284555Sarybchik break; \ 794284555Sarybchik \ 795293975Sarybchik case EFX_FAMILY_MEDFORD: \ 796293975Sarybchik rev = 'E'; \ 797293975Sarybchik break; \ 798293975Sarybchik \ 799227569Sphilip default: \ 800227569Sphilip rev = '?'; \ 801227569Sphilip break; \ 802227569Sphilip } \ 803227569Sphilip \ 804227569Sphilip EFSYS_ASSERT3S(rev, >=, min); \ 805227569Sphilip EFSYS_ASSERT3S(rev, <=, max); \ 806227569Sphilip \ 807227569Sphilip _NOTE(CONSTANTCONDITION) \ 808227569Sphilip } while (B_FALSE) 809227569Sphilip#else 810227569Sphilip#define EFX_CHECK_REG(_enp, _reg) do { \ 811227569Sphilip _NOTE(CONSTANTCONDITION) \ 812311063Sarybchik } while (B_FALSE) 813227569Sphilip#endif 814227569Sphilip 815227569Sphilip#define EFX_BAR_READD(_enp, _reg, _edp, _lock) \ 816227569Sphilip do { \ 817227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 818227569Sphilip EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST, \ 819227569Sphilip (_edp), (_lock)); \ 820227569Sphilip EFSYS_PROBE3(efx_bar_readd, const char *, #_reg, \ 821227569Sphilip uint32_t, _reg ## _OFST, \ 822227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 823227569Sphilip _NOTE(CONSTANTCONDITION) \ 824227569Sphilip } while (B_FALSE) 825227569Sphilip 826227569Sphilip#define EFX_BAR_WRITED(_enp, _reg, _edp, _lock) \ 827227569Sphilip do { \ 828227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 829227569Sphilip EFSYS_PROBE3(efx_bar_writed, const char *, #_reg, \ 830227569Sphilip uint32_t, _reg ## _OFST, \ 831227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 832227569Sphilip EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST, \ 833227569Sphilip (_edp), (_lock)); \ 834227569Sphilip _NOTE(CONSTANTCONDITION) \ 835227569Sphilip } while (B_FALSE) 836227569Sphilip 837227569Sphilip#define EFX_BAR_READQ(_enp, _reg, _eqp) \ 838227569Sphilip do { \ 839227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 840227569Sphilip EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST, \ 841227569Sphilip (_eqp)); \ 842227569Sphilip EFSYS_PROBE4(efx_bar_readq, const char *, #_reg, \ 843227569Sphilip uint32_t, _reg ## _OFST, \ 844227569Sphilip uint32_t, (_eqp)->eq_u32[1], \ 845227569Sphilip uint32_t, (_eqp)->eq_u32[0]); \ 846227569Sphilip _NOTE(CONSTANTCONDITION) \ 847227569Sphilip } while (B_FALSE) 848227569Sphilip 849227569Sphilip#define EFX_BAR_WRITEQ(_enp, _reg, _eqp) \ 850227569Sphilip do { \ 851227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 852227569Sphilip EFSYS_PROBE4(efx_bar_writeq, const char *, #_reg, \ 853227569Sphilip uint32_t, _reg ## _OFST, \ 854227569Sphilip uint32_t, (_eqp)->eq_u32[1], \ 855227569Sphilip uint32_t, (_eqp)->eq_u32[0]); \ 856227569Sphilip EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST, \ 857227569Sphilip (_eqp)); \ 858227569Sphilip _NOTE(CONSTANTCONDITION) \ 859227569Sphilip } while (B_FALSE) 860227569Sphilip 861227569Sphilip#define EFX_BAR_READO(_enp, _reg, _eop) \ 862227569Sphilip do { \ 863227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 864227569Sphilip EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST, \ 865227569Sphilip (_eop), B_TRUE); \ 866227569Sphilip EFSYS_PROBE6(efx_bar_reado, const char *, #_reg, \ 867227569Sphilip uint32_t, _reg ## _OFST, \ 868227569Sphilip uint32_t, (_eop)->eo_u32[3], \ 869227569Sphilip uint32_t, (_eop)->eo_u32[2], \ 870227569Sphilip uint32_t, (_eop)->eo_u32[1], \ 871227569Sphilip uint32_t, (_eop)->eo_u32[0]); \ 872227569Sphilip _NOTE(CONSTANTCONDITION) \ 873227569Sphilip } while (B_FALSE) 874227569Sphilip 875227569Sphilip#define EFX_BAR_WRITEO(_enp, _reg, _eop) \ 876227569Sphilip do { \ 877227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 878227569Sphilip EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg, \ 879227569Sphilip uint32_t, _reg ## _OFST, \ 880227569Sphilip uint32_t, (_eop)->eo_u32[3], \ 881227569Sphilip uint32_t, (_eop)->eo_u32[2], \ 882227569Sphilip uint32_t, (_eop)->eo_u32[1], \ 883227569Sphilip uint32_t, (_eop)->eo_u32[0]); \ 884227569Sphilip EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST, \ 885227569Sphilip (_eop), B_TRUE); \ 886227569Sphilip _NOTE(CONSTANTCONDITION) \ 887227569Sphilip } while (B_FALSE) 888227569Sphilip 889227569Sphilip#define EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock) \ 890227569Sphilip do { \ 891227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 892227569Sphilip EFSYS_BAR_READD((_enp)->en_esbp, \ 893227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 894227569Sphilip (_edp), (_lock)); \ 895227569Sphilip EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg, \ 896227569Sphilip uint32_t, (_index), \ 897227569Sphilip uint32_t, _reg ## _OFST, \ 898227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 899227569Sphilip _NOTE(CONSTANTCONDITION) \ 900227569Sphilip } while (B_FALSE) 901227569Sphilip 902227569Sphilip#define EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock) \ 903227569Sphilip do { \ 904227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 905227569Sphilip EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 906227569Sphilip uint32_t, (_index), \ 907227569Sphilip uint32_t, _reg ## _OFST, \ 908227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 909227569Sphilip EFSYS_BAR_WRITED((_enp)->en_esbp, \ 910227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 911227569Sphilip (_edp), (_lock)); \ 912227569Sphilip _NOTE(CONSTANTCONDITION) \ 913227569Sphilip } while (B_FALSE) 914227569Sphilip 915284555Sarybchik#define EFX_BAR_TBL_WRITED2(_enp, _reg, _index, _edp, _lock) \ 916284555Sarybchik do { \ 917284555Sarybchik EFX_CHECK_REG((_enp), (_reg)); \ 918284555Sarybchik EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 919284555Sarybchik uint32_t, (_index), \ 920284555Sarybchik uint32_t, _reg ## _OFST, \ 921284555Sarybchik uint32_t, (_edp)->ed_u32[0]); \ 922284555Sarybchik EFSYS_BAR_WRITED((_enp)->en_esbp, \ 923284555Sarybchik (_reg ## _OFST + \ 924311058Sarybchik (2 * sizeof (efx_dword_t)) + \ 925284555Sarybchik ((_index) * _reg ## _STEP)), \ 926284555Sarybchik (_edp), (_lock)); \ 927284555Sarybchik _NOTE(CONSTANTCONDITION) \ 928284555Sarybchik } while (B_FALSE) 929284555Sarybchik 930227569Sphilip#define EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock) \ 931227569Sphilip do { \ 932227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 933227569Sphilip EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 934227569Sphilip uint32_t, (_index), \ 935227569Sphilip uint32_t, _reg ## _OFST, \ 936227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 937227569Sphilip EFSYS_BAR_WRITED((_enp)->en_esbp, \ 938227569Sphilip (_reg ## _OFST + \ 939311058Sarybchik (3 * sizeof (efx_dword_t)) + \ 940227569Sphilip ((_index) * _reg ## _STEP)), \ 941227569Sphilip (_edp), (_lock)); \ 942227569Sphilip _NOTE(CONSTANTCONDITION) \ 943227569Sphilip } while (B_FALSE) 944227569Sphilip 945227569Sphilip#define EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp) \ 946227569Sphilip do { \ 947227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 948227569Sphilip EFSYS_BAR_READQ((_enp)->en_esbp, \ 949227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 950227569Sphilip (_eqp)); \ 951227569Sphilip EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg, \ 952227569Sphilip uint32_t, (_index), \ 953227569Sphilip uint32_t, _reg ## _OFST, \ 954227569Sphilip uint32_t, (_eqp)->eq_u32[1], \ 955227569Sphilip uint32_t, (_eqp)->eq_u32[0]); \ 956227569Sphilip _NOTE(CONSTANTCONDITION) \ 957227569Sphilip } while (B_FALSE) 958227569Sphilip 959227569Sphilip#define EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp) \ 960227569Sphilip do { \ 961227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 962227569Sphilip EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg, \ 963227569Sphilip uint32_t, (_index), \ 964227569Sphilip uint32_t, _reg ## _OFST, \ 965227569Sphilip uint32_t, (_eqp)->eq_u32[1], \ 966227569Sphilip uint32_t, (_eqp)->eq_u32[0]); \ 967227569Sphilip EFSYS_BAR_WRITEQ((_enp)->en_esbp, \ 968227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 969227569Sphilip (_eqp)); \ 970227569Sphilip _NOTE(CONSTANTCONDITION) \ 971227569Sphilip } while (B_FALSE) 972227569Sphilip 973284555Sarybchik#define EFX_BAR_TBL_READO(_enp, _reg, _index, _eop, _lock) \ 974227569Sphilip do { \ 975227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 976227569Sphilip EFSYS_BAR_READO((_enp)->en_esbp, \ 977227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 978284555Sarybchik (_eop), (_lock)); \ 979227569Sphilip EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg, \ 980227569Sphilip uint32_t, (_index), \ 981227569Sphilip uint32_t, _reg ## _OFST, \ 982227569Sphilip uint32_t, (_eop)->eo_u32[3], \ 983227569Sphilip uint32_t, (_eop)->eo_u32[2], \ 984227569Sphilip uint32_t, (_eop)->eo_u32[1], \ 985227569Sphilip uint32_t, (_eop)->eo_u32[0]); \ 986227569Sphilip _NOTE(CONSTANTCONDITION) \ 987227569Sphilip } while (B_FALSE) 988227569Sphilip 989284555Sarybchik#define EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop, _lock) \ 990227569Sphilip do { \ 991227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 992227569Sphilip EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg, \ 993227569Sphilip uint32_t, (_index), \ 994227569Sphilip uint32_t, _reg ## _OFST, \ 995227569Sphilip uint32_t, (_eop)->eo_u32[3], \ 996227569Sphilip uint32_t, (_eop)->eo_u32[2], \ 997227569Sphilip uint32_t, (_eop)->eo_u32[1], \ 998227569Sphilip uint32_t, (_eop)->eo_u32[0]); \ 999227569Sphilip EFSYS_BAR_WRITEO((_enp)->en_esbp, \ 1000227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 1001284555Sarybchik (_eop), (_lock)); \ 1002227569Sphilip _NOTE(CONSTANTCONDITION) \ 1003227569Sphilip } while (B_FALSE) 1004227569Sphilip 1005284555Sarybchik/* 1006284555Sarybchik * Allow drivers to perform optimised 128-bit doorbell writes. 1007284555Sarybchik * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are 1008284555Sarybchik * special-cased in the BIU on the Falcon/Siena and EF10 architectures to avoid 1009284555Sarybchik * the need for locking in the host, and are the only ones known to be safe to 1010284555Sarybchik * use 128-bites write with. 1011284555Sarybchik */ 1012284555Sarybchik#define EFX_BAR_TBL_DOORBELL_WRITEO(_enp, _reg, _index, _eop) \ 1013284555Sarybchik do { \ 1014284555Sarybchik EFX_CHECK_REG((_enp), (_reg)); \ 1015284555Sarybchik EFSYS_PROBE7(efx_bar_tbl_doorbell_writeo, \ 1016284555Sarybchik const char *, \ 1017284555Sarybchik #_reg, \ 1018284555Sarybchik uint32_t, (_index), \ 1019284555Sarybchik uint32_t, _reg ## _OFST, \ 1020284555Sarybchik uint32_t, (_eop)->eo_u32[3], \ 1021284555Sarybchik uint32_t, (_eop)->eo_u32[2], \ 1022284555Sarybchik uint32_t, (_eop)->eo_u32[1], \ 1023284555Sarybchik uint32_t, (_eop)->eo_u32[0]); \ 1024284555Sarybchik EFSYS_BAR_DOORBELL_WRITEO((_enp)->en_esbp, \ 1025284555Sarybchik (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 1026284555Sarybchik (_eop)); \ 1027284555Sarybchik _NOTE(CONSTANTCONDITION) \ 1028284555Sarybchik } while (B_FALSE) 1029284555Sarybchik 1030284555Sarybchik#define EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _wptr, _owptr) \ 1031284555Sarybchik do { \ 1032284555Sarybchik unsigned int _new = (_wptr); \ 1033284555Sarybchik unsigned int _old = (_owptr); \ 1034284555Sarybchik \ 1035284555Sarybchik if ((_new) >= (_old)) \ 1036284555Sarybchik EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 1037284555Sarybchik (_old) * sizeof (efx_desc_t), \ 1038284555Sarybchik ((_new) - (_old)) * sizeof (efx_desc_t)); \ 1039284555Sarybchik else \ 1040284555Sarybchik /* \ 1041284555Sarybchik * It is cheaper to sync entire map than sync \ 1042284555Sarybchik * two parts especially when offset/size are \ 1043284555Sarybchik * ignored and entire map is synced in any case.\ 1044284555Sarybchik */ \ 1045284555Sarybchik EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 1046284555Sarybchik 0, \ 1047284555Sarybchik (_entries) * sizeof (efx_desc_t)); \ 1048284555Sarybchik _NOTE(CONSTANTCONDITION) \ 1049284555Sarybchik } while (B_FALSE) 1050284555Sarybchik 1051293927Sarybchikextern __checkReturn efx_rc_t 1052227569Sphilipefx_mac_select( 1053227569Sphilip __in efx_nic_t *enp); 1054227569Sphilip 1055284555Sarybchikextern void 1056284555Sarybchikefx_mac_multicast_hash_compute( 1057284555Sarybchik __in_ecount(6*count) uint8_t const *addrs, 1058284555Sarybchik __in int count, 1059284555Sarybchik __out efx_oword_t *hash_low, 1060284555Sarybchik __out efx_oword_t *hash_high); 1061284555Sarybchik 1062293927Sarybchikextern __checkReturn efx_rc_t 1063227569Sphilipefx_phy_probe( 1064227569Sphilip __in efx_nic_t *enp); 1065227569Sphilip 1066227569Sphilipextern void 1067227569Sphilipefx_phy_unprobe( 1068227569Sphilip __in efx_nic_t *enp); 1069227569Sphilip 1070227569Sphilip#if EFSYS_OPT_VPD 1071227569Sphilip 1072227569Sphilip/* VPD utility functions */ 1073227569Sphilip 1074293927Sarybchikextern __checkReturn efx_rc_t 1075227569Sphilipefx_vpd_hunk_length( 1076227569Sphilip __in_bcount(size) caddr_t data, 1077227569Sphilip __in size_t size, 1078227569Sphilip __out size_t *lengthp); 1079227569Sphilip 1080293927Sarybchikextern __checkReturn efx_rc_t 1081227569Sphilipefx_vpd_hunk_verify( 1082227569Sphilip __in_bcount(size) caddr_t data, 1083227569Sphilip __in size_t size, 1084227569Sphilip __out_opt boolean_t *cksummedp); 1085227569Sphilip 1086293927Sarybchikextern __checkReturn efx_rc_t 1087227569Sphilipefx_vpd_hunk_reinit( 1088284555Sarybchik __in_bcount(size) caddr_t data, 1089227569Sphilip __in size_t size, 1090227569Sphilip __in boolean_t wantpid); 1091227569Sphilip 1092293927Sarybchikextern __checkReturn efx_rc_t 1093227569Sphilipefx_vpd_hunk_get( 1094227569Sphilip __in_bcount(size) caddr_t data, 1095227569Sphilip __in size_t size, 1096227569Sphilip __in efx_vpd_tag_t tag, 1097227569Sphilip __in efx_vpd_keyword_t keyword, 1098227569Sphilip __out unsigned int *payloadp, 1099227569Sphilip __out uint8_t *paylenp); 1100227569Sphilip 1101293927Sarybchikextern __checkReturn efx_rc_t 1102227569Sphilipefx_vpd_hunk_next( 1103227569Sphilip __in_bcount(size) caddr_t data, 1104227569Sphilip __in size_t size, 1105227569Sphilip __out efx_vpd_tag_t *tagp, 1106227569Sphilip __out efx_vpd_keyword_t *keyword, 1107294017Sarybchik __out_opt unsigned int *payloadp, 1108227569Sphilip __out_opt uint8_t *paylenp, 1109227569Sphilip __inout unsigned int *contp); 1110227569Sphilip 1111293927Sarybchikextern __checkReturn efx_rc_t 1112227569Sphilipefx_vpd_hunk_set( 1113227569Sphilip __in_bcount(size) caddr_t data, 1114227569Sphilip __in size_t size, 1115227569Sphilip __in efx_vpd_value_t *evvp); 1116227569Sphilip 1117227569Sphilip#endif /* EFSYS_OPT_VPD */ 1118227569Sphilip 1119284555Sarybchik#if EFSYS_OPT_MCDI 1120284555Sarybchik 1121293927Sarybchikextern __checkReturn efx_rc_t 1122284555Sarybchikefx_mcdi_set_workaround( 1123284555Sarybchik __in efx_nic_t *enp, 1124284555Sarybchik __in uint32_t type, 1125284555Sarybchik __in boolean_t enabled, 1126284555Sarybchik __out_opt uint32_t *flagsp); 1127284555Sarybchik 1128293927Sarybchikextern __checkReturn efx_rc_t 1129284555Sarybchikefx_mcdi_get_workarounds( 1130284555Sarybchik __in efx_nic_t *enp, 1131284555Sarybchik __out_opt uint32_t *implementedp, 1132284555Sarybchik __out_opt uint32_t *enabledp); 1133284555Sarybchik 1134284555Sarybchik#endif /* EFSYS_OPT_MCDI */ 1135284555Sarybchik 1136311080Sarybchik#if EFSYS_OPT_MAC_STATS 1137311080Sarybchik 1138311080Sarybchik/* 1139311080Sarybchik * Closed range of stats (i.e. the first and the last are included). 1140311080Sarybchik * The last must be greater or equal (if the range is one item only) to 1141311080Sarybchik * the first. 1142311080Sarybchik */ 1143311080Sarybchikstruct efx_mac_stats_range { 1144311080Sarybchik efx_mac_stat_t first; 1145311080Sarybchik efx_mac_stat_t last; 1146311080Sarybchik}; 1147311080Sarybchik 1148311080Sarybchikextern efx_rc_t 1149311080Sarybchikefx_mac_stats_mask_add_ranges( 1150311080Sarybchik __inout_bcount(mask_size) uint32_t *maskp, 1151311080Sarybchik __in size_t mask_size, 1152311080Sarybchik __in_ecount(rng_count) const struct efx_mac_stats_range *rngp, 1153311080Sarybchik __in unsigned int rng_count); 1154311080Sarybchik 1155311080Sarybchik#endif /* EFSYS_OPT_MAC_STATS */ 1156311080Sarybchik 1157227569Sphilip#ifdef __cplusplus 1158227569Sphilip} 1159227569Sphilip#endif 1160227569Sphilip 1161227569Sphilip#endif /* _SYS_EFX_IMPL_H */ 1162