1227569Sphilip/*- 2284555Sarybchik * Copyright (c) 2007-2015 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: releng/10.2/sys/dev/sfxge/common/efx_impl.h 284555 2015-06-18 15:46:39Z arybchik $ 31227569Sphilip */ 32227569Sphilip 33227569Sphilip#ifndef _SYS_EFX_IMPL_H 34227569Sphilip#define _SYS_EFX_IMPL_H 35227569Sphilip 36227569Sphilip#include "efsys.h" 37227569Sphilip#include "efx.h" 38227569Sphilip#include "efx_regs.h" 39284555Sarybchik#include "efx_regs_ef10.h" 40227569Sphilip 41284555Sarybchik/* FIXME: Add definition for driver generated software events */ 42284555Sarybchik#ifndef ESE_DZ_EV_CODE_DRV_GEN_EV 43284555Sarybchik#define ESE_DZ_EV_CODE_DRV_GEN_EV FSE_AZ_EV_CODE_DRV_GEN_EV 44284555Sarybchik#endif 45284555Sarybchik 46284555Sarybchik#include "efx_check.h" 47284555Sarybchik 48284555Sarybchik 49227569Sphilip#if EFSYS_OPT_FALCON 50227569Sphilip#include "falcon_impl.h" 51227569Sphilip#endif /* EFSYS_OPT_FALCON */ 52227569Sphilip 53227569Sphilip#if EFSYS_OPT_SIENA 54227569Sphilip#include "siena_impl.h" 55227569Sphilip#endif /* EFSYS_OPT_SIENA */ 56227569Sphilip 57284555Sarybchik#if EFSYS_OPT_HUNTINGTON 58284555Sarybchik#include "hunt_impl.h" 59284555Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 60284555Sarybchik 61227569Sphilip#ifdef __cplusplus 62227569Sphilipextern "C" { 63227569Sphilip#endif 64227569Sphilip 65284555Sarybchik#define EFX_MOD_MCDI 0x00000001 66284555Sarybchik#define EFX_MOD_PROBE 0x00000002 67284555Sarybchik#define EFX_MOD_NVRAM 0x00000004 68284555Sarybchik#define EFX_MOD_VPD 0x00000008 69284555Sarybchik#define EFX_MOD_NIC 0x00000010 70284555Sarybchik#define EFX_MOD_INTR 0x00000020 71284555Sarybchik#define EFX_MOD_EV 0x00000040 72284555Sarybchik#define EFX_MOD_RX 0x00000080 73284555Sarybchik#define EFX_MOD_TX 0x00000100 74284555Sarybchik#define EFX_MOD_PORT 0x00000200 75284555Sarybchik#define EFX_MOD_MON 0x00000400 76284555Sarybchik#define EFX_MOD_WOL 0x00000800 77284555Sarybchik#define EFX_MOD_FILTER 0x00001000 78284555Sarybchik#define EFX_MOD_PKTFILTER 0x00002000 79227569Sphilip 80284555Sarybchik#define EFX_RESET_MAC 0x00000001 81284555Sarybchik#define EFX_RESET_PHY 0x00000002 82284555Sarybchik#define EFX_RESET_RXQ_ERR 0x00000004 83284555Sarybchik#define EFX_RESET_TXQ_ERR 0x00000008 84227569Sphilip 85227569Sphiliptypedef enum efx_mac_type_e { 86227569Sphilip EFX_MAC_INVALID = 0, 87227569Sphilip EFX_MAC_FALCON_GMAC, 88227569Sphilip EFX_MAC_FALCON_XMAC, 89227569Sphilip EFX_MAC_SIENA, 90284555Sarybchik EFX_MAC_HUNTINGTON, 91227569Sphilip EFX_MAC_NTYPES 92227569Sphilip} efx_mac_type_t; 93227569Sphilip 94284555Sarybchiktypedef struct efx_ev_ops_s { 95284555Sarybchik int (*eevo_init)(efx_nic_t *); 96284555Sarybchik void (*eevo_fini)(efx_nic_t *); 97284555Sarybchik int (*eevo_qcreate)(efx_nic_t *, unsigned int, 98284555Sarybchik efsys_mem_t *, size_t, uint32_t, 99284555Sarybchik efx_evq_t *); 100284555Sarybchik void (*eevo_qdestroy)(efx_evq_t *); 101284555Sarybchik int (*eevo_qprime)(efx_evq_t *, unsigned int); 102284555Sarybchik void (*eevo_qpost)(efx_evq_t *, uint16_t); 103284555Sarybchik int (*eevo_qmoderate)(efx_evq_t *, unsigned int); 104284555Sarybchik#if EFSYS_OPT_QSTATS 105284555Sarybchik void (*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *); 106284555Sarybchik#endif 107284555Sarybchik} efx_ev_ops_t; 108284555Sarybchik 109284555Sarybchiktypedef struct efx_tx_ops_s { 110284555Sarybchik int (*etxo_init)(efx_nic_t *); 111284555Sarybchik void (*etxo_fini)(efx_nic_t *); 112284555Sarybchik int (*etxo_qcreate)(efx_nic_t *, 113284555Sarybchik unsigned int, unsigned int, 114284555Sarybchik efsys_mem_t *, size_t, 115284555Sarybchik uint32_t, uint16_t, 116284555Sarybchik efx_evq_t *, efx_txq_t *, 117284555Sarybchik unsigned int *); 118284555Sarybchik void (*etxo_qdestroy)(efx_txq_t *); 119284555Sarybchik int (*etxo_qpost)(efx_txq_t *, efx_buffer_t *, 120284555Sarybchik unsigned int, unsigned int, 121284555Sarybchik unsigned int *); 122284555Sarybchik void (*etxo_qpush)(efx_txq_t *, unsigned int, unsigned int); 123284555Sarybchik int (*etxo_qpace)(efx_txq_t *, unsigned int); 124284555Sarybchik int (*etxo_qflush)(efx_txq_t *); 125284555Sarybchik void (*etxo_qenable)(efx_txq_t *); 126284555Sarybchik int (*etxo_qpio_enable)(efx_txq_t *); 127284555Sarybchik void (*etxo_qpio_disable)(efx_txq_t *); 128284555Sarybchik int (*etxo_qpio_write)(efx_txq_t *,uint8_t *, size_t, 129284555Sarybchik size_t); 130284555Sarybchik int (*etxo_qpio_post)(efx_txq_t *, size_t, unsigned int, 131284555Sarybchik unsigned int *); 132284555Sarybchik int (*etxo_qdesc_post)(efx_txq_t *, efx_desc_t *, 133284555Sarybchik unsigned int, unsigned int, 134284555Sarybchik unsigned int *); 135284555Sarybchik void (*etxo_qdesc_dma_create)(efx_txq_t *, efsys_dma_addr_t, 136284555Sarybchik size_t, boolean_t, 137284555Sarybchik efx_desc_t *); 138284555Sarybchik void (*etxo_qdesc_tso_create)(efx_txq_t *, uint16_t, 139284555Sarybchik uint32_t, uint8_t, 140284555Sarybchik efx_desc_t *); 141284555Sarybchik void (*etxo_qdesc_vlantci_create)(efx_txq_t *, uint16_t, 142284555Sarybchik efx_desc_t *); 143284555Sarybchik#if EFSYS_OPT_QSTATS 144284555Sarybchik void (*etxo_qstats_update)(efx_txq_t *, 145284555Sarybchik efsys_stat_t *); 146284555Sarybchik#endif 147284555Sarybchik} efx_tx_ops_t; 148284555Sarybchik 149284555Sarybchiktypedef struct efx_rx_ops_s { 150284555Sarybchik int (*erxo_init)(efx_nic_t *); 151284555Sarybchik void (*erxo_fini)(efx_nic_t *); 152284555Sarybchik#if EFSYS_OPT_RX_HDR_SPLIT 153284555Sarybchik int (*erxo_hdr_split_enable)(efx_nic_t *, unsigned int, 154284555Sarybchik unsigned int); 155284555Sarybchik#endif 156284555Sarybchik#if EFSYS_OPT_RX_SCATTER 157284555Sarybchik int (*erxo_scatter_enable)(efx_nic_t *, unsigned int); 158284555Sarybchik#endif 159284555Sarybchik#if EFSYS_OPT_RX_SCALE 160284555Sarybchik int (*erxo_scale_mode_set)(efx_nic_t *, efx_rx_hash_alg_t, 161284555Sarybchik efx_rx_hash_type_t, boolean_t); 162284555Sarybchik int (*erxo_scale_key_set)(efx_nic_t *, uint8_t *, size_t); 163284555Sarybchik int (*erxo_scale_tbl_set)(efx_nic_t *, unsigned int *, 164284555Sarybchik size_t); 165284555Sarybchik#endif 166284555Sarybchik void (*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t, 167284555Sarybchik unsigned int, unsigned int, 168284555Sarybchik unsigned int); 169284555Sarybchik void (*erxo_qpush)(efx_rxq_t *, unsigned int, unsigned int *); 170284555Sarybchik int (*erxo_qflush)(efx_rxq_t *); 171284555Sarybchik void (*erxo_qenable)(efx_rxq_t *); 172284555Sarybchik int (*erxo_qcreate)(efx_nic_t *enp, unsigned int, 173284555Sarybchik unsigned int, efx_rxq_type_t, 174284555Sarybchik efsys_mem_t *, size_t, uint32_t, 175284555Sarybchik efx_evq_t *, efx_rxq_t *); 176284555Sarybchik void (*erxo_qdestroy)(efx_rxq_t *); 177284555Sarybchik} efx_rx_ops_t; 178284555Sarybchik 179227569Sphiliptypedef struct efx_mac_ops_s { 180227569Sphilip int (*emo_reset)(efx_nic_t *); /* optional */ 181227569Sphilip int (*emo_poll)(efx_nic_t *, efx_link_mode_t *); 182227569Sphilip int (*emo_up)(efx_nic_t *, boolean_t *); 183284555Sarybchik int (*emo_addr_set)(efx_nic_t *); 184227569Sphilip int (*emo_reconfigure)(efx_nic_t *); 185284555Sarybchik int (*emo_multicast_list_set)(efx_nic_t *); 186284555Sarybchik int (*emo_filter_default_rxq_set)(efx_nic_t *, 187284555Sarybchik efx_rxq_t *, boolean_t); 188284555Sarybchik void (*emo_filter_default_rxq_clear)(efx_nic_t *); 189227569Sphilip#if EFSYS_OPT_LOOPBACK 190227569Sphilip int (*emo_loopback_set)(efx_nic_t *, efx_link_mode_t, 191227569Sphilip efx_loopback_type_t); 192227569Sphilip#endif /* EFSYS_OPT_LOOPBACK */ 193227569Sphilip#if EFSYS_OPT_MAC_STATS 194227569Sphilip int (*emo_stats_upload)(efx_nic_t *, efsys_mem_t *); 195227569Sphilip int (*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *, 196227569Sphilip uint16_t, boolean_t); 197227569Sphilip int (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 198227569Sphilip efsys_stat_t *, uint32_t *); 199227569Sphilip#endif /* EFSYS_OPT_MAC_STATS */ 200227569Sphilip} efx_mac_ops_t; 201227569Sphilip 202227569Sphiliptypedef struct efx_phy_ops_s { 203227569Sphilip int (*epo_power)(efx_nic_t *, boolean_t); /* optional */ 204227569Sphilip int (*epo_reset)(efx_nic_t *); 205227569Sphilip int (*epo_reconfigure)(efx_nic_t *); 206227569Sphilip int (*epo_verify)(efx_nic_t *); 207227569Sphilip int (*epo_uplink_check)(efx_nic_t *, 208227569Sphilip boolean_t *); /* optional */ 209227569Sphilip int (*epo_downlink_check)(efx_nic_t *, efx_link_mode_t *, 210227569Sphilip unsigned int *, uint32_t *); 211227569Sphilip int (*epo_oui_get)(efx_nic_t *, uint32_t *); 212227569Sphilip#if EFSYS_OPT_PHY_STATS 213227569Sphilip int (*epo_stats_update)(efx_nic_t *, efsys_mem_t *, 214227569Sphilip uint32_t *); 215227569Sphilip#endif /* EFSYS_OPT_PHY_STATS */ 216227569Sphilip#if EFSYS_OPT_PHY_PROPS 217227569Sphilip#if EFSYS_OPT_NAMES 218284555Sarybchik const char *(*epo_prop_name)(efx_nic_t *, unsigned int); 219227569Sphilip#endif /* EFSYS_OPT_PHY_PROPS */ 220227569Sphilip int (*epo_prop_get)(efx_nic_t *, unsigned int, uint32_t, 221227569Sphilip uint32_t *); 222227569Sphilip int (*epo_prop_set)(efx_nic_t *, unsigned int, uint32_t); 223227569Sphilip#endif /* EFSYS_OPT_PHY_PROPS */ 224284555Sarybchik#if EFSYS_OPT_BIST 225284555Sarybchik int (*epo_bist_enable_offline)(efx_nic_t *); 226284555Sarybchik int (*epo_bist_start)(efx_nic_t *, efx_bist_type_t); 227284555Sarybchik int (*epo_bist_poll)(efx_nic_t *, efx_bist_type_t, 228284555Sarybchik efx_bist_result_t *, uint32_t *, 229227569Sphilip unsigned long *, size_t); 230284555Sarybchik void (*epo_bist_stop)(efx_nic_t *, efx_bist_type_t); 231284555Sarybchik#endif /* EFSYS_OPT_BIST */ 232227569Sphilip} efx_phy_ops_t; 233227569Sphilip 234284555Sarybchik#if EFSYS_OPT_FILTER 235284555Sarybchiktypedef struct efx_filter_ops_s { 236284555Sarybchik int (*efo_init)(efx_nic_t *); 237284555Sarybchik void (*efo_fini)(efx_nic_t *); 238284555Sarybchik int (*efo_restore)(efx_nic_t *); 239284555Sarybchik int (*efo_add)(efx_nic_t *, efx_filter_spec_t *, 240284555Sarybchik boolean_t may_replace); 241284555Sarybchik int (*efo_delete)(efx_nic_t *, efx_filter_spec_t *); 242284555Sarybchik int (*efo_supported_filters)(efx_nic_t *, uint32_t *, size_t *); 243284555Sarybchik int (*efo_reconfigure)(efx_nic_t *, uint8_t const *, boolean_t, 244284555Sarybchik boolean_t, boolean_t, boolean_t, 245284555Sarybchik uint8_t const *, int); 246284555Sarybchik} efx_filter_ops_t; 247284555Sarybchik 248284555Sarybchikextern __checkReturn int 249284555Sarybchikefx_filter_reconfigure( 250284555Sarybchik __in efx_nic_t *enp, 251284555Sarybchik __in_ecount(6) uint8_t const *mac_addr, 252284555Sarybchik __in boolean_t all_unicst, 253284555Sarybchik __in boolean_t mulcst, 254284555Sarybchik __in boolean_t all_mulcst, 255284555Sarybchik __in boolean_t brdcst, 256284555Sarybchik __in_ecount(6*count) uint8_t const *addrs, 257284555Sarybchik __in int count); 258284555Sarybchik 259284555Sarybchik#endif /* EFSYS_OPT_FILTER */ 260284555Sarybchik 261284555Sarybchiktypedef struct efx_pktfilter_ops_s { 262284555Sarybchik int (*epfo_set)(efx_nic_t *, 263284555Sarybchik boolean_t unicst, 264284555Sarybchik boolean_t brdcast); 265284555Sarybchik#if EFSYS_OPT_MCAST_FILTER_LIST 266284555Sarybchik int (*epfo_mcast_list_set)(efx_nic_t *, uint8_t const *addrs, int count); 267284555Sarybchik#endif /* EFSYS_OPT_MCAST_FILTER_LIST */ 268284555Sarybchik int (*epfo_mcast_all)(efx_nic_t *); 269284555Sarybchik} efx_pktfilter_ops_t; 270284555Sarybchik 271227569Sphiliptypedef struct efx_port_s { 272227569Sphilip efx_mac_type_t ep_mac_type; 273227569Sphilip uint32_t ep_phy_type; 274227569Sphilip uint8_t ep_port; 275227569Sphilip uint32_t ep_mac_pdu; 276227569Sphilip uint8_t ep_mac_addr[6]; 277227569Sphilip efx_link_mode_t ep_link_mode; 278284555Sarybchik boolean_t ep_all_unicst; 279284555Sarybchik boolean_t ep_mulcst; 280284555Sarybchik boolean_t ep_all_mulcst; 281227569Sphilip boolean_t ep_brdcst; 282227569Sphilip unsigned int ep_fcntl; 283227569Sphilip boolean_t ep_fcntl_autoneg; 284227569Sphilip efx_oword_t ep_multicst_hash[2]; 285284555Sarybchik uint8_t ep_mulcst_addr_list[EFX_MAC_ADDR_LEN * 286284555Sarybchik EFX_MAC_MULTICAST_LIST_MAX]; 287284555Sarybchik uint32_t ep_mulcst_addr_count; 288227569Sphilip#if EFSYS_OPT_LOOPBACK 289227569Sphilip efx_loopback_type_t ep_loopback_type; 290227569Sphilip efx_link_mode_t ep_loopback_link_mode; 291227569Sphilip#endif /* EFSYS_OPT_LOOPBACK */ 292227569Sphilip#if EFSYS_OPT_PHY_FLAGS 293227569Sphilip uint32_t ep_phy_flags; 294227569Sphilip#endif /* EFSYS_OPT_PHY_FLAGS */ 295227569Sphilip#if EFSYS_OPT_PHY_LED_CONTROL 296227569Sphilip efx_phy_led_mode_t ep_phy_led_mode; 297227569Sphilip#endif /* EFSYS_OPT_PHY_LED_CONTROL */ 298227569Sphilip efx_phy_media_type_t ep_fixed_port_type; 299227569Sphilip efx_phy_media_type_t ep_module_type; 300227569Sphilip uint32_t ep_adv_cap_mask; 301227569Sphilip uint32_t ep_lp_cap_mask; 302227569Sphilip uint32_t ep_default_adv_cap_mask; 303227569Sphilip uint32_t ep_phy_cap_mask; 304227569Sphilip#if EFSYS_OPT_PHY_TXC43128 || EFSYS_OPT_PHY_QT2025C 305227569Sphilip union { 306227569Sphilip struct { 307227569Sphilip unsigned int bug10934_count; 308227569Sphilip } ep_txc43128; 309227569Sphilip struct { 310227569Sphilip unsigned int bug17190_count; 311227569Sphilip } ep_qt2025c; 312227569Sphilip }; 313227569Sphilip#endif 314227569Sphilip boolean_t ep_mac_poll_needed; /* falcon only */ 315227569Sphilip boolean_t ep_mac_up; /* falcon only */ 316227569Sphilip uint32_t ep_fwver; /* falcon only */ 317227569Sphilip boolean_t ep_mac_drain; 318227569Sphilip boolean_t ep_mac_stats_pending; 319284555Sarybchik#if EFSYS_OPT_BIST 320284555Sarybchik efx_bist_type_t ep_current_bist; 321227569Sphilip#endif 322227569Sphilip efx_mac_ops_t *ep_emop; 323227569Sphilip efx_phy_ops_t *ep_epop; 324227569Sphilip} efx_port_t; 325227569Sphilip 326227569Sphiliptypedef struct efx_mon_ops_s { 327227569Sphilip int (*emo_reset)(efx_nic_t *); 328227569Sphilip int (*emo_reconfigure)(efx_nic_t *); 329227569Sphilip#if EFSYS_OPT_MON_STATS 330227569Sphilip int (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 331227569Sphilip efx_mon_stat_value_t *); 332227569Sphilip#endif /* EFSYS_OPT_MON_STATS */ 333227569Sphilip} efx_mon_ops_t; 334227569Sphilip 335227569Sphiliptypedef struct efx_mon_s { 336227569Sphilip efx_mon_type_t em_type; 337227569Sphilip efx_mon_ops_t *em_emop; 338227569Sphilip} efx_mon_t; 339227569Sphilip 340284555Sarybchiktypedef struct efx_intr_ops_s { 341284555Sarybchik int (*eio_init)(efx_nic_t *, efx_intr_type_t, efsys_mem_t *); 342284555Sarybchik void (*eio_enable)(efx_nic_t *); 343284555Sarybchik void (*eio_disable)(efx_nic_t *); 344284555Sarybchik void (*eio_disable_unlocked)(efx_nic_t *); 345284555Sarybchik int (*eio_trigger)(efx_nic_t *, unsigned int); 346284555Sarybchik void (*eio_fini)(efx_nic_t *); 347284555Sarybchik} efx_intr_ops_t; 348284555Sarybchik 349227569Sphiliptypedef struct efx_intr_s { 350284555Sarybchik efx_intr_ops_t *ei_eiop; 351284555Sarybchik efsys_mem_t *ei_esmp; 352227569Sphilip efx_intr_type_t ei_type; 353227569Sphilip unsigned int ei_level; 354227569Sphilip} efx_intr_t; 355227569Sphilip 356227569Sphiliptypedef struct efx_nic_ops_s { 357227569Sphilip int (*eno_probe)(efx_nic_t *); 358284555Sarybchik int (*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*); 359227569Sphilip int (*eno_reset)(efx_nic_t *); 360227569Sphilip int (*eno_init)(efx_nic_t *); 361284555Sarybchik int (*eno_get_vi_pool)(efx_nic_t *, uint32_t *); 362284555Sarybchik int (*eno_get_bar_region)(efx_nic_t *, efx_nic_region_t, 363284555Sarybchik uint32_t *, size_t *); 364227569Sphilip#if EFSYS_OPT_DIAG 365227569Sphilip int (*eno_sram_test)(efx_nic_t *, efx_sram_pattern_fn_t); 366227569Sphilip int (*eno_register_test)(efx_nic_t *); 367227569Sphilip#endif /* EFSYS_OPT_DIAG */ 368227569Sphilip void (*eno_fini)(efx_nic_t *); 369227569Sphilip void (*eno_unprobe)(efx_nic_t *); 370227569Sphilip} efx_nic_ops_t; 371227569Sphilip 372280562Sarybchik#ifndef EFX_TXQ_LIMIT_TARGET 373284555Sarybchik#define EFX_TXQ_LIMIT_TARGET 259 374280562Sarybchik#endif 375280562Sarybchik#ifndef EFX_RXQ_LIMIT_TARGET 376284555Sarybchik#define EFX_RXQ_LIMIT_TARGET 512 377280562Sarybchik#endif 378280562Sarybchik#ifndef EFX_TXQ_DC_SIZE 379284555Sarybchik#define EFX_TXQ_DC_SIZE 1 /* 16 descriptors */ 380280562Sarybchik#endif 381280562Sarybchik#ifndef EFX_RXQ_DC_SIZE 382284555Sarybchik#define EFX_RXQ_DC_SIZE 3 /* 64 descriptors */ 383280562Sarybchik#endif 384227569Sphilip 385227569Sphilip#if EFSYS_OPT_FILTER 386227569Sphilip 387284555Sarybchiktypedef struct falconsiena_filter_spec_s { 388284555Sarybchik uint8_t fsfs_type; 389284555Sarybchik uint32_t fsfs_flags; 390284555Sarybchik uint32_t fsfs_dmaq_id; 391284555Sarybchik uint32_t fsfs_dword[3]; 392284555Sarybchik} falconsiena_filter_spec_t; 393227569Sphilip 394284555Sarybchiktypedef enum falconsiena_filter_type_e { 395284555Sarybchik EFX_FS_FILTER_RX_TCP_FULL, /* TCP/IPv4 4-tuple {dIP,dTCP,sIP,sTCP} */ 396284555Sarybchik EFX_FS_FILTER_RX_TCP_WILD, /* TCP/IPv4 dest {dIP,dTCP, -, -} */ 397284555Sarybchik EFX_FS_FILTER_RX_UDP_FULL, /* UDP/IPv4 4-tuple {dIP,dUDP,sIP,sUDP} */ 398284555Sarybchik EFX_FS_FILTER_RX_UDP_WILD, /* UDP/IPv4 dest {dIP,dUDP, -, -} */ 399284555Sarybchik 400227569Sphilip#if EFSYS_OPT_SIENA 401284555Sarybchik EFX_FS_FILTER_RX_MAC_FULL, /* Ethernet {dMAC,VLAN} */ 402284555Sarybchik EFX_FS_FILTER_RX_MAC_WILD, /* Ethernet {dMAC, -} */ 403227569Sphilip 404284555Sarybchik EFX_FS_FILTER_TX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 405284555Sarybchik EFX_FS_FILTER_TX_TCP_WILD, /* TCP/IPv4 { -, -,sIP,sTCP} */ 406284555Sarybchik EFX_FS_FILTER_TX_UDP_FULL, /* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */ 407284555Sarybchik EFX_FS_FILTER_TX_UDP_WILD, /* UDP/IPv4 source (host, port) */ 408227569Sphilip 409284555Sarybchik EFX_FS_FILTER_TX_MAC_FULL, /* Ethernet source (MAC address, VLAN ID) */ 410284555Sarybchik EFX_FS_FILTER_TX_MAC_WILD, /* Ethernet source (MAC address) */ 411227569Sphilip#endif /* EFSYS_OPT_SIENA */ 412227569Sphilip 413284555Sarybchik EFX_FS_FILTER_NTYPES 414284555Sarybchik} falconsiena_filter_type_t; 415227569Sphilip 416284555Sarybchiktypedef enum falconsiena_filter_tbl_id_e { 417284555Sarybchik EFX_FS_FILTER_TBL_RX_IP = 0, 418284555Sarybchik EFX_FS_FILTER_TBL_RX_MAC, 419284555Sarybchik EFX_FS_FILTER_TBL_TX_IP, 420284555Sarybchik EFX_FS_FILTER_TBL_TX_MAC, 421284555Sarybchik EFX_FS_FILTER_NTBLS 422284555Sarybchik} falconsiena_filter_tbl_id_t; 423227569Sphilip 424284555Sarybchiktypedef struct falconsiena_filter_tbl_s { 425284555Sarybchik int fsft_size; /* number of entries */ 426284555Sarybchik int fsft_used; /* active count */ 427284555Sarybchik uint32_t *fsft_bitmap; /* active bitmap */ 428284555Sarybchik falconsiena_filter_spec_t *fsft_spec; /* array of saved specs */ 429284555Sarybchik} falconsiena_filter_tbl_t; 430227569Sphilip 431284555Sarybchiktypedef struct falconsiena_filter_s { 432284555Sarybchik falconsiena_filter_tbl_t fsf_tbl[EFX_FS_FILTER_NTBLS]; 433284555Sarybchik unsigned int fsf_depth[EFX_FS_FILTER_NTYPES]; 434284555Sarybchik} falconsiena_filter_t; 435284555Sarybchik 436227569Sphiliptypedef struct efx_filter_s { 437284555Sarybchik#if EFSYS_OPT_FALCON || EFSYS_OPT_SIENA 438284555Sarybchik falconsiena_filter_t *ef_falconsiena_filter; 439284555Sarybchik#endif /* EFSYS_OPT_FALCON || EFSYS_OPT_SIENA */ 440284555Sarybchik#if EFSYS_OPT_HUNTINGTON 441284555Sarybchik hunt_filter_table_t *ef_hunt_filter_table; 442284555Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 443227569Sphilip} efx_filter_t; 444227569Sphilip 445284555Sarybchikextern void 446284555Sarybchikfalconsiena_filter_tbl_clear( 447227569Sphilip __in efx_nic_t *enp, 448284555Sarybchik __in falconsiena_filter_tbl_id_t tbl); 449227569Sphilip 450284555Sarybchik#endif /* EFSYS_OPT_FILTER */ 451227569Sphilip 452284555Sarybchik#if EFSYS_OPT_MCDI 453227569Sphilip 454284555Sarybchiktypedef struct efx_mcdi_ops_s { 455284555Sarybchik int (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *); 456284555Sarybchik void (*emco_request_copyin)(efx_nic_t *, efx_mcdi_req_t *, 457284555Sarybchik unsigned int, boolean_t, boolean_t); 458284555Sarybchik boolean_t (*emco_request_poll)(efx_nic_t *); 459284555Sarybchik void (*emco_request_copyout)(efx_nic_t *, efx_mcdi_req_t *); 460284555Sarybchik int (*emco_poll_reboot)(efx_nic_t *); 461284555Sarybchik void (*emco_fini)(efx_nic_t *); 462284555Sarybchik int (*emco_fw_update_supported)(efx_nic_t *, boolean_t *); 463284555Sarybchik int (*emco_macaddr_change_supported)(efx_nic_t *, boolean_t *); 464284555Sarybchik} efx_mcdi_ops_t; 465227569Sphilip 466284555Sarybchiktypedef struct efx_mcdi_s { 467284555Sarybchik efx_mcdi_ops_t *em_emcop; 468284555Sarybchik const efx_mcdi_transport_t *em_emtp; 469284555Sarybchik efx_mcdi_iface_t em_emip; 470284555Sarybchik} efx_mcdi_t; 471227569Sphilip 472284555Sarybchik#endif /* EFSYS_OPT_MCDI */ 473227569Sphilip 474227569Sphilip#if EFSYS_OPT_NVRAM 475227569Sphiliptypedef struct efx_nvram_ops_s { 476227569Sphilip#if EFSYS_OPT_DIAG 477227569Sphilip int (*envo_test)(efx_nic_t *); 478227569Sphilip#endif /* EFSYS_OPT_DIAG */ 479227569Sphilip int (*envo_size)(efx_nic_t *, efx_nvram_type_t, size_t *); 480227569Sphilip int (*envo_get_version)(efx_nic_t *, efx_nvram_type_t, 481227569Sphilip uint32_t *, uint16_t *); 482227569Sphilip int (*envo_rw_start)(efx_nic_t *, efx_nvram_type_t, size_t *); 483227569Sphilip int (*envo_read_chunk)(efx_nic_t *, efx_nvram_type_t, 484227569Sphilip unsigned int, caddr_t, size_t); 485227569Sphilip int (*envo_erase)(efx_nic_t *, efx_nvram_type_t); 486227569Sphilip int (*envo_write_chunk)(efx_nic_t *, efx_nvram_type_t, 487227569Sphilip unsigned int, caddr_t, size_t); 488227569Sphilip void (*envo_rw_finish)(efx_nic_t *, efx_nvram_type_t); 489227569Sphilip int (*envo_set_version)(efx_nic_t *, efx_nvram_type_t, uint16_t *); 490227569Sphilip 491227569Sphilip} efx_nvram_ops_t; 492227569Sphilip#endif /* EFSYS_OPT_NVRAM */ 493227569Sphilip 494227569Sphilip#if EFSYS_OPT_VPD 495227569Sphiliptypedef struct efx_vpd_ops_s { 496227569Sphilip int (*evpdo_init)(efx_nic_t *); 497227569Sphilip int (*evpdo_size)(efx_nic_t *, size_t *); 498227569Sphilip int (*evpdo_read)(efx_nic_t *, caddr_t, size_t); 499227569Sphilip int (*evpdo_verify)(efx_nic_t *, caddr_t, size_t); 500227569Sphilip int (*evpdo_reinit)(efx_nic_t *, caddr_t, size_t); 501227569Sphilip int (*evpdo_get)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *); 502227569Sphilip int (*evpdo_set)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *); 503227569Sphilip int (*evpdo_next)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *, 504227569Sphilip unsigned int *); 505227569Sphilip int (*evpdo_write)(efx_nic_t *, caddr_t, size_t); 506227569Sphilip void (*evpdo_fini)(efx_nic_t *); 507227569Sphilip} efx_vpd_ops_t; 508227569Sphilip#endif /* EFSYS_OPT_VPD */ 509227569Sphilip 510284555Sarybchik#if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM 511284555Sarybchik 512284555Sarybchik __checkReturn int 513284555Sarybchikefx_mcdi_nvram_partitions( 514284555Sarybchik __in efx_nic_t *enp, 515284555Sarybchik __out_bcount(size) caddr_t data, 516284555Sarybchik __in size_t size, 517284555Sarybchik __out unsigned int *npartnp); 518284555Sarybchik 519284555Sarybchik __checkReturn int 520284555Sarybchikefx_mcdi_nvram_metadata( 521284555Sarybchik __in efx_nic_t *enp, 522284555Sarybchik __in uint32_t partn, 523284555Sarybchik __out uint32_t *subtypep, 524284555Sarybchik __out_ecount(4) uint16_t version[4], 525284555Sarybchik __out_bcount_opt(size) char *descp, 526284555Sarybchik __in size_t size); 527284555Sarybchik 528284555Sarybchik __checkReturn int 529284555Sarybchikefx_mcdi_nvram_info( 530284555Sarybchik __in efx_nic_t *enp, 531284555Sarybchik __in uint32_t partn, 532284555Sarybchik __out_opt size_t *sizep, 533284555Sarybchik __out_opt uint32_t *addressp, 534284555Sarybchik __out_opt uint32_t *erase_sizep); 535284555Sarybchik 536284555Sarybchik __checkReturn int 537284555Sarybchikefx_mcdi_nvram_update_start( 538284555Sarybchik __in efx_nic_t *enp, 539284555Sarybchik __in uint32_t partn); 540284555Sarybchik 541284555Sarybchik __checkReturn int 542284555Sarybchikefx_mcdi_nvram_read( 543284555Sarybchik __in efx_nic_t *enp, 544284555Sarybchik __in uint32_t partn, 545284555Sarybchik __in uint32_t offset, 546284555Sarybchik __out_bcount(size) caddr_t data, 547284555Sarybchik __in size_t size); 548284555Sarybchik 549284555Sarybchik __checkReturn int 550284555Sarybchikefx_mcdi_nvram_erase( 551284555Sarybchik __in efx_nic_t *enp, 552284555Sarybchik __in uint32_t partn, 553284555Sarybchik __in uint32_t offset, 554284555Sarybchik __in size_t size); 555284555Sarybchik 556284555Sarybchik __checkReturn int 557284555Sarybchikefx_mcdi_nvram_write( 558284555Sarybchik __in efx_nic_t *enp, 559284555Sarybchik __in uint32_t partn, 560284555Sarybchik __in uint32_t offset, 561284555Sarybchik __out_bcount(size) caddr_t data, 562284555Sarybchik __in size_t size); 563284555Sarybchik 564284555Sarybchik __checkReturn int 565284555Sarybchikefx_mcdi_nvram_update_finish( 566284555Sarybchik __in efx_nic_t *enp, 567284555Sarybchik __in uint32_t partn, 568284555Sarybchik __in boolean_t reboot); 569284555Sarybchik 570284555Sarybchik#if EFSYS_OPT_DIAG 571284555Sarybchik 572284555Sarybchik __checkReturn int 573284555Sarybchikefx_mcdi_nvram_test( 574284555Sarybchik __in efx_nic_t *enp, 575284555Sarybchik __in uint32_t partn); 576284555Sarybchik 577284555Sarybchik#endif /* EFSYS_OPT_DIAG */ 578284555Sarybchik 579284555Sarybchik#endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */ 580284555Sarybchik 581284555Sarybchiktypedef struct efx_drv_cfg_s { 582284555Sarybchik uint32_t edc_min_vi_count; 583284555Sarybchik uint32_t edc_max_vi_count; 584284555Sarybchik 585284555Sarybchik uint32_t edc_max_piobuf_count; 586284555Sarybchik uint32_t edc_pio_alloc_size; 587284555Sarybchik} efx_drv_cfg_t; 588284555Sarybchik 589227569Sphilipstruct efx_nic_s { 590227569Sphilip uint32_t en_magic; 591227569Sphilip efx_family_t en_family; 592227569Sphilip uint32_t en_features; 593227569Sphilip efsys_identifier_t *en_esip; 594227569Sphilip efsys_lock_t *en_eslp; 595227569Sphilip efsys_bar_t *en_esbp; 596227569Sphilip unsigned int en_mod_flags; 597227569Sphilip unsigned int en_reset_flags; 598227569Sphilip efx_nic_cfg_t en_nic_cfg; 599284555Sarybchik efx_drv_cfg_t en_drv_cfg; 600227569Sphilip efx_port_t en_port; 601227569Sphilip efx_mon_t en_mon; 602227569Sphilip efx_intr_t en_intr; 603227569Sphilip uint32_t en_ev_qcount; 604227569Sphilip uint32_t en_rx_qcount; 605227569Sphilip uint32_t en_tx_qcount; 606227569Sphilip efx_nic_ops_t *en_enop; 607284555Sarybchik efx_ev_ops_t *en_eevop; 608284555Sarybchik efx_tx_ops_t *en_etxop; 609284555Sarybchik efx_rx_ops_t *en_erxop; 610227569Sphilip#if EFSYS_OPT_FILTER 611227569Sphilip efx_filter_t en_filter; 612284555Sarybchik efx_filter_ops_t *en_efop; 613227569Sphilip#endif /* EFSYS_OPT_FILTER */ 614284555Sarybchik efx_pktfilter_ops_t *en_epfop; 615284555Sarybchik#if EFSYS_OPT_MCDI 616284555Sarybchik efx_mcdi_t en_mcdi; 617284555Sarybchik#endif /* EFSYS_OPT_MCDI */ 618227569Sphilip#if EFSYS_OPT_NVRAM 619227569Sphilip efx_nvram_type_t en_nvram_locked; 620227569Sphilip efx_nvram_ops_t *en_envop; 621227569Sphilip#endif /* EFSYS_OPT_NVRAM */ 622227569Sphilip#if EFSYS_OPT_VPD 623227569Sphilip efx_vpd_ops_t *en_evpdop; 624227569Sphilip#endif /* EFSYS_OPT_VPD */ 625284555Sarybchik#if EFSYS_OPT_RX_SCALE 626284555Sarybchik efx_rx_hash_support_t en_hash_support; 627284555Sarybchik efx_rx_scale_support_t en_rss_support; 628284555Sarybchik uint32_t en_rss_context; 629284555Sarybchik#endif /* EFSYS_OPT_RX_SCALE */ 630284555Sarybchik uint32_t en_vport_id; 631227569Sphilip union { 632227569Sphilip#if EFSYS_OPT_FALCON 633227569Sphilip struct { 634227569Sphilip falcon_spi_dev_t enu_fsd[FALCON_SPI_NTYPES]; 635227569Sphilip falcon_i2c_t enu_fip; 636227569Sphilip boolean_t enu_i2c_locked; 637227569Sphilip#if EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE 638227569Sphilip const uint8_t *enu_forced_cfg; 639227569Sphilip#endif /* EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE */ 640227569Sphilip uint8_t enu_mon_devid; 641227569Sphilip#if EFSYS_OPT_PCIE_TUNE 642227569Sphilip unsigned int enu_nlanes; 643227569Sphilip#endif /* EFSYS_OPT_PCIE_TUNE */ 644227569Sphilip uint16_t enu_board_rev; 645227569Sphilip boolean_t enu_internal_sram; 646227569Sphilip uint8_t enu_sram_num_bank; 647227569Sphilip uint8_t enu_sram_bank_size; 648227569Sphilip } falcon; 649227569Sphilip#endif /* EFSYS_OPT_FALCON */ 650227569Sphilip#if EFSYS_OPT_SIENA 651227569Sphilip struct { 652227569Sphilip#if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 653227569Sphilip unsigned int enu_partn_mask; 654227569Sphilip#endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 655227569Sphilip#if EFSYS_OPT_VPD 656227569Sphilip caddr_t enu_svpd; 657227569Sphilip size_t enu_svpd_length; 658227569Sphilip#endif /* EFSYS_OPT_VPD */ 659284555Sarybchik int enu_unused; 660227569Sphilip } siena; 661227569Sphilip#endif /* EFSYS_OPT_SIENA */ 662284555Sarybchik#if EFSYS_OPT_HUNTINGTON 663284555Sarybchik struct { 664284555Sarybchik int enu_vi_base; 665284555Sarybchik int enu_vi_count; 666284555Sarybchik#if EFSYS_OPT_VPD 667284555Sarybchik caddr_t enu_svpd; 668284555Sarybchik size_t enu_svpd_length; 669284555Sarybchik#endif /* EFSYS_OPT_VPD */ 670284555Sarybchik efx_piobuf_handle_t enu_piobuf_handle[HUNT_PIOBUF_NBUFS]; 671284555Sarybchik uint32_t enu_piobuf_count; 672284555Sarybchik uint32_t enu_pio_alloc_map[HUNT_PIOBUF_NBUFS]; 673284555Sarybchik uint32_t enu_pio_write_vi_base; 674284555Sarybchik /* Memory BAR mapping regions */ 675284555Sarybchik uint32_t enu_uc_mem_map_offset; 676284555Sarybchik size_t enu_uc_mem_map_size; 677284555Sarybchik uint32_t enu_wc_mem_map_offset; 678284555Sarybchik size_t enu_wc_mem_map_size; 679284555Sarybchik } hunt; 680284555Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 681227569Sphilip } en_u; 682227569Sphilip}; 683227569Sphilip 684227569Sphilip 685227569Sphilip#define EFX_NIC_MAGIC 0x02121996 686227569Sphilip 687227569Sphiliptypedef boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *, 688227569Sphilip const efx_ev_callbacks_t *, void *); 689227569Sphilip 690284555Sarybchiktypedef struct efx_evq_rxq_state_s { 691284555Sarybchik unsigned int eers_rx_read_ptr; 692284555Sarybchik unsigned int eers_rx_mask; 693284555Sarybchik} efx_evq_rxq_state_t; 694284555Sarybchik 695227569Sphilipstruct efx_evq_s { 696227569Sphilip uint32_t ee_magic; 697227569Sphilip efx_nic_t *ee_enp; 698227569Sphilip unsigned int ee_index; 699227569Sphilip unsigned int ee_mask; 700227569Sphilip efsys_mem_t *ee_esmp; 701227569Sphilip#if EFSYS_OPT_QSTATS 702227569Sphilip uint32_t ee_stat[EV_NQSTATS]; 703227569Sphilip#endif /* EFSYS_OPT_QSTATS */ 704284555Sarybchik 705284555Sarybchik efx_ev_handler_t ee_rx; 706284555Sarybchik efx_ev_handler_t ee_tx; 707284555Sarybchik efx_ev_handler_t ee_driver; 708284555Sarybchik efx_ev_handler_t ee_global; 709284555Sarybchik efx_ev_handler_t ee_drv_gen; 710284555Sarybchik#if EFSYS_OPT_MCDI 711284555Sarybchik efx_ev_handler_t ee_mcdi; 712284555Sarybchik#endif /* EFSYS_OPT_MCDI */ 713284555Sarybchik 714284555Sarybchik efx_evq_rxq_state_t ee_rxq_state[EFX_EV_RX_NLABELS]; 715227569Sphilip}; 716227569Sphilip 717227569Sphilip#define EFX_EVQ_MAGIC 0x08081997 718227569Sphilip 719280588Sarybchik#define EFX_EVQ_FALCON_TIMER_QUANTUM_NS 4968 /* 621 cycles */ 720280588Sarybchik#define EFX_EVQ_SIENA_TIMER_QUANTUM_NS 6144 /* 768 cycles */ 721227569Sphilip 722227569Sphilipstruct efx_rxq_s { 723227569Sphilip uint32_t er_magic; 724227569Sphilip efx_nic_t *er_enp; 725284555Sarybchik efx_evq_t *er_eep; 726227569Sphilip unsigned int er_index; 727284555Sarybchik unsigned int er_label; 728227569Sphilip unsigned int er_mask; 729227569Sphilip efsys_mem_t *er_esmp; 730227569Sphilip}; 731227569Sphilip 732227569Sphilip#define EFX_RXQ_MAGIC 0x15022005 733227569Sphilip 734227569Sphilipstruct efx_txq_s { 735227569Sphilip uint32_t et_magic; 736227569Sphilip efx_nic_t *et_enp; 737227569Sphilip unsigned int et_index; 738227569Sphilip unsigned int et_mask; 739227569Sphilip efsys_mem_t *et_esmp; 740284555Sarybchik#if EFSYS_OPT_HUNTINGTON 741284555Sarybchik uint32_t et_pio_bufnum; 742284555Sarybchik uint32_t et_pio_blknum; 743284555Sarybchik uint32_t et_pio_write_offset; 744284555Sarybchik uint32_t et_pio_offset; 745284555Sarybchik size_t et_pio_size; 746284555Sarybchik#endif 747227569Sphilip#if EFSYS_OPT_QSTATS 748227569Sphilip uint32_t et_stat[TX_NQSTATS]; 749227569Sphilip#endif /* EFSYS_OPT_QSTATS */ 750227569Sphilip}; 751227569Sphilip 752227569Sphilip#define EFX_TXQ_MAGIC 0x05092005 753227569Sphilip 754227569Sphilip#define EFX_MAC_ADDR_COPY(_dst, _src) \ 755227569Sphilip do { \ 756227569Sphilip (_dst)[0] = (_src)[0]; \ 757227569Sphilip (_dst)[1] = (_src)[1]; \ 758227569Sphilip (_dst)[2] = (_src)[2]; \ 759227569Sphilip (_dst)[3] = (_src)[3]; \ 760227569Sphilip (_dst)[4] = (_src)[4]; \ 761227569Sphilip (_dst)[5] = (_src)[5]; \ 762227569Sphilip _NOTE(CONSTANTCONDITION) \ 763227569Sphilip } while (B_FALSE) 764227569Sphilip 765284555Sarybchik#define EFX_MAC_BROADCAST_ADDR_SET(_dst) \ 766284555Sarybchik do { \ 767284555Sarybchik uint16_t *_d = (uint16_t *)(_dst); \ 768284555Sarybchik _d[0] = 0xffff; \ 769284555Sarybchik _d[1] = 0xffff; \ 770284555Sarybchik _d[2] = 0xffff; \ 771284555Sarybchik _NOTE(CONSTANTCONDITION) \ 772284555Sarybchik } while (B_FALSE) 773284555Sarybchik 774227569Sphilip#if EFSYS_OPT_CHECK_REG 775227569Sphilip#define EFX_CHECK_REG(_enp, _reg) \ 776227569Sphilip do { \ 777284555Sarybchik const char *name = #_reg; \ 778227569Sphilip char min = name[4]; \ 779227569Sphilip char max = name[5]; \ 780227569Sphilip char rev; \ 781227569Sphilip \ 782227569Sphilip switch ((_enp)->en_family) { \ 783227569Sphilip case EFX_FAMILY_FALCON: \ 784227569Sphilip rev = 'B'; \ 785227569Sphilip break; \ 786227569Sphilip \ 787227569Sphilip case EFX_FAMILY_SIENA: \ 788227569Sphilip rev = 'C'; \ 789227569Sphilip break; \ 790227569Sphilip \ 791284555Sarybchik case EFX_FAMILY_HUNTINGTON: \ 792284555Sarybchik rev = 'D'; \ 793284555Sarybchik break; \ 794284555Sarybchik \ 795227569Sphilip default: \ 796227569Sphilip rev = '?'; \ 797227569Sphilip break; \ 798227569Sphilip } \ 799227569Sphilip \ 800227569Sphilip EFSYS_ASSERT3S(rev, >=, min); \ 801227569Sphilip EFSYS_ASSERT3S(rev, <=, max); \ 802227569Sphilip \ 803227569Sphilip _NOTE(CONSTANTCONDITION) \ 804227569Sphilip } while (B_FALSE) 805227569Sphilip#else 806227569Sphilip#define EFX_CHECK_REG(_enp, _reg) do { \ 807227569Sphilip _NOTE(CONSTANTCONDITION) \ 808227569Sphilip } while(B_FALSE) 809227569Sphilip#endif 810227569Sphilip 811227569Sphilip#define EFX_BAR_READD(_enp, _reg, _edp, _lock) \ 812227569Sphilip do { \ 813227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 814227569Sphilip EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST, \ 815227569Sphilip (_edp), (_lock)); \ 816227569Sphilip EFSYS_PROBE3(efx_bar_readd, const char *, #_reg, \ 817227569Sphilip uint32_t, _reg ## _OFST, \ 818227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 819227569Sphilip _NOTE(CONSTANTCONDITION) \ 820227569Sphilip } while (B_FALSE) 821227569Sphilip 822227569Sphilip#define EFX_BAR_WRITED(_enp, _reg, _edp, _lock) \ 823227569Sphilip do { \ 824227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 825227569Sphilip EFSYS_PROBE3(efx_bar_writed, const char *, #_reg, \ 826227569Sphilip uint32_t, _reg ## _OFST, \ 827227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 828227569Sphilip EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST, \ 829227569Sphilip (_edp), (_lock)); \ 830227569Sphilip _NOTE(CONSTANTCONDITION) \ 831227569Sphilip } while (B_FALSE) 832227569Sphilip 833227569Sphilip#define EFX_BAR_READQ(_enp, _reg, _eqp) \ 834227569Sphilip do { \ 835227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 836227569Sphilip EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST, \ 837227569Sphilip (_eqp)); \ 838227569Sphilip EFSYS_PROBE4(efx_bar_readq, const char *, #_reg, \ 839227569Sphilip uint32_t, _reg ## _OFST, \ 840227569Sphilip uint32_t, (_eqp)->eq_u32[1], \ 841227569Sphilip uint32_t, (_eqp)->eq_u32[0]); \ 842227569Sphilip _NOTE(CONSTANTCONDITION) \ 843227569Sphilip } while (B_FALSE) 844227569Sphilip 845227569Sphilip#define EFX_BAR_WRITEQ(_enp, _reg, _eqp) \ 846227569Sphilip do { \ 847227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 848227569Sphilip EFSYS_PROBE4(efx_bar_writeq, const char *, #_reg, \ 849227569Sphilip uint32_t, _reg ## _OFST, \ 850227569Sphilip uint32_t, (_eqp)->eq_u32[1], \ 851227569Sphilip uint32_t, (_eqp)->eq_u32[0]); \ 852227569Sphilip EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST, \ 853227569Sphilip (_eqp)); \ 854227569Sphilip _NOTE(CONSTANTCONDITION) \ 855227569Sphilip } while (B_FALSE) 856227569Sphilip 857227569Sphilip#define EFX_BAR_READO(_enp, _reg, _eop) \ 858227569Sphilip do { \ 859227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 860227569Sphilip EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST, \ 861227569Sphilip (_eop), B_TRUE); \ 862227569Sphilip EFSYS_PROBE6(efx_bar_reado, const char *, #_reg, \ 863227569Sphilip uint32_t, _reg ## _OFST, \ 864227569Sphilip uint32_t, (_eop)->eo_u32[3], \ 865227569Sphilip uint32_t, (_eop)->eo_u32[2], \ 866227569Sphilip uint32_t, (_eop)->eo_u32[1], \ 867227569Sphilip uint32_t, (_eop)->eo_u32[0]); \ 868227569Sphilip _NOTE(CONSTANTCONDITION) \ 869227569Sphilip } while (B_FALSE) 870227569Sphilip 871227569Sphilip#define EFX_BAR_WRITEO(_enp, _reg, _eop) \ 872227569Sphilip do { \ 873227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 874227569Sphilip EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg, \ 875227569Sphilip uint32_t, _reg ## _OFST, \ 876227569Sphilip uint32_t, (_eop)->eo_u32[3], \ 877227569Sphilip uint32_t, (_eop)->eo_u32[2], \ 878227569Sphilip uint32_t, (_eop)->eo_u32[1], \ 879227569Sphilip uint32_t, (_eop)->eo_u32[0]); \ 880227569Sphilip EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST, \ 881227569Sphilip (_eop), B_TRUE); \ 882227569Sphilip _NOTE(CONSTANTCONDITION) \ 883227569Sphilip } while (B_FALSE) 884227569Sphilip 885227569Sphilip#define EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock) \ 886227569Sphilip do { \ 887227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 888227569Sphilip EFSYS_BAR_READD((_enp)->en_esbp, \ 889227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 890227569Sphilip (_edp), (_lock)); \ 891227569Sphilip EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg, \ 892227569Sphilip uint32_t, (_index), \ 893227569Sphilip uint32_t, _reg ## _OFST, \ 894227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 895227569Sphilip _NOTE(CONSTANTCONDITION) \ 896227569Sphilip } while (B_FALSE) 897227569Sphilip 898227569Sphilip#define EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock) \ 899227569Sphilip do { \ 900227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 901227569Sphilip EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 902227569Sphilip uint32_t, (_index), \ 903227569Sphilip uint32_t, _reg ## _OFST, \ 904227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 905227569Sphilip EFSYS_BAR_WRITED((_enp)->en_esbp, \ 906227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 907227569Sphilip (_edp), (_lock)); \ 908227569Sphilip _NOTE(CONSTANTCONDITION) \ 909227569Sphilip } while (B_FALSE) 910227569Sphilip 911284555Sarybchik#define EFX_BAR_TBL_WRITED2(_enp, _reg, _index, _edp, _lock) \ 912284555Sarybchik do { \ 913284555Sarybchik EFX_CHECK_REG((_enp), (_reg)); \ 914284555Sarybchik EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 915284555Sarybchik uint32_t, (_index), \ 916284555Sarybchik uint32_t, _reg ## _OFST, \ 917284555Sarybchik uint32_t, (_edp)->ed_u32[0]); \ 918284555Sarybchik EFSYS_BAR_WRITED((_enp)->en_esbp, \ 919284555Sarybchik (_reg ## _OFST + \ 920284555Sarybchik (2 * sizeof (efx_dword_t)) + \ 921284555Sarybchik ((_index) * _reg ## _STEP)), \ 922284555Sarybchik (_edp), (_lock)); \ 923284555Sarybchik _NOTE(CONSTANTCONDITION) \ 924284555Sarybchik } while (B_FALSE) 925284555Sarybchik 926227569Sphilip#define EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock) \ 927227569Sphilip do { \ 928227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 929227569Sphilip EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 930227569Sphilip uint32_t, (_index), \ 931227569Sphilip uint32_t, _reg ## _OFST, \ 932227569Sphilip uint32_t, (_edp)->ed_u32[0]); \ 933227569Sphilip EFSYS_BAR_WRITED((_enp)->en_esbp, \ 934227569Sphilip (_reg ## _OFST + \ 935227569Sphilip (3 * sizeof (efx_dword_t)) + \ 936227569Sphilip ((_index) * _reg ## _STEP)), \ 937227569Sphilip (_edp), (_lock)); \ 938227569Sphilip _NOTE(CONSTANTCONDITION) \ 939227569Sphilip } while (B_FALSE) 940227569Sphilip 941227569Sphilip#define EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp) \ 942227569Sphilip do { \ 943227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 944227569Sphilip EFSYS_BAR_READQ((_enp)->en_esbp, \ 945227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 946227569Sphilip (_eqp)); \ 947227569Sphilip EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg, \ 948227569Sphilip uint32_t, (_index), \ 949227569Sphilip uint32_t, _reg ## _OFST, \ 950227569Sphilip uint32_t, (_eqp)->eq_u32[1], \ 951227569Sphilip uint32_t, (_eqp)->eq_u32[0]); \ 952227569Sphilip _NOTE(CONSTANTCONDITION) \ 953227569Sphilip } while (B_FALSE) 954227569Sphilip 955227569Sphilip#define EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp) \ 956227569Sphilip do { \ 957227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 958227569Sphilip EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg, \ 959227569Sphilip uint32_t, (_index), \ 960227569Sphilip uint32_t, _reg ## _OFST, \ 961227569Sphilip uint32_t, (_eqp)->eq_u32[1], \ 962227569Sphilip uint32_t, (_eqp)->eq_u32[0]); \ 963227569Sphilip EFSYS_BAR_WRITEQ((_enp)->en_esbp, \ 964227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 965227569Sphilip (_eqp)); \ 966227569Sphilip _NOTE(CONSTANTCONDITION) \ 967227569Sphilip } while (B_FALSE) 968227569Sphilip 969284555Sarybchik#define EFX_BAR_TBL_READO(_enp, _reg, _index, _eop, _lock) \ 970227569Sphilip do { \ 971227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 972227569Sphilip EFSYS_BAR_READO((_enp)->en_esbp, \ 973227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 974284555Sarybchik (_eop), (_lock)); \ 975227569Sphilip EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg, \ 976227569Sphilip uint32_t, (_index), \ 977227569Sphilip uint32_t, _reg ## _OFST, \ 978227569Sphilip uint32_t, (_eop)->eo_u32[3], \ 979227569Sphilip uint32_t, (_eop)->eo_u32[2], \ 980227569Sphilip uint32_t, (_eop)->eo_u32[1], \ 981227569Sphilip uint32_t, (_eop)->eo_u32[0]); \ 982227569Sphilip _NOTE(CONSTANTCONDITION) \ 983227569Sphilip } while (B_FALSE) 984227569Sphilip 985284555Sarybchik#define EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop, _lock) \ 986227569Sphilip do { \ 987227569Sphilip EFX_CHECK_REG((_enp), (_reg)); \ 988227569Sphilip EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg, \ 989227569Sphilip uint32_t, (_index), \ 990227569Sphilip uint32_t, _reg ## _OFST, \ 991227569Sphilip uint32_t, (_eop)->eo_u32[3], \ 992227569Sphilip uint32_t, (_eop)->eo_u32[2], \ 993227569Sphilip uint32_t, (_eop)->eo_u32[1], \ 994227569Sphilip uint32_t, (_eop)->eo_u32[0]); \ 995227569Sphilip EFSYS_BAR_WRITEO((_enp)->en_esbp, \ 996227569Sphilip (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 997284555Sarybchik (_eop), (_lock)); \ 998227569Sphilip _NOTE(CONSTANTCONDITION) \ 999227569Sphilip } while (B_FALSE) 1000227569Sphilip 1001284555Sarybchik/* 1002284555Sarybchik * Allow drivers to perform optimised 128-bit doorbell writes. 1003284555Sarybchik * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are 1004284555Sarybchik * special-cased in the BIU on the Falcon/Siena and EF10 architectures to avoid 1005284555Sarybchik * the need for locking in the host, and are the only ones known to be safe to 1006284555Sarybchik * use 128-bites write with. 1007284555Sarybchik */ 1008284555Sarybchik#define EFX_BAR_TBL_DOORBELL_WRITEO(_enp, _reg, _index, _eop) \ 1009284555Sarybchik do { \ 1010284555Sarybchik EFX_CHECK_REG((_enp), (_reg)); \ 1011284555Sarybchik EFSYS_PROBE7(efx_bar_tbl_doorbell_writeo, \ 1012284555Sarybchik const char *, \ 1013284555Sarybchik #_reg, \ 1014284555Sarybchik uint32_t, (_index), \ 1015284555Sarybchik uint32_t, _reg ## _OFST, \ 1016284555Sarybchik uint32_t, (_eop)->eo_u32[3], \ 1017284555Sarybchik uint32_t, (_eop)->eo_u32[2], \ 1018284555Sarybchik uint32_t, (_eop)->eo_u32[1], \ 1019284555Sarybchik uint32_t, (_eop)->eo_u32[0]); \ 1020284555Sarybchik EFSYS_BAR_DOORBELL_WRITEO((_enp)->en_esbp, \ 1021284555Sarybchik (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 1022284555Sarybchik (_eop)); \ 1023284555Sarybchik _NOTE(CONSTANTCONDITION) \ 1024284555Sarybchik } while (B_FALSE) 1025284555Sarybchik 1026284555Sarybchik#define EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _wptr, _owptr) \ 1027284555Sarybchik do { \ 1028284555Sarybchik unsigned int _new = (_wptr); \ 1029284555Sarybchik unsigned int _old = (_owptr); \ 1030284555Sarybchik \ 1031284555Sarybchik if ((_new) >= (_old)) \ 1032284555Sarybchik EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 1033284555Sarybchik (_old) * sizeof (efx_desc_t), \ 1034284555Sarybchik ((_new) - (_old)) * sizeof (efx_desc_t)); \ 1035284555Sarybchik else \ 1036284555Sarybchik /* \ 1037284555Sarybchik * It is cheaper to sync entire map than sync \ 1038284555Sarybchik * two parts especially when offset/size are \ 1039284555Sarybchik * ignored and entire map is synced in any case.\ 1040284555Sarybchik */ \ 1041284555Sarybchik EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 1042284555Sarybchik 0, \ 1043284555Sarybchik (_entries) * sizeof (efx_desc_t)); \ 1044284555Sarybchik _NOTE(CONSTANTCONDITION) \ 1045284555Sarybchik } while (B_FALSE) 1046284555Sarybchik 1047227569Sphilipextern __checkReturn int 1048284555Sarybchikefx_nic_biu_test( 1049284555Sarybchik __in efx_nic_t *enp); 1050284555Sarybchik 1051284555Sarybchikextern __checkReturn int 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 1062227569Sphilipextern __checkReturn int 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 1074227569Sphilipextern __checkReturn int 1075227569Sphilipefx_vpd_hunk_length( 1076227569Sphilip __in_bcount(size) caddr_t data, 1077227569Sphilip __in size_t size, 1078227569Sphilip __out size_t *lengthp); 1079227569Sphilip 1080227569Sphilipextern __checkReturn int 1081227569Sphilipefx_vpd_hunk_verify( 1082227569Sphilip __in_bcount(size) caddr_t data, 1083227569Sphilip __in size_t size, 1084227569Sphilip __out_opt boolean_t *cksummedp); 1085227569Sphilip 1086227569Sphilipextern __checkReturn int 1087227569Sphilipefx_vpd_hunk_reinit( 1088284555Sarybchik __in_bcount(size) caddr_t data, 1089227569Sphilip __in size_t size, 1090227569Sphilip __in boolean_t wantpid); 1091227569Sphilip 1092227569Sphilipextern __checkReturn int 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 1101227569Sphilipextern __checkReturn int 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, 1107227569Sphilip __out_bcount_opt(*paylenp) unsigned int *payloadp, 1108227569Sphilip __out_opt uint8_t *paylenp, 1109227569Sphilip __inout unsigned int *contp); 1110227569Sphilip 1111227569Sphilipextern __checkReturn int 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 1119227569Sphilip#if EFSYS_OPT_DIAG 1120227569Sphilip 1121284555Sarybchikextern efx_sram_pattern_fn_t __efx_sram_pattern_fns[]; 1122227569Sphilip 1123227569Sphiliptypedef struct efx_register_set_s { 1124227569Sphilip unsigned int address; 1125227569Sphilip unsigned int step; 1126227569Sphilip unsigned int rows; 1127227569Sphilip efx_oword_t mask; 1128227569Sphilip} efx_register_set_t; 1129227569Sphilip 1130227569Sphilipextern __checkReturn int 1131227569Sphilipefx_nic_test_registers( 1132227569Sphilip __in efx_nic_t *enp, 1133227569Sphilip __in efx_register_set_t *rsp, 1134227569Sphilip __in size_t count); 1135227569Sphilip 1136227569Sphilipextern __checkReturn int 1137227569Sphilipefx_nic_test_tables( 1138227569Sphilip __in efx_nic_t *enp, 1139227569Sphilip __in efx_register_set_t *rsp, 1140227569Sphilip __in efx_pattern_type_t pattern, 1141227569Sphilip __in size_t count); 1142227569Sphilip 1143227569Sphilip#endif /* EFSYS_OPT_DIAG */ 1144227569Sphilip 1145284555Sarybchik#if EFSYS_OPT_MCDI 1146284555Sarybchik 1147284555Sarybchikextern __checkReturn int 1148284555Sarybchikefx_mcdi_set_workaround( 1149284555Sarybchik __in efx_nic_t *enp, 1150284555Sarybchik __in uint32_t type, 1151284555Sarybchik __in boolean_t enabled, 1152284555Sarybchik __out_opt uint32_t *flagsp); 1153284555Sarybchik 1154284555Sarybchikextern __checkReturn int 1155284555Sarybchikefx_mcdi_get_workarounds( 1156284555Sarybchik __in efx_nic_t *enp, 1157284555Sarybchik __out_opt uint32_t *implementedp, 1158284555Sarybchik __out_opt uint32_t *enabledp); 1159284555Sarybchik 1160284555Sarybchik#endif /* EFSYS_OPT_MCDI */ 1161284555Sarybchik 1162227569Sphilip#ifdef __cplusplus 1163227569Sphilip} 1164227569Sphilip#endif 1165227569Sphilip 1166227569Sphilip#endif /* _SYS_EFX_IMPL_H */ 1167