1e948693eSPhilip Paeps /*- 2e948693eSPhilip Paeps * Copyright 2007-2009 Solarflare Communications Inc. All rights reserved. 3e948693eSPhilip Paeps * 4e948693eSPhilip Paeps * Redistribution and use in source and binary forms, with or without 5e948693eSPhilip Paeps * modification, are permitted provided that the following conditions 6e948693eSPhilip Paeps * are met: 7e948693eSPhilip Paeps * 1. Redistributions of source code must retain the above copyright 8e948693eSPhilip Paeps * notice, this list of conditions and the following disclaimer. 9e948693eSPhilip Paeps * 2. Redistributions in binary form must reproduce the above copyright 10e948693eSPhilip Paeps * notice, this list of conditions and the following disclaimer in the 11e948693eSPhilip Paeps * documentation and/or other materials provided with the distribution. 12e948693eSPhilip Paeps * 13e948693eSPhilip Paeps * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND 14e948693eSPhilip Paeps * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15e948693eSPhilip Paeps * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16e948693eSPhilip Paeps * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17e948693eSPhilip Paeps * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18e948693eSPhilip Paeps * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19e948693eSPhilip Paeps * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20e948693eSPhilip Paeps * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21e948693eSPhilip Paeps * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22e948693eSPhilip Paeps * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23e948693eSPhilip Paeps * SUCH DAMAGE. 245dee87d7SPhilip Paeps * 255dee87d7SPhilip Paeps * $FreeBSD$ 26e948693eSPhilip Paeps */ 27e948693eSPhilip Paeps 28e948693eSPhilip Paeps #ifndef _SYS_EFX_IMPL_H 29e948693eSPhilip Paeps #define _SYS_EFX_IMPL_H 30e948693eSPhilip Paeps 31e948693eSPhilip Paeps #include "efsys.h" 32e948693eSPhilip Paeps #include "efx.h" 33e948693eSPhilip Paeps #include "efx_regs.h" 34e948693eSPhilip Paeps 35e948693eSPhilip Paeps #if EFSYS_OPT_FALCON 36e948693eSPhilip Paeps #include "falcon_impl.h" 37e948693eSPhilip Paeps #endif /* EFSYS_OPT_FALCON */ 38e948693eSPhilip Paeps 39e948693eSPhilip Paeps #if EFSYS_OPT_SIENA 40e948693eSPhilip Paeps #include "siena_impl.h" 41e948693eSPhilip Paeps #endif /* EFSYS_OPT_SIENA */ 42e948693eSPhilip Paeps 43e948693eSPhilip Paeps #ifdef __cplusplus 44e948693eSPhilip Paeps extern "C" { 45e948693eSPhilip Paeps #endif 46e948693eSPhilip Paeps 47e948693eSPhilip Paeps #define EFX_MOD_MCDI 0x00000001 48e948693eSPhilip Paeps #define EFX_MOD_PROBE 0x00000002 49e948693eSPhilip Paeps #define EFX_MOD_NVRAM 0x00000004 50e948693eSPhilip Paeps #define EFX_MOD_VPD 0x00000008 51e948693eSPhilip Paeps #define EFX_MOD_NIC 0x00000010 52e948693eSPhilip Paeps #define EFX_MOD_INTR 0x00000020 53e948693eSPhilip Paeps #define EFX_MOD_EV 0x00000040 54e948693eSPhilip Paeps #define EFX_MOD_RX 0x00000080 55e948693eSPhilip Paeps #define EFX_MOD_TX 0x00000100 56e948693eSPhilip Paeps #define EFX_MOD_PORT 0x00000200 57e948693eSPhilip Paeps #define EFX_MOD_MON 0x00000400 58e948693eSPhilip Paeps #define EFX_MOD_WOL 0x00000800 59e948693eSPhilip Paeps #define EFX_MOD_FILTER 0x00001000 60e948693eSPhilip Paeps 61e948693eSPhilip Paeps #define EFX_RESET_MAC 0x00000001 62e948693eSPhilip Paeps #define EFX_RESET_PHY 0x00000002 63e948693eSPhilip Paeps 64e948693eSPhilip Paeps typedef enum efx_mac_type_e { 65e948693eSPhilip Paeps EFX_MAC_INVALID = 0, 66e948693eSPhilip Paeps EFX_MAC_FALCON_GMAC, 67e948693eSPhilip Paeps EFX_MAC_FALCON_XMAC, 68e948693eSPhilip Paeps EFX_MAC_SIENA, 69e948693eSPhilip Paeps EFX_MAC_NTYPES 70e948693eSPhilip Paeps } efx_mac_type_t; 71e948693eSPhilip Paeps 72e948693eSPhilip Paeps typedef struct efx_mac_ops_s { 73e948693eSPhilip Paeps int (*emo_reset)(efx_nic_t *); /* optional */ 74e948693eSPhilip Paeps int (*emo_poll)(efx_nic_t *, efx_link_mode_t *); 75e948693eSPhilip Paeps int (*emo_up)(efx_nic_t *, boolean_t *); 76e948693eSPhilip Paeps int (*emo_reconfigure)(efx_nic_t *); 77e948693eSPhilip Paeps #if EFSYS_OPT_LOOPBACK 78e948693eSPhilip Paeps int (*emo_loopback_set)(efx_nic_t *, efx_link_mode_t, 79e948693eSPhilip Paeps efx_loopback_type_t); 80e948693eSPhilip Paeps #endif /* EFSYS_OPT_LOOPBACK */ 81e948693eSPhilip Paeps #if EFSYS_OPT_MAC_STATS 82e948693eSPhilip Paeps int (*emo_stats_upload)(efx_nic_t *, efsys_mem_t *); 83e948693eSPhilip Paeps int (*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *, 84e948693eSPhilip Paeps uint16_t, boolean_t); 85e948693eSPhilip Paeps int (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 86e948693eSPhilip Paeps efsys_stat_t *, uint32_t *); 87e948693eSPhilip Paeps #endif /* EFSYS_OPT_MAC_STATS */ 88e948693eSPhilip Paeps } efx_mac_ops_t; 89e948693eSPhilip Paeps 90e948693eSPhilip Paeps typedef struct efx_phy_ops_s { 91e948693eSPhilip Paeps int (*epo_power)(efx_nic_t *, boolean_t); /* optional */ 92e948693eSPhilip Paeps int (*epo_reset)(efx_nic_t *); 93e948693eSPhilip Paeps int (*epo_reconfigure)(efx_nic_t *); 94e948693eSPhilip Paeps int (*epo_verify)(efx_nic_t *); 95e948693eSPhilip Paeps int (*epo_uplink_check)(efx_nic_t *, 96e948693eSPhilip Paeps boolean_t *); /* optional */ 97e948693eSPhilip Paeps int (*epo_downlink_check)(efx_nic_t *, efx_link_mode_t *, 98e948693eSPhilip Paeps unsigned int *, uint32_t *); 99e948693eSPhilip Paeps int (*epo_oui_get)(efx_nic_t *, uint32_t *); 100e948693eSPhilip Paeps #if EFSYS_OPT_PHY_STATS 101e948693eSPhilip Paeps int (*epo_stats_update)(efx_nic_t *, efsys_mem_t *, 102e948693eSPhilip Paeps uint32_t *); 103e948693eSPhilip Paeps #endif /* EFSYS_OPT_PHY_STATS */ 104e948693eSPhilip Paeps #if EFSYS_OPT_PHY_PROPS 105e948693eSPhilip Paeps #if EFSYS_OPT_NAMES 106e948693eSPhilip Paeps const char __cs *(*epo_prop_name)(efx_nic_t *, unsigned int); 107e948693eSPhilip Paeps #endif /* EFSYS_OPT_PHY_PROPS */ 108e948693eSPhilip Paeps int (*epo_prop_get)(efx_nic_t *, unsigned int, uint32_t, 109e948693eSPhilip Paeps uint32_t *); 110e948693eSPhilip Paeps int (*epo_prop_set)(efx_nic_t *, unsigned int, uint32_t); 111e948693eSPhilip Paeps #endif /* EFSYS_OPT_PHY_PROPS */ 112e948693eSPhilip Paeps #if EFSYS_OPT_PHY_BIST 113e948693eSPhilip Paeps int (*epo_bist_start)(efx_nic_t *, efx_phy_bist_type_t); 114e948693eSPhilip Paeps int (*epo_bist_poll)(efx_nic_t *, efx_phy_bist_type_t, 115e948693eSPhilip Paeps efx_phy_bist_result_t *, uint32_t *, 116e948693eSPhilip Paeps unsigned long *, size_t); 117e948693eSPhilip Paeps void (*epo_bist_stop)(efx_nic_t *, efx_phy_bist_type_t); 118e948693eSPhilip Paeps #endif /* EFSYS_OPT_PHY_BIST */ 119e948693eSPhilip Paeps } efx_phy_ops_t; 120e948693eSPhilip Paeps 121e948693eSPhilip Paeps typedef struct efx_port_s { 122e948693eSPhilip Paeps efx_mac_type_t ep_mac_type; 123e948693eSPhilip Paeps uint32_t ep_phy_type; 124e948693eSPhilip Paeps uint8_t ep_port; 125e948693eSPhilip Paeps uint32_t ep_mac_pdu; 126e948693eSPhilip Paeps uint8_t ep_mac_addr[6]; 127e948693eSPhilip Paeps efx_link_mode_t ep_link_mode; 128e948693eSPhilip Paeps boolean_t ep_unicst; 129e948693eSPhilip Paeps boolean_t ep_brdcst; 130e948693eSPhilip Paeps unsigned int ep_fcntl; 131e948693eSPhilip Paeps boolean_t ep_fcntl_autoneg; 132e948693eSPhilip Paeps efx_oword_t ep_multicst_hash[2]; 133e948693eSPhilip Paeps #if EFSYS_OPT_LOOPBACK 134e948693eSPhilip Paeps efx_loopback_type_t ep_loopback_type; 135e948693eSPhilip Paeps efx_link_mode_t ep_loopback_link_mode; 136e948693eSPhilip Paeps #endif /* EFSYS_OPT_LOOPBACK */ 137e948693eSPhilip Paeps #if EFSYS_OPT_PHY_FLAGS 138e948693eSPhilip Paeps uint32_t ep_phy_flags; 139e948693eSPhilip Paeps #endif /* EFSYS_OPT_PHY_FLAGS */ 140e948693eSPhilip Paeps #if EFSYS_OPT_PHY_LED_CONTROL 141e948693eSPhilip Paeps efx_phy_led_mode_t ep_phy_led_mode; 142e948693eSPhilip Paeps #endif /* EFSYS_OPT_PHY_LED_CONTROL */ 143e948693eSPhilip Paeps efx_phy_media_type_t ep_fixed_port_type; 144e948693eSPhilip Paeps efx_phy_media_type_t ep_module_type; 145e948693eSPhilip Paeps uint32_t ep_adv_cap_mask; 146e948693eSPhilip Paeps uint32_t ep_lp_cap_mask; 147e948693eSPhilip Paeps uint32_t ep_default_adv_cap_mask; 148e948693eSPhilip Paeps uint32_t ep_phy_cap_mask; 149e948693eSPhilip Paeps #if EFSYS_OPT_PHY_TXC43128 || EFSYS_OPT_PHY_QT2025C 150e948693eSPhilip Paeps union { 151e948693eSPhilip Paeps struct { 152e948693eSPhilip Paeps unsigned int bug10934_count; 153e948693eSPhilip Paeps } ep_txc43128; 154e948693eSPhilip Paeps struct { 155e948693eSPhilip Paeps unsigned int bug17190_count; 156e948693eSPhilip Paeps } ep_qt2025c; 157e948693eSPhilip Paeps }; 158e948693eSPhilip Paeps #endif 159e948693eSPhilip Paeps boolean_t ep_mac_poll_needed; /* falcon only */ 160e948693eSPhilip Paeps boolean_t ep_mac_up; /* falcon only */ 161e948693eSPhilip Paeps uint32_t ep_fwver; /* falcon only */ 162e948693eSPhilip Paeps boolean_t ep_mac_drain; 163e948693eSPhilip Paeps boolean_t ep_mac_stats_pending; 164e948693eSPhilip Paeps #if EFSYS_OPT_PHY_BIST 165e948693eSPhilip Paeps efx_phy_bist_type_t ep_current_bist; 166e948693eSPhilip Paeps #endif 167e948693eSPhilip Paeps efx_mac_ops_t *ep_emop; 168e948693eSPhilip Paeps efx_phy_ops_t *ep_epop; 169e948693eSPhilip Paeps } efx_port_t; 170e948693eSPhilip Paeps 171e948693eSPhilip Paeps typedef struct efx_mon_ops_s { 172e948693eSPhilip Paeps int (*emo_reset)(efx_nic_t *); 173e948693eSPhilip Paeps int (*emo_reconfigure)(efx_nic_t *); 174e948693eSPhilip Paeps #if EFSYS_OPT_MON_STATS 175e948693eSPhilip Paeps int (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 176e948693eSPhilip Paeps efx_mon_stat_value_t *); 177e948693eSPhilip Paeps #endif /* EFSYS_OPT_MON_STATS */ 178e948693eSPhilip Paeps } efx_mon_ops_t; 179e948693eSPhilip Paeps 180e948693eSPhilip Paeps typedef struct efx_mon_s { 181e948693eSPhilip Paeps efx_mon_type_t em_type; 182e948693eSPhilip Paeps efx_mon_ops_t *em_emop; 183e948693eSPhilip Paeps } efx_mon_t; 184e948693eSPhilip Paeps 185e948693eSPhilip Paeps typedef struct efx_intr_s { 186e948693eSPhilip Paeps efx_intr_type_t ei_type; 187e948693eSPhilip Paeps efsys_mem_t *ei_esmp; 188e948693eSPhilip Paeps unsigned int ei_level; 189e948693eSPhilip Paeps } efx_intr_t; 190e948693eSPhilip Paeps 191e948693eSPhilip Paeps typedef struct efx_nic_ops_s { 192e948693eSPhilip Paeps int (*eno_probe)(efx_nic_t *); 193e948693eSPhilip Paeps int (*eno_reset)(efx_nic_t *); 194e948693eSPhilip Paeps int (*eno_init)(efx_nic_t *); 195e948693eSPhilip Paeps #if EFSYS_OPT_DIAG 196e948693eSPhilip Paeps int (*eno_sram_test)(efx_nic_t *, efx_sram_pattern_fn_t); 197e948693eSPhilip Paeps int (*eno_register_test)(efx_nic_t *); 198e948693eSPhilip Paeps #endif /* EFSYS_OPT_DIAG */ 199e948693eSPhilip Paeps void (*eno_fini)(efx_nic_t *); 200e948693eSPhilip Paeps void (*eno_unprobe)(efx_nic_t *); 201e948693eSPhilip Paeps } efx_nic_ops_t; 202e948693eSPhilip Paeps 2039ab060a7SAndrew Rybchenko #ifndef EFX_TXQ_LIMIT_TARGET 204e948693eSPhilip Paeps # define EFX_TXQ_LIMIT_TARGET 259 2059ab060a7SAndrew Rybchenko #endif 2069ab060a7SAndrew Rybchenko #ifndef EFX_RXQ_LIMIT_TARGET 207e948693eSPhilip Paeps # define EFX_RXQ_LIMIT_TARGET 768 2089ab060a7SAndrew Rybchenko #endif 2099ab060a7SAndrew Rybchenko #ifndef EFX_TXQ_DC_SIZE 2109ab060a7SAndrew Rybchenko #define EFX_TXQ_DC_SIZE 1 /* 16 descriptors */ 2119ab060a7SAndrew Rybchenko #endif 2129ab060a7SAndrew Rybchenko #ifndef EFX_RXQ_DC_SIZE 2139ab060a7SAndrew Rybchenko #define EFX_RXQ_DC_SIZE 3 /* 64 descriptors */ 2149ab060a7SAndrew Rybchenko #endif 215e948693eSPhilip Paeps 216e948693eSPhilip Paeps #if EFSYS_OPT_FILTER 217e948693eSPhilip Paeps 218e948693eSPhilip Paeps typedef enum efx_filter_type_e { 219e948693eSPhilip Paeps EFX_FILTER_RX_TCP_FULL, /* TCP/IPv4 4-tuple {dIP,dTCP,sIP,sTCP} */ 220e948693eSPhilip Paeps EFX_FILTER_RX_TCP_WILD, /* TCP/IPv4 dest {dIP,dTCP, -, -} */ 221e948693eSPhilip Paeps EFX_FILTER_RX_UDP_FULL, /* UDP/IPv4 4-tuple {dIP,dUDP,sIP,sUDP} */ 222e948693eSPhilip Paeps EFX_FILTER_RX_UDP_WILD, /* UDP/IPv4 dest {dIP,dUDP, -, -} */ 223e948693eSPhilip Paeps 224e948693eSPhilip Paeps #if EFSYS_OPT_SIENA 225e948693eSPhilip Paeps EFX_FILTER_RX_MAC_FULL, /* Ethernet {dMAC,VLAN} */ 226e948693eSPhilip Paeps EFX_FILTER_RX_MAC_WILD, /* Ethernet {dMAC, -} */ 227e948693eSPhilip Paeps 228e948693eSPhilip Paeps EFX_FILTER_TX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 229e948693eSPhilip Paeps EFX_FILTER_TX_TCP_WILD, /* TCP/IPv4 { -, -,sIP,sTCP} */ 230e948693eSPhilip Paeps EFX_FILTER_TX_UDP_FULL, /* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */ 231e948693eSPhilip Paeps EFX_FILTER_TX_UDP_WILD, /* UDP/IPv4 source (host, port) */ 232e948693eSPhilip Paeps 233e948693eSPhilip Paeps EFX_FILTER_TX_MAC_FULL, /* Ethernet source (MAC address, VLAN ID) */ 234e948693eSPhilip Paeps EFX_FILTER_TX_MAC_WILD, /* Ethernet source (MAC address) */ 235e948693eSPhilip Paeps #endif /* EFSYS_OPT_SIENA */ 236e948693eSPhilip Paeps 237e948693eSPhilip Paeps EFX_FILTER_NTYPES 238e948693eSPhilip Paeps } efx_filter_type_t; 239e948693eSPhilip Paeps 240e948693eSPhilip Paeps typedef enum efx_filter_tbl_id_e { 241e948693eSPhilip Paeps EFX_FILTER_TBL_RX_IP = 0, 242e948693eSPhilip Paeps EFX_FILTER_TBL_RX_MAC, 243e948693eSPhilip Paeps EFX_FILTER_TBL_TX_IP, 244e948693eSPhilip Paeps EFX_FILTER_TBL_TX_MAC, 245e948693eSPhilip Paeps EFX_FILTER_NTBLS 246e948693eSPhilip Paeps } efx_filter_tbl_id_t; 247e948693eSPhilip Paeps 248e948693eSPhilip Paeps typedef struct efx_filter_tbl_s { 249e948693eSPhilip Paeps int eft_size; /* number of entries */ 250e948693eSPhilip Paeps int eft_used; /* active count */ 251e948693eSPhilip Paeps uint32_t *eft_bitmap; /* active bitmap */ 252e948693eSPhilip Paeps efx_filter_spec_t *eft_spec; /* array of saved specs */ 253e948693eSPhilip Paeps } efx_filter_tbl_t; 254e948693eSPhilip Paeps 255e948693eSPhilip Paeps typedef struct efx_filter_s { 256e948693eSPhilip Paeps efx_filter_tbl_t ef_tbl[EFX_FILTER_NTBLS]; 257e948693eSPhilip Paeps unsigned int ef_depth[EFX_FILTER_NTYPES]; 258e948693eSPhilip Paeps } efx_filter_t; 259e948693eSPhilip Paeps 260e948693eSPhilip Paeps 261e948693eSPhilip Paeps extern __checkReturn int 262e948693eSPhilip Paeps efx_filter_insert_filter( 263e948693eSPhilip Paeps __in efx_nic_t *enp, 264e948693eSPhilip Paeps __in efx_filter_spec_t *spec, 265e948693eSPhilip Paeps __in boolean_t replace); 266e948693eSPhilip Paeps 267e948693eSPhilip Paeps extern __checkReturn int 268e948693eSPhilip Paeps efx_filter_remove_filter( 269e948693eSPhilip Paeps __in efx_nic_t *enp, 270e948693eSPhilip Paeps __in efx_filter_spec_t *spec); 271e948693eSPhilip Paeps 272e948693eSPhilip Paeps extern void 273e948693eSPhilip Paeps efx_filter_remove_index( 274e948693eSPhilip Paeps __inout efx_nic_t *enp, 275e948693eSPhilip Paeps __in efx_filter_type_t type, 276e948693eSPhilip Paeps __in int filter_idx); 277e948693eSPhilip Paeps 278e948693eSPhilip Paeps extern void 279e948693eSPhilip Paeps efx_filter_redirect_index( 280e948693eSPhilip Paeps __inout efx_nic_t *enp, 281e948693eSPhilip Paeps __in efx_filter_type_t type, 282e948693eSPhilip Paeps __in int filter_index, 283e948693eSPhilip Paeps __in int rxq_index); 284e948693eSPhilip Paeps 285e948693eSPhilip Paeps extern __checkReturn int 286e948693eSPhilip Paeps efx_filter_clear_tbl( 287e948693eSPhilip Paeps __in efx_nic_t *enp, 288e948693eSPhilip Paeps __in efx_filter_tbl_id_t tbl); 289e948693eSPhilip Paeps 290e948693eSPhilip Paeps #endif /* EFSYS_OPT_FILTER */ 291e948693eSPhilip Paeps 292e948693eSPhilip Paeps #if EFSYS_OPT_NVRAM 293e948693eSPhilip Paeps typedef struct efx_nvram_ops_s { 294e948693eSPhilip Paeps #if EFSYS_OPT_DIAG 295e948693eSPhilip Paeps int (*envo_test)(efx_nic_t *); 296e948693eSPhilip Paeps #endif /* EFSYS_OPT_DIAG */ 297e948693eSPhilip Paeps int (*envo_size)(efx_nic_t *, efx_nvram_type_t, size_t *); 298e948693eSPhilip Paeps int (*envo_get_version)(efx_nic_t *, efx_nvram_type_t, 299e948693eSPhilip Paeps uint32_t *, uint16_t *); 300e948693eSPhilip Paeps int (*envo_rw_start)(efx_nic_t *, efx_nvram_type_t, size_t *); 301e948693eSPhilip Paeps int (*envo_read_chunk)(efx_nic_t *, efx_nvram_type_t, 302e948693eSPhilip Paeps unsigned int, caddr_t, size_t); 303e948693eSPhilip Paeps int (*envo_erase)(efx_nic_t *, efx_nvram_type_t); 304e948693eSPhilip Paeps int (*envo_write_chunk)(efx_nic_t *, efx_nvram_type_t, 305e948693eSPhilip Paeps unsigned int, caddr_t, size_t); 306e948693eSPhilip Paeps void (*envo_rw_finish)(efx_nic_t *, efx_nvram_type_t); 307e948693eSPhilip Paeps int (*envo_set_version)(efx_nic_t *, efx_nvram_type_t, uint16_t *); 308e948693eSPhilip Paeps 309e948693eSPhilip Paeps } efx_nvram_ops_t; 310e948693eSPhilip Paeps #endif /* EFSYS_OPT_NVRAM */ 311e948693eSPhilip Paeps 312e948693eSPhilip Paeps #if EFSYS_OPT_VPD 313e948693eSPhilip Paeps typedef struct efx_vpd_ops_s { 314e948693eSPhilip Paeps int (*evpdo_init)(efx_nic_t *); 315e948693eSPhilip Paeps int (*evpdo_size)(efx_nic_t *, size_t *); 316e948693eSPhilip Paeps int (*evpdo_read)(efx_nic_t *, caddr_t, size_t); 317e948693eSPhilip Paeps int (*evpdo_verify)(efx_nic_t *, caddr_t, size_t); 318e948693eSPhilip Paeps int (*evpdo_reinit)(efx_nic_t *, caddr_t, size_t); 319e948693eSPhilip Paeps int (*evpdo_get)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *); 320e948693eSPhilip Paeps int (*evpdo_set)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *); 321e948693eSPhilip Paeps int (*evpdo_next)(efx_nic_t *, caddr_t, size_t, efx_vpd_value_t *, 322e948693eSPhilip Paeps unsigned int *); 323e948693eSPhilip Paeps int (*evpdo_write)(efx_nic_t *, caddr_t, size_t); 324e948693eSPhilip Paeps void (*evpdo_fini)(efx_nic_t *); 325e948693eSPhilip Paeps } efx_vpd_ops_t; 326e948693eSPhilip Paeps #endif /* EFSYS_OPT_VPD */ 327e948693eSPhilip Paeps 328e948693eSPhilip Paeps struct efx_nic_s { 329e948693eSPhilip Paeps uint32_t en_magic; 330e948693eSPhilip Paeps efx_family_t en_family; 331e948693eSPhilip Paeps uint32_t en_features; 332e948693eSPhilip Paeps efsys_identifier_t *en_esip; 333e948693eSPhilip Paeps efsys_lock_t *en_eslp; 334e948693eSPhilip Paeps efsys_bar_t *en_esbp; 335e948693eSPhilip Paeps unsigned int en_mod_flags; 336e948693eSPhilip Paeps unsigned int en_reset_flags; 337e948693eSPhilip Paeps efx_nic_cfg_t en_nic_cfg; 338e948693eSPhilip Paeps efx_port_t en_port; 339e948693eSPhilip Paeps efx_mon_t en_mon; 340e948693eSPhilip Paeps efx_intr_t en_intr; 341e948693eSPhilip Paeps uint32_t en_ev_qcount; 342e948693eSPhilip Paeps uint32_t en_rx_qcount; 343e948693eSPhilip Paeps uint32_t en_tx_qcount; 344e948693eSPhilip Paeps efx_nic_ops_t *en_enop; 345e948693eSPhilip Paeps #if EFSYS_OPT_FILTER 346e948693eSPhilip Paeps efx_filter_t en_filter; 347e948693eSPhilip Paeps #endif /* EFSYS_OPT_FILTER */ 348e948693eSPhilip Paeps #if EFSYS_OPT_NVRAM 349e948693eSPhilip Paeps efx_nvram_type_t en_nvram_locked; 350e948693eSPhilip Paeps efx_nvram_ops_t *en_envop; 351e948693eSPhilip Paeps #endif /* EFSYS_OPT_NVRAM */ 352e948693eSPhilip Paeps #if EFSYS_OPT_VPD 353e948693eSPhilip Paeps efx_vpd_ops_t *en_evpdop; 354e948693eSPhilip Paeps #endif /* EFSYS_OPT_VPD */ 355e948693eSPhilip Paeps union { 356e948693eSPhilip Paeps #if EFSYS_OPT_FALCON 357e948693eSPhilip Paeps struct { 358e948693eSPhilip Paeps falcon_spi_dev_t enu_fsd[FALCON_SPI_NTYPES]; 359e948693eSPhilip Paeps falcon_i2c_t enu_fip; 360e948693eSPhilip Paeps boolean_t enu_i2c_locked; 361e948693eSPhilip Paeps #if EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE 362e948693eSPhilip Paeps const uint8_t *enu_forced_cfg; 363e948693eSPhilip Paeps #endif /* EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE */ 364e948693eSPhilip Paeps uint8_t enu_mon_devid; 365e948693eSPhilip Paeps #if EFSYS_OPT_PCIE_TUNE 366e948693eSPhilip Paeps unsigned int enu_nlanes; 367e948693eSPhilip Paeps #endif /* EFSYS_OPT_PCIE_TUNE */ 368e948693eSPhilip Paeps uint16_t enu_board_rev; 369e948693eSPhilip Paeps boolean_t enu_internal_sram; 370e948693eSPhilip Paeps uint8_t enu_sram_num_bank; 371e948693eSPhilip Paeps uint8_t enu_sram_bank_size; 372e948693eSPhilip Paeps } falcon; 373e948693eSPhilip Paeps #endif /* EFSYS_OPT_FALCON */ 374e948693eSPhilip Paeps #if EFSYS_OPT_SIENA 375e948693eSPhilip Paeps struct { 376e948693eSPhilip Paeps #if EFSYS_OPT_MCDI 377e948693eSPhilip Paeps efx_mcdi_iface_t enu_mip; 378e948693eSPhilip Paeps #endif /* EFSYS_OPT_MCDI */ 379e948693eSPhilip Paeps #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 380e948693eSPhilip Paeps unsigned int enu_partn_mask; 381e948693eSPhilip Paeps #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 382e948693eSPhilip Paeps #if EFSYS_OPT_VPD 383e948693eSPhilip Paeps caddr_t enu_svpd; 384e948693eSPhilip Paeps size_t enu_svpd_length; 385e948693eSPhilip Paeps #endif /* EFSYS_OPT_VPD */ 386e948693eSPhilip Paeps } siena; 387e948693eSPhilip Paeps #endif /* EFSYS_OPT_SIENA */ 388e948693eSPhilip Paeps } en_u; 389e948693eSPhilip Paeps }; 390e948693eSPhilip Paeps 391e948693eSPhilip Paeps 392e948693eSPhilip Paeps #define EFX_NIC_MAGIC 0x02121996 393e948693eSPhilip Paeps 394e948693eSPhilip Paeps typedef boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *, 395e948693eSPhilip Paeps const efx_ev_callbacks_t *, void *); 396e948693eSPhilip Paeps 397e948693eSPhilip Paeps struct efx_evq_s { 398e948693eSPhilip Paeps uint32_t ee_magic; 399e948693eSPhilip Paeps efx_nic_t *ee_enp; 400e948693eSPhilip Paeps unsigned int ee_index; 401e948693eSPhilip Paeps unsigned int ee_mask; 402e948693eSPhilip Paeps efsys_mem_t *ee_esmp; 403e948693eSPhilip Paeps #if EFSYS_OPT_QSTATS 404e948693eSPhilip Paeps uint32_t ee_stat[EV_NQSTATS]; 405e948693eSPhilip Paeps #endif /* EFSYS_OPT_QSTATS */ 406e948693eSPhilip Paeps efx_ev_handler_t ee_handler[1 << FSF_AZ_EV_CODE_WIDTH]; 407e948693eSPhilip Paeps }; 408e948693eSPhilip Paeps 409e948693eSPhilip Paeps #define EFX_EVQ_MAGIC 0x08081997 410e948693eSPhilip Paeps 411*af9078c3SAndrew Rybchenko #define EFX_EVQ_FALCON_TIMER_QUANTUM_NS 4968 /* 621 cycles */ 412*af9078c3SAndrew Rybchenko #define EFX_EVQ_SIENA_TIMER_QUANTUM_NS 6144 /* 768 cycles */ 413e948693eSPhilip Paeps 414e948693eSPhilip Paeps struct efx_rxq_s { 415e948693eSPhilip Paeps uint32_t er_magic; 416e948693eSPhilip Paeps efx_nic_t *er_enp; 417e948693eSPhilip Paeps unsigned int er_index; 418e948693eSPhilip Paeps unsigned int er_mask; 419e948693eSPhilip Paeps efsys_mem_t *er_esmp; 420e948693eSPhilip Paeps }; 421e948693eSPhilip Paeps 422e948693eSPhilip Paeps #define EFX_RXQ_MAGIC 0x15022005 423e948693eSPhilip Paeps 424e948693eSPhilip Paeps struct efx_txq_s { 425e948693eSPhilip Paeps uint32_t et_magic; 426e948693eSPhilip Paeps efx_nic_t *et_enp; 427e948693eSPhilip Paeps unsigned int et_index; 428e948693eSPhilip Paeps unsigned int et_mask; 429e948693eSPhilip Paeps efsys_mem_t *et_esmp; 430e948693eSPhilip Paeps #if EFSYS_OPT_QSTATS 431e948693eSPhilip Paeps uint32_t et_stat[TX_NQSTATS]; 432e948693eSPhilip Paeps #endif /* EFSYS_OPT_QSTATS */ 433e948693eSPhilip Paeps }; 434e948693eSPhilip Paeps 435e948693eSPhilip Paeps #define EFX_TXQ_MAGIC 0x05092005 436e948693eSPhilip Paeps 437e948693eSPhilip Paeps #define EFX_MAC_ADDR_COPY(_dst, _src) \ 438e948693eSPhilip Paeps do { \ 439e948693eSPhilip Paeps (_dst)[0] = (_src)[0]; \ 440e948693eSPhilip Paeps (_dst)[1] = (_src)[1]; \ 441e948693eSPhilip Paeps (_dst)[2] = (_src)[2]; \ 442e948693eSPhilip Paeps (_dst)[3] = (_src)[3]; \ 443e948693eSPhilip Paeps (_dst)[4] = (_src)[4]; \ 444e948693eSPhilip Paeps (_dst)[5] = (_src)[5]; \ 445e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 446e948693eSPhilip Paeps } while (B_FALSE) 447e948693eSPhilip Paeps 448e948693eSPhilip Paeps #if EFSYS_OPT_CHECK_REG 449e948693eSPhilip Paeps #define EFX_CHECK_REG(_enp, _reg) \ 450e948693eSPhilip Paeps do { \ 451e948693eSPhilip Paeps const char __cs *name = #_reg; \ 452e948693eSPhilip Paeps char min = name[4]; \ 453e948693eSPhilip Paeps char max = name[5]; \ 454e948693eSPhilip Paeps char rev; \ 455e948693eSPhilip Paeps \ 456e948693eSPhilip Paeps switch ((_enp)->en_family) { \ 457e948693eSPhilip Paeps case EFX_FAMILY_FALCON: \ 458e948693eSPhilip Paeps rev = 'B'; \ 459e948693eSPhilip Paeps break; \ 460e948693eSPhilip Paeps \ 461e948693eSPhilip Paeps case EFX_FAMILY_SIENA: \ 462e948693eSPhilip Paeps rev = 'C'; \ 463e948693eSPhilip Paeps break; \ 464e948693eSPhilip Paeps \ 465e948693eSPhilip Paeps default: \ 466e948693eSPhilip Paeps rev = '?'; \ 467e948693eSPhilip Paeps break; \ 468e948693eSPhilip Paeps } \ 469e948693eSPhilip Paeps \ 470e948693eSPhilip Paeps EFSYS_ASSERT3S(rev, >=, min); \ 471e948693eSPhilip Paeps EFSYS_ASSERT3S(rev, <=, max); \ 472e948693eSPhilip Paeps \ 473e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 474e948693eSPhilip Paeps } while (B_FALSE) 475e948693eSPhilip Paeps #else 476e948693eSPhilip Paeps #define EFX_CHECK_REG(_enp, _reg) do { \ 477e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 478e948693eSPhilip Paeps } while(B_FALSE) 479e948693eSPhilip Paeps #endif 480e948693eSPhilip Paeps 481e948693eSPhilip Paeps #define EFX_BAR_READD(_enp, _reg, _edp, _lock) \ 482e948693eSPhilip Paeps do { \ 483e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 484e948693eSPhilip Paeps EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST, \ 485e948693eSPhilip Paeps (_edp), (_lock)); \ 486e948693eSPhilip Paeps EFSYS_PROBE3(efx_bar_readd, const char *, #_reg, \ 487e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 488e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 489e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 490e948693eSPhilip Paeps } while (B_FALSE) 491e948693eSPhilip Paeps 492e948693eSPhilip Paeps #define EFX_BAR_WRITED(_enp, _reg, _edp, _lock) \ 493e948693eSPhilip Paeps do { \ 494e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 495e948693eSPhilip Paeps EFSYS_PROBE3(efx_bar_writed, const char *, #_reg, \ 496e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 497e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 498e948693eSPhilip Paeps EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST, \ 499e948693eSPhilip Paeps (_edp), (_lock)); \ 500e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 501e948693eSPhilip Paeps } while (B_FALSE) 502e948693eSPhilip Paeps 503e948693eSPhilip Paeps #define EFX_BAR_READQ(_enp, _reg, _eqp) \ 504e948693eSPhilip Paeps do { \ 505e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 506e948693eSPhilip Paeps EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST, \ 507e948693eSPhilip Paeps (_eqp)); \ 508e948693eSPhilip Paeps EFSYS_PROBE4(efx_bar_readq, const char *, #_reg, \ 509e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 510e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 511e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 512e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 513e948693eSPhilip Paeps } while (B_FALSE) 514e948693eSPhilip Paeps 515e948693eSPhilip Paeps #define EFX_BAR_WRITEQ(_enp, _reg, _eqp) \ 516e948693eSPhilip Paeps do { \ 517e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 518e948693eSPhilip Paeps EFSYS_PROBE4(efx_bar_writeq, const char *, #_reg, \ 519e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 520e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 521e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 522e948693eSPhilip Paeps EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST, \ 523e948693eSPhilip Paeps (_eqp)); \ 524e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 525e948693eSPhilip Paeps } while (B_FALSE) 526e948693eSPhilip Paeps 527e948693eSPhilip Paeps #define EFX_BAR_READO(_enp, _reg, _eop) \ 528e948693eSPhilip Paeps do { \ 529e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 530e948693eSPhilip Paeps EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST, \ 531e948693eSPhilip Paeps (_eop), B_TRUE); \ 532e948693eSPhilip Paeps EFSYS_PROBE6(efx_bar_reado, const char *, #_reg, \ 533e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 534e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 535e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 536e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 537e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 538e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 539e948693eSPhilip Paeps } while (B_FALSE) 540e948693eSPhilip Paeps 541e948693eSPhilip Paeps #define EFX_BAR_WRITEO(_enp, _reg, _eop) \ 542e948693eSPhilip Paeps do { \ 543e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 544e948693eSPhilip Paeps EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg, \ 545e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 546e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 547e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 548e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 549e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 550e948693eSPhilip Paeps EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST, \ 551e948693eSPhilip Paeps (_eop), B_TRUE); \ 552e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 553e948693eSPhilip Paeps } while (B_FALSE) 554e948693eSPhilip Paeps 555e948693eSPhilip Paeps #define EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock) \ 556e948693eSPhilip Paeps do { \ 557e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 558e948693eSPhilip Paeps EFSYS_BAR_READD((_enp)->en_esbp, \ 559e948693eSPhilip Paeps (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 560e948693eSPhilip Paeps (_edp), (_lock)); \ 561e948693eSPhilip Paeps EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg, \ 562e948693eSPhilip Paeps uint32_t, (_index), \ 563e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 564e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 565e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 566e948693eSPhilip Paeps } while (B_FALSE) 567e948693eSPhilip Paeps 568e948693eSPhilip Paeps #define EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock) \ 569e948693eSPhilip Paeps do { \ 570e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 571e948693eSPhilip Paeps EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 572e948693eSPhilip Paeps uint32_t, (_index), \ 573e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 574e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 575e948693eSPhilip Paeps EFSYS_BAR_WRITED((_enp)->en_esbp, \ 576e948693eSPhilip Paeps (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 577e948693eSPhilip Paeps (_edp), (_lock)); \ 578e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 579e948693eSPhilip Paeps } while (B_FALSE) 580e948693eSPhilip Paeps 581e948693eSPhilip Paeps #define EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock) \ 582e948693eSPhilip Paeps do { \ 583e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 584e948693eSPhilip Paeps EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 585e948693eSPhilip Paeps uint32_t, (_index), \ 586e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 587e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 588e948693eSPhilip Paeps EFSYS_BAR_WRITED((_enp)->en_esbp, \ 589e948693eSPhilip Paeps (_reg ## _OFST + \ 590e948693eSPhilip Paeps (3 * sizeof (efx_dword_t)) + \ 591e948693eSPhilip Paeps ((_index) * _reg ## _STEP)), \ 592e948693eSPhilip Paeps (_edp), (_lock)); \ 593e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 594e948693eSPhilip Paeps } while (B_FALSE) 595e948693eSPhilip Paeps 596e948693eSPhilip Paeps #define EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp) \ 597e948693eSPhilip Paeps do { \ 598e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 599e948693eSPhilip Paeps EFSYS_BAR_READQ((_enp)->en_esbp, \ 600e948693eSPhilip Paeps (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 601e948693eSPhilip Paeps (_eqp)); \ 602e948693eSPhilip Paeps EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg, \ 603e948693eSPhilip Paeps uint32_t, (_index), \ 604e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 605e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 606e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 607e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 608e948693eSPhilip Paeps } while (B_FALSE) 609e948693eSPhilip Paeps 610e948693eSPhilip Paeps #define EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp) \ 611e948693eSPhilip Paeps do { \ 612e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 613e948693eSPhilip Paeps EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg, \ 614e948693eSPhilip Paeps uint32_t, (_index), \ 615e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 616e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 617e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 618e948693eSPhilip Paeps EFSYS_BAR_WRITEQ((_enp)->en_esbp, \ 619e948693eSPhilip Paeps (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 620e948693eSPhilip Paeps (_eqp)); \ 621e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 622e948693eSPhilip Paeps } while (B_FALSE) 623e948693eSPhilip Paeps 624e948693eSPhilip Paeps #define EFX_BAR_TBL_READO(_enp, _reg, _index, _eop) \ 625e948693eSPhilip Paeps do { \ 626e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 627e948693eSPhilip Paeps EFSYS_BAR_READO((_enp)->en_esbp, \ 628e948693eSPhilip Paeps (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 629e948693eSPhilip Paeps (_eop), B_TRUE); \ 630e948693eSPhilip Paeps EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg, \ 631e948693eSPhilip Paeps uint32_t, (_index), \ 632e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 633e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 634e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 635e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 636e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 637e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 638e948693eSPhilip Paeps } while (B_FALSE) 639e948693eSPhilip Paeps 640e948693eSPhilip Paeps #define EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop) \ 641e948693eSPhilip Paeps do { \ 642e948693eSPhilip Paeps EFX_CHECK_REG((_enp), (_reg)); \ 643e948693eSPhilip Paeps EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg, \ 644e948693eSPhilip Paeps uint32_t, (_index), \ 645e948693eSPhilip Paeps uint32_t, _reg ## _OFST, \ 646e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 647e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 648e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 649e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 650e948693eSPhilip Paeps EFSYS_BAR_WRITEO((_enp)->en_esbp, \ 651e948693eSPhilip Paeps (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 652e948693eSPhilip Paeps (_eop), B_TRUE); \ 653e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 654e948693eSPhilip Paeps } while (B_FALSE) 655e948693eSPhilip Paeps 656e948693eSPhilip Paeps extern __checkReturn int 657e948693eSPhilip Paeps efx_mac_select( 658e948693eSPhilip Paeps __in efx_nic_t *enp); 659e948693eSPhilip Paeps 660e948693eSPhilip Paeps extern __checkReturn int 661e948693eSPhilip Paeps efx_phy_probe( 662e948693eSPhilip Paeps __in efx_nic_t *enp); 663e948693eSPhilip Paeps 664e948693eSPhilip Paeps extern void 665e948693eSPhilip Paeps efx_phy_unprobe( 666e948693eSPhilip Paeps __in efx_nic_t *enp); 667e948693eSPhilip Paeps 668e948693eSPhilip Paeps #if EFSYS_OPT_VPD 669e948693eSPhilip Paeps 670e948693eSPhilip Paeps /* VPD utility functions */ 671e948693eSPhilip Paeps 672e948693eSPhilip Paeps extern __checkReturn int 673e948693eSPhilip Paeps efx_vpd_hunk_length( 674e948693eSPhilip Paeps __in_bcount(size) caddr_t data, 675e948693eSPhilip Paeps __in size_t size, 676e948693eSPhilip Paeps __out size_t *lengthp); 677e948693eSPhilip Paeps 678e948693eSPhilip Paeps extern __checkReturn int 679e948693eSPhilip Paeps efx_vpd_hunk_verify( 680e948693eSPhilip Paeps __in_bcount(size) caddr_t data, 681e948693eSPhilip Paeps __in size_t size, 682e948693eSPhilip Paeps __out_opt boolean_t *cksummedp); 683e948693eSPhilip Paeps 684e948693eSPhilip Paeps extern __checkReturn int 685e948693eSPhilip Paeps efx_vpd_hunk_reinit( 686e948693eSPhilip Paeps __in caddr_t data, 687e948693eSPhilip Paeps __in size_t size, 688e948693eSPhilip Paeps __in boolean_t wantpid); 689e948693eSPhilip Paeps 690e948693eSPhilip Paeps extern __checkReturn int 691e948693eSPhilip Paeps efx_vpd_hunk_get( 692e948693eSPhilip Paeps __in_bcount(size) caddr_t data, 693e948693eSPhilip Paeps __in size_t size, 694e948693eSPhilip Paeps __in efx_vpd_tag_t tag, 695e948693eSPhilip Paeps __in efx_vpd_keyword_t keyword, 696e948693eSPhilip Paeps __out unsigned int *payloadp, 697e948693eSPhilip Paeps __out uint8_t *paylenp); 698e948693eSPhilip Paeps 699e948693eSPhilip Paeps extern __checkReturn int 700e948693eSPhilip Paeps efx_vpd_hunk_next( 701e948693eSPhilip Paeps __in_bcount(size) caddr_t data, 702e948693eSPhilip Paeps __in size_t size, 703e948693eSPhilip Paeps __out efx_vpd_tag_t *tagp, 704e948693eSPhilip Paeps __out efx_vpd_keyword_t *keyword, 705e948693eSPhilip Paeps __out_bcount_opt(*paylenp) unsigned int *payloadp, 706e948693eSPhilip Paeps __out_opt uint8_t *paylenp, 707e948693eSPhilip Paeps __inout unsigned int *contp); 708e948693eSPhilip Paeps 709e948693eSPhilip Paeps extern __checkReturn int 710e948693eSPhilip Paeps efx_vpd_hunk_set( 711e948693eSPhilip Paeps __in_bcount(size) caddr_t data, 712e948693eSPhilip Paeps __in size_t size, 713e948693eSPhilip Paeps __in efx_vpd_value_t *evvp); 714e948693eSPhilip Paeps 715e948693eSPhilip Paeps #endif /* EFSYS_OPT_VPD */ 716e948693eSPhilip Paeps 717e948693eSPhilip Paeps #if EFSYS_OPT_DIAG 718e948693eSPhilip Paeps 719e948693eSPhilip Paeps extern efx_sram_pattern_fn_t __cs __efx_sram_pattern_fns[]; 720e948693eSPhilip Paeps 721e948693eSPhilip Paeps typedef struct efx_register_set_s { 722e948693eSPhilip Paeps unsigned int address; 723e948693eSPhilip Paeps unsigned int step; 724e948693eSPhilip Paeps unsigned int rows; 725e948693eSPhilip Paeps efx_oword_t mask; 726e948693eSPhilip Paeps } efx_register_set_t; 727e948693eSPhilip Paeps 728e948693eSPhilip Paeps extern __checkReturn int 729e948693eSPhilip Paeps efx_nic_test_registers( 730e948693eSPhilip Paeps __in efx_nic_t *enp, 731e948693eSPhilip Paeps __in efx_register_set_t *rsp, 732e948693eSPhilip Paeps __in size_t count); 733e948693eSPhilip Paeps 734e948693eSPhilip Paeps extern __checkReturn int 735e948693eSPhilip Paeps efx_nic_test_tables( 736e948693eSPhilip Paeps __in efx_nic_t *enp, 737e948693eSPhilip Paeps __in efx_register_set_t *rsp, 738e948693eSPhilip Paeps __in efx_pattern_type_t pattern, 739e948693eSPhilip Paeps __in size_t count); 740e948693eSPhilip Paeps 741e948693eSPhilip Paeps #endif /* EFSYS_OPT_DIAG */ 742e948693eSPhilip Paeps 743e948693eSPhilip Paeps #ifdef __cplusplus 744e948693eSPhilip Paeps } 745e948693eSPhilip Paeps #endif 746e948693eSPhilip Paeps 747e948693eSPhilip Paeps #endif /* _SYS_EFX_IMPL_H */ 748