15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause 25e111ed8SAndrew Rybchenko * 35e111ed8SAndrew Rybchenko * Copyright(c) 2019-2020 Xilinx, Inc. 45e111ed8SAndrew Rybchenko * Copyright(c) 2007-2019 Solarflare Communications Inc. 55e111ed8SAndrew Rybchenko */ 65e111ed8SAndrew Rybchenko 75e111ed8SAndrew Rybchenko #ifndef _SYS_EFX_IMPL_H 85e111ed8SAndrew Rybchenko #define _SYS_EFX_IMPL_H 95e111ed8SAndrew Rybchenko 105e111ed8SAndrew Rybchenko #include "efx.h" 115e111ed8SAndrew Rybchenko #include "efx_regs.h" 125e111ed8SAndrew Rybchenko #include "efx_regs_ef10.h" 134d80109cSAndrew Rybchenko #include "efx_regs_ef100.h" 145e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 155e111ed8SAndrew Rybchenko #include "efx_mcdi.h" 165e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 175e111ed8SAndrew Rybchenko 185e111ed8SAndrew Rybchenko /* FIXME: Add definition for driver generated software events */ 195e111ed8SAndrew Rybchenko #ifndef ESE_DZ_EV_CODE_DRV_GEN_EV 205e111ed8SAndrew Rybchenko #define ESE_DZ_EV_CODE_DRV_GEN_EV FSE_AZ_EV_CODE_DRV_GEN_EV 215e111ed8SAndrew Rybchenko #endif 225e111ed8SAndrew Rybchenko 235e111ed8SAndrew Rybchenko 245e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 255e111ed8SAndrew Rybchenko #include "siena_impl.h" 265e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 275e111ed8SAndrew Rybchenko 285e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON 295e111ed8SAndrew Rybchenko #include "hunt_impl.h" 305e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_HUNTINGTON */ 315e111ed8SAndrew Rybchenko 325e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD 335e111ed8SAndrew Rybchenko #include "medford_impl.h" 345e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MEDFORD */ 355e111ed8SAndrew Rybchenko 365e111ed8SAndrew Rybchenko #if EFSYS_OPT_MEDFORD2 375e111ed8SAndrew Rybchenko #include "medford2_impl.h" 385e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MEDFORD2 */ 395e111ed8SAndrew Rybchenko 409b5b182dSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 415e111ed8SAndrew Rybchenko #include "ef10_impl.h" 429b5b182dSAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 435e111ed8SAndrew Rybchenko 443c1c5cc4SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD 453c1c5cc4SAndrew Rybchenko #include "rhead_impl.h" 463c1c5cc4SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD */ 473c1c5cc4SAndrew Rybchenko 485e111ed8SAndrew Rybchenko #ifdef __cplusplus 495e111ed8SAndrew Rybchenko extern "C" { 505e111ed8SAndrew Rybchenko #endif 515e111ed8SAndrew Rybchenko 525e111ed8SAndrew Rybchenko #define EFX_MOD_MCDI 0x00000001 535e111ed8SAndrew Rybchenko #define EFX_MOD_PROBE 0x00000002 545e111ed8SAndrew Rybchenko #define EFX_MOD_NVRAM 0x00000004 555e111ed8SAndrew Rybchenko #define EFX_MOD_VPD 0x00000008 565e111ed8SAndrew Rybchenko #define EFX_MOD_NIC 0x00000010 575e111ed8SAndrew Rybchenko #define EFX_MOD_INTR 0x00000020 585e111ed8SAndrew Rybchenko #define EFX_MOD_EV 0x00000040 595e111ed8SAndrew Rybchenko #define EFX_MOD_RX 0x00000080 605e111ed8SAndrew Rybchenko #define EFX_MOD_TX 0x00000100 615e111ed8SAndrew Rybchenko #define EFX_MOD_PORT 0x00000200 625e111ed8SAndrew Rybchenko #define EFX_MOD_MON 0x00000400 635e111ed8SAndrew Rybchenko #define EFX_MOD_FILTER 0x00001000 645e111ed8SAndrew Rybchenko #define EFX_MOD_LIC 0x00002000 655e111ed8SAndrew Rybchenko #define EFX_MOD_TUNNEL 0x00004000 665e111ed8SAndrew Rybchenko #define EFX_MOD_EVB 0x00008000 675e111ed8SAndrew Rybchenko #define EFX_MOD_PROXY 0x00010000 685e111ed8SAndrew Rybchenko 695e111ed8SAndrew Rybchenko #define EFX_RESET_PHY 0x00000001 705e111ed8SAndrew Rybchenko #define EFX_RESET_RXQ_ERR 0x00000002 715e111ed8SAndrew Rybchenko #define EFX_RESET_TXQ_ERR 0x00000004 725e111ed8SAndrew Rybchenko #define EFX_RESET_HW_UNAVAIL 0x00000008 735e111ed8SAndrew Rybchenko 745e111ed8SAndrew Rybchenko typedef enum efx_mac_type_e { 755e111ed8SAndrew Rybchenko EFX_MAC_INVALID = 0, 765e111ed8SAndrew Rybchenko EFX_MAC_SIENA, 775e111ed8SAndrew Rybchenko EFX_MAC_HUNTINGTON, 785e111ed8SAndrew Rybchenko EFX_MAC_MEDFORD, 795e111ed8SAndrew Rybchenko EFX_MAC_MEDFORD2, 80de0d268fSAndrew Rybchenko EFX_MAC_RIVERHEAD, 815e111ed8SAndrew Rybchenko EFX_MAC_NTYPES 825e111ed8SAndrew Rybchenko } efx_mac_type_t; 835e111ed8SAndrew Rybchenko 845e111ed8SAndrew Rybchenko typedef struct efx_ev_ops_s { 855e111ed8SAndrew Rybchenko efx_rc_t (*eevo_init)(efx_nic_t *); 865e111ed8SAndrew Rybchenko void (*eevo_fini)(efx_nic_t *); 875e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qcreate)(efx_nic_t *, unsigned int, 885e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, uint32_t, 895e111ed8SAndrew Rybchenko uint32_t, uint32_t, efx_evq_t *); 905e111ed8SAndrew Rybchenko void (*eevo_qdestroy)(efx_evq_t *); 915e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qprime)(efx_evq_t *, unsigned int); 925e111ed8SAndrew Rybchenko void (*eevo_qpost)(efx_evq_t *, uint16_t); 93ad1e3ed8SAndrew Rybchenko void (*eevo_qpoll)(efx_evq_t *, unsigned int *, 94ad1e3ed8SAndrew Rybchenko const efx_ev_callbacks_t *, void *); 955e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qmoderate)(efx_evq_t *, unsigned int); 965e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 975e111ed8SAndrew Rybchenko void (*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *); 985e111ed8SAndrew Rybchenko #endif 995e111ed8SAndrew Rybchenko } efx_ev_ops_t; 1005e111ed8SAndrew Rybchenko 1015e111ed8SAndrew Rybchenko typedef struct efx_tx_ops_s { 1025e111ed8SAndrew Rybchenko efx_rc_t (*etxo_init)(efx_nic_t *); 1035e111ed8SAndrew Rybchenko void (*etxo_fini)(efx_nic_t *); 1045e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qcreate)(efx_nic_t *, 1055e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1065e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, 1075e111ed8SAndrew Rybchenko uint32_t, uint16_t, 1085e111ed8SAndrew Rybchenko efx_evq_t *, efx_txq_t *, 1095e111ed8SAndrew Rybchenko unsigned int *); 1105e111ed8SAndrew Rybchenko void (*etxo_qdestroy)(efx_txq_t *); 1115e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpost)(efx_txq_t *, efx_buffer_t *, 1125e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1135e111ed8SAndrew Rybchenko unsigned int *); 1145e111ed8SAndrew Rybchenko void (*etxo_qpush)(efx_txq_t *, unsigned int, unsigned int); 1155e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpace)(efx_txq_t *, unsigned int); 1165e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qflush)(efx_txq_t *); 1175e111ed8SAndrew Rybchenko void (*etxo_qenable)(efx_txq_t *); 1185e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_enable)(efx_txq_t *); 1195e111ed8SAndrew Rybchenko void (*etxo_qpio_disable)(efx_txq_t *); 1205e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_write)(efx_txq_t *, uint8_t *, size_t, 1215e111ed8SAndrew Rybchenko size_t); 1225e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_post)(efx_txq_t *, size_t, unsigned int, 1235e111ed8SAndrew Rybchenko unsigned int *); 1245e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qdesc_post)(efx_txq_t *, efx_desc_t *, 1255e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1265e111ed8SAndrew Rybchenko unsigned int *); 1275e111ed8SAndrew Rybchenko void (*etxo_qdesc_dma_create)(efx_txq_t *, efsys_dma_addr_t, 1285e111ed8SAndrew Rybchenko size_t, boolean_t, 1295e111ed8SAndrew Rybchenko efx_desc_t *); 1305e111ed8SAndrew Rybchenko void (*etxo_qdesc_tso_create)(efx_txq_t *, uint16_t, 1315e111ed8SAndrew Rybchenko uint32_t, uint8_t, 1325e111ed8SAndrew Rybchenko efx_desc_t *); 1335e111ed8SAndrew Rybchenko void (*etxo_qdesc_tso2_create)(efx_txq_t *, uint16_t, 1345e111ed8SAndrew Rybchenko uint16_t, uint32_t, uint16_t, 1355e111ed8SAndrew Rybchenko efx_desc_t *, int); 1365e111ed8SAndrew Rybchenko void (*etxo_qdesc_vlantci_create)(efx_txq_t *, uint16_t, 1375e111ed8SAndrew Rybchenko efx_desc_t *); 1385e111ed8SAndrew Rybchenko void (*etxo_qdesc_checksum_create)(efx_txq_t *, uint16_t, 1395e111ed8SAndrew Rybchenko efx_desc_t *); 1405e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 1415e111ed8SAndrew Rybchenko void (*etxo_qstats_update)(efx_txq_t *, 1425e111ed8SAndrew Rybchenko efsys_stat_t *); 1435e111ed8SAndrew Rybchenko #endif 1445e111ed8SAndrew Rybchenko } efx_tx_ops_t; 1455e111ed8SAndrew Rybchenko 1465e111ed8SAndrew Rybchenko typedef union efx_rxq_type_data_u { 1475e111ed8SAndrew Rybchenko struct { 1485e111ed8SAndrew Rybchenko size_t ed_buf_size; 1495e111ed8SAndrew Rybchenko } ertd_default; 1505e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 1515e111ed8SAndrew Rybchenko struct { 1525e111ed8SAndrew Rybchenko uint32_t eps_buf_size; 1535e111ed8SAndrew Rybchenko } ertd_packed_stream; 1545e111ed8SAndrew Rybchenko #endif 1555e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_ES_SUPER_BUFFER 1565e111ed8SAndrew Rybchenko struct { 1575e111ed8SAndrew Rybchenko uint32_t eessb_bufs_per_desc; 1585e111ed8SAndrew Rybchenko uint32_t eessb_max_dma_len; 1595e111ed8SAndrew Rybchenko uint32_t eessb_buf_stride; 1605e111ed8SAndrew Rybchenko uint32_t eessb_hol_block_timeout; 1615e111ed8SAndrew Rybchenko } ertd_es_super_buffer; 1625e111ed8SAndrew Rybchenko #endif 1635e111ed8SAndrew Rybchenko } efx_rxq_type_data_t; 1645e111ed8SAndrew Rybchenko 1655e111ed8SAndrew Rybchenko typedef struct efx_rx_ops_s { 1665e111ed8SAndrew Rybchenko efx_rc_t (*erxo_init)(efx_nic_t *); 1675e111ed8SAndrew Rybchenko void (*erxo_fini)(efx_nic_t *); 1685e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCATTER 1695e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scatter_enable)(efx_nic_t *, unsigned int); 1705e111ed8SAndrew Rybchenko #endif 1715e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCALE 1725e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_context_alloc)(efx_nic_t *, 1735e111ed8SAndrew Rybchenko efx_rx_scale_context_type_t, 1745e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 1755e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_context_free)(efx_nic_t *, uint32_t); 1765e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_mode_set)(efx_nic_t *, uint32_t, 1775e111ed8SAndrew Rybchenko efx_rx_hash_alg_t, 1785e111ed8SAndrew Rybchenko efx_rx_hash_type_t, boolean_t); 1795e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_key_set)(efx_nic_t *, uint32_t, 1805e111ed8SAndrew Rybchenko uint8_t *, size_t); 1815e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_tbl_set)(efx_nic_t *, uint32_t, 1825e111ed8SAndrew Rybchenko unsigned int *, size_t); 1835e111ed8SAndrew Rybchenko uint32_t (*erxo_prefix_hash)(efx_nic_t *, efx_rx_hash_alg_t, 1845e111ed8SAndrew Rybchenko uint8_t *); 1855e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_RX_SCALE */ 1865e111ed8SAndrew Rybchenko efx_rc_t (*erxo_prefix_pktlen)(efx_nic_t *, uint8_t *, 1875e111ed8SAndrew Rybchenko uint16_t *); 1885e111ed8SAndrew Rybchenko void (*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t, 1895e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1905e111ed8SAndrew Rybchenko unsigned int); 1915e111ed8SAndrew Rybchenko void (*erxo_qpush)(efx_rxq_t *, unsigned int, unsigned int *); 1925e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 1935e111ed8SAndrew Rybchenko void (*erxo_qpush_ps_credits)(efx_rxq_t *); 1945e111ed8SAndrew Rybchenko uint8_t * (*erxo_qps_packet_info)(efx_rxq_t *, uint8_t *, 1955e111ed8SAndrew Rybchenko uint32_t, uint32_t, 1965e111ed8SAndrew Rybchenko uint16_t *, uint32_t *, uint32_t *); 1975e111ed8SAndrew Rybchenko #endif 1985e111ed8SAndrew Rybchenko efx_rc_t (*erxo_qflush)(efx_rxq_t *); 1995e111ed8SAndrew Rybchenko void (*erxo_qenable)(efx_rxq_t *); 2005e111ed8SAndrew Rybchenko efx_rc_t (*erxo_qcreate)(efx_nic_t *enp, unsigned int, 2015e111ed8SAndrew Rybchenko unsigned int, efx_rxq_type_t, 2025e111ed8SAndrew Rybchenko const efx_rxq_type_data_t *, 2035e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, uint32_t, 2045e111ed8SAndrew Rybchenko unsigned int, 2055e111ed8SAndrew Rybchenko efx_evq_t *, efx_rxq_t *); 2065e111ed8SAndrew Rybchenko void (*erxo_qdestroy)(efx_rxq_t *); 2075e111ed8SAndrew Rybchenko } efx_rx_ops_t; 2085e111ed8SAndrew Rybchenko 2095e111ed8SAndrew Rybchenko typedef struct efx_mac_ops_s { 2105e111ed8SAndrew Rybchenko efx_rc_t (*emo_poll)(efx_nic_t *, efx_link_mode_t *); 2115e111ed8SAndrew Rybchenko efx_rc_t (*emo_up)(efx_nic_t *, boolean_t *); 2125e111ed8SAndrew Rybchenko efx_rc_t (*emo_addr_set)(efx_nic_t *); 2135e111ed8SAndrew Rybchenko efx_rc_t (*emo_pdu_set)(efx_nic_t *); 2145e111ed8SAndrew Rybchenko efx_rc_t (*emo_pdu_get)(efx_nic_t *, size_t *); 2155e111ed8SAndrew Rybchenko efx_rc_t (*emo_reconfigure)(efx_nic_t *); 2165e111ed8SAndrew Rybchenko efx_rc_t (*emo_multicast_list_set)(efx_nic_t *); 2175e111ed8SAndrew Rybchenko efx_rc_t (*emo_filter_default_rxq_set)(efx_nic_t *, 2185e111ed8SAndrew Rybchenko efx_rxq_t *, boolean_t); 2195e111ed8SAndrew Rybchenko void (*emo_filter_default_rxq_clear)(efx_nic_t *); 2205e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK 2215e111ed8SAndrew Rybchenko efx_rc_t (*emo_loopback_set)(efx_nic_t *, efx_link_mode_t, 2225e111ed8SAndrew Rybchenko efx_loopback_type_t); 2235e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */ 2245e111ed8SAndrew Rybchenko #if EFSYS_OPT_MAC_STATS 2255e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_get_mask)(efx_nic_t *, uint32_t *, size_t); 2265e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_clear)(efx_nic_t *); 2275e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_upload)(efx_nic_t *, efsys_mem_t *); 2285e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *, 2295e111ed8SAndrew Rybchenko uint16_t, boolean_t); 2305e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 2315e111ed8SAndrew Rybchenko efsys_stat_t *, uint32_t *); 2325e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MAC_STATS */ 2335e111ed8SAndrew Rybchenko } efx_mac_ops_t; 2345e111ed8SAndrew Rybchenko 2355e111ed8SAndrew Rybchenko typedef struct efx_phy_ops_s { 2365e111ed8SAndrew Rybchenko efx_rc_t (*epo_power)(efx_nic_t *, boolean_t); /* optional */ 2375e111ed8SAndrew Rybchenko efx_rc_t (*epo_reset)(efx_nic_t *); 2385e111ed8SAndrew Rybchenko efx_rc_t (*epo_reconfigure)(efx_nic_t *); 2395e111ed8SAndrew Rybchenko efx_rc_t (*epo_verify)(efx_nic_t *); 2405e111ed8SAndrew Rybchenko efx_rc_t (*epo_oui_get)(efx_nic_t *, uint32_t *); 2415e111ed8SAndrew Rybchenko efx_rc_t (*epo_link_state_get)(efx_nic_t *, efx_phy_link_state_t *); 2425e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_STATS 2435e111ed8SAndrew Rybchenko efx_rc_t (*epo_stats_update)(efx_nic_t *, efsys_mem_t *, 2445e111ed8SAndrew Rybchenko uint32_t *); 2455e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_STATS */ 2465e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST 2475e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_enable_offline)(efx_nic_t *); 2485e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_start)(efx_nic_t *, efx_bist_type_t); 2495e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_poll)(efx_nic_t *, efx_bist_type_t, 2505e111ed8SAndrew Rybchenko efx_bist_result_t *, uint32_t *, 2515e111ed8SAndrew Rybchenko unsigned long *, size_t); 2525e111ed8SAndrew Rybchenko void (*epo_bist_stop)(efx_nic_t *, efx_bist_type_t); 2535e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_BIST */ 2545e111ed8SAndrew Rybchenko } efx_phy_ops_t; 2555e111ed8SAndrew Rybchenko 2565e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 2575e111ed8SAndrew Rybchenko 2585e111ed8SAndrew Rybchenko /* 2595e111ed8SAndrew Rybchenko * Policy for replacing existing filter when inserting a new one. 2605e111ed8SAndrew Rybchenko * Note that all policies allow for storing the new lower priority 2615e111ed8SAndrew Rybchenko * filters as overridden by existing higher priority ones. It is needed 2625e111ed8SAndrew Rybchenko * to restore the lower priority filters on higher priority ones removal. 2635e111ed8SAndrew Rybchenko */ 2645e111ed8SAndrew Rybchenko typedef enum efx_filter_replacement_policy_e { 2655e111ed8SAndrew Rybchenko /* Cannot replace existing filter */ 2665e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_NEVER, 2675e111ed8SAndrew Rybchenko /* Higher priority filters can replace lower priotiry ones */ 2685e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_HIGHER_PRIORITY, 2695e111ed8SAndrew Rybchenko /* 2705e111ed8SAndrew Rybchenko * Higher priority filters can replace lower priority ones and 2715e111ed8SAndrew Rybchenko * equal priority filters can replace each other. 2725e111ed8SAndrew Rybchenko */ 2735e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_HIGHER_OR_EQUAL_PRIORITY, 2745e111ed8SAndrew Rybchenko } efx_filter_replacement_policy_t; 2755e111ed8SAndrew Rybchenko 2765e111ed8SAndrew Rybchenko typedef struct efx_filter_ops_s { 2775e111ed8SAndrew Rybchenko efx_rc_t (*efo_init)(efx_nic_t *); 2785e111ed8SAndrew Rybchenko void (*efo_fini)(efx_nic_t *); 2795e111ed8SAndrew Rybchenko efx_rc_t (*efo_restore)(efx_nic_t *); 2805e111ed8SAndrew Rybchenko efx_rc_t (*efo_add)(efx_nic_t *, efx_filter_spec_t *, 2815e111ed8SAndrew Rybchenko efx_filter_replacement_policy_t policy); 2825e111ed8SAndrew Rybchenko efx_rc_t (*efo_delete)(efx_nic_t *, efx_filter_spec_t *); 2835e111ed8SAndrew Rybchenko efx_rc_t (*efo_supported_filters)(efx_nic_t *, uint32_t *, 2845e111ed8SAndrew Rybchenko size_t, size_t *); 2855e111ed8SAndrew Rybchenko efx_rc_t (*efo_reconfigure)(efx_nic_t *, uint8_t const *, boolean_t, 2865e111ed8SAndrew Rybchenko boolean_t, boolean_t, boolean_t, 2875e111ed8SAndrew Rybchenko uint8_t const *, uint32_t); 2885e111ed8SAndrew Rybchenko } efx_filter_ops_t; 2895e111ed8SAndrew Rybchenko 2905e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2915e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2925e111ed8SAndrew Rybchenko efx_filter_reconfigure( 2935e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2945e111ed8SAndrew Rybchenko __in_ecount(6) uint8_t const *mac_addr, 2955e111ed8SAndrew Rybchenko __in boolean_t all_unicst, 2965e111ed8SAndrew Rybchenko __in boolean_t mulcst, 2975e111ed8SAndrew Rybchenko __in boolean_t all_mulcst, 2985e111ed8SAndrew Rybchenko __in boolean_t brdcst, 2995e111ed8SAndrew Rybchenko __in_ecount(6*count) uint8_t const *addrs, 3005e111ed8SAndrew Rybchenko __in uint32_t count); 3015e111ed8SAndrew Rybchenko 3025e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 3035e111ed8SAndrew Rybchenko 3045e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 3055e111ed8SAndrew Rybchenko typedef struct efx_tunnel_ops_s { 3065e111ed8SAndrew Rybchenko boolean_t (*eto_udp_encap_supported)(efx_nic_t *); 3075e111ed8SAndrew Rybchenko efx_rc_t (*eto_reconfigure)(efx_nic_t *); 3085e111ed8SAndrew Rybchenko } efx_tunnel_ops_t; 3095e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 3105e111ed8SAndrew Rybchenko 3115e111ed8SAndrew Rybchenko typedef struct efx_port_s { 3125e111ed8SAndrew Rybchenko efx_mac_type_t ep_mac_type; 3135e111ed8SAndrew Rybchenko uint32_t ep_phy_type; 3145e111ed8SAndrew Rybchenko uint8_t ep_port; 3155e111ed8SAndrew Rybchenko uint32_t ep_mac_pdu; 3165e111ed8SAndrew Rybchenko uint8_t ep_mac_addr[6]; 3175e111ed8SAndrew Rybchenko efx_link_mode_t ep_link_mode; 3185e111ed8SAndrew Rybchenko boolean_t ep_all_unicst; 3195e111ed8SAndrew Rybchenko boolean_t ep_all_unicst_inserted; 3205e111ed8SAndrew Rybchenko boolean_t ep_mulcst; 3215e111ed8SAndrew Rybchenko boolean_t ep_all_mulcst; 3225e111ed8SAndrew Rybchenko boolean_t ep_all_mulcst_inserted; 3235e111ed8SAndrew Rybchenko boolean_t ep_brdcst; 3245e111ed8SAndrew Rybchenko unsigned int ep_fcntl; 3255e111ed8SAndrew Rybchenko boolean_t ep_fcntl_autoneg; 3265e111ed8SAndrew Rybchenko efx_oword_t ep_multicst_hash[2]; 3275e111ed8SAndrew Rybchenko uint8_t ep_mulcst_addr_list[EFX_MAC_ADDR_LEN * 3285e111ed8SAndrew Rybchenko EFX_MAC_MULTICAST_LIST_MAX]; 3295e111ed8SAndrew Rybchenko uint32_t ep_mulcst_addr_count; 3305e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK 3315e111ed8SAndrew Rybchenko efx_loopback_type_t ep_loopback_type; 3325e111ed8SAndrew Rybchenko efx_link_mode_t ep_loopback_link_mode; 3335e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */ 3345e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_FLAGS 3355e111ed8SAndrew Rybchenko uint32_t ep_phy_flags; 3365e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_FLAGS */ 3375e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_LED_CONTROL 3385e111ed8SAndrew Rybchenko efx_phy_led_mode_t ep_phy_led_mode; 3395e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_LED_CONTROL */ 3405e111ed8SAndrew Rybchenko efx_phy_media_type_t ep_fixed_port_type; 3415e111ed8SAndrew Rybchenko efx_phy_media_type_t ep_module_type; 3425e111ed8SAndrew Rybchenko uint32_t ep_adv_cap_mask; 3435e111ed8SAndrew Rybchenko uint32_t ep_lp_cap_mask; 3445e111ed8SAndrew Rybchenko uint32_t ep_default_adv_cap_mask; 3455e111ed8SAndrew Rybchenko uint32_t ep_phy_cap_mask; 3465e111ed8SAndrew Rybchenko boolean_t ep_mac_drain; 3475e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST 3485e111ed8SAndrew Rybchenko efx_bist_type_t ep_current_bist; 3495e111ed8SAndrew Rybchenko #endif 3505e111ed8SAndrew Rybchenko const efx_mac_ops_t *ep_emop; 3515e111ed8SAndrew Rybchenko const efx_phy_ops_t *ep_epop; 3525e111ed8SAndrew Rybchenko } efx_port_t; 3535e111ed8SAndrew Rybchenko 3545e111ed8SAndrew Rybchenko typedef struct efx_mon_ops_s { 3555e111ed8SAndrew Rybchenko #if EFSYS_OPT_MON_STATS 3565e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 3575e111ed8SAndrew Rybchenko efx_mon_stat_value_t *); 3585e111ed8SAndrew Rybchenko efx_rc_t (*emo_limits_update)(efx_nic_t *, 3595e111ed8SAndrew Rybchenko efx_mon_stat_limits_t *); 3605e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MON_STATS */ 3615e111ed8SAndrew Rybchenko } efx_mon_ops_t; 3625e111ed8SAndrew Rybchenko 3635e111ed8SAndrew Rybchenko typedef struct efx_mon_s { 3645e111ed8SAndrew Rybchenko efx_mon_type_t em_type; 3655e111ed8SAndrew Rybchenko const efx_mon_ops_t *em_emop; 3665e111ed8SAndrew Rybchenko } efx_mon_t; 3675e111ed8SAndrew Rybchenko 3685e111ed8SAndrew Rybchenko typedef struct efx_intr_ops_s { 3695e111ed8SAndrew Rybchenko efx_rc_t (*eio_init)(efx_nic_t *, efx_intr_type_t, efsys_mem_t *); 3705e111ed8SAndrew Rybchenko void (*eio_enable)(efx_nic_t *); 3715e111ed8SAndrew Rybchenko void (*eio_disable)(efx_nic_t *); 3725e111ed8SAndrew Rybchenko void (*eio_disable_unlocked)(efx_nic_t *); 3735e111ed8SAndrew Rybchenko efx_rc_t (*eio_trigger)(efx_nic_t *, unsigned int); 3745e111ed8SAndrew Rybchenko void (*eio_status_line)(efx_nic_t *, boolean_t *, uint32_t *); 3755e111ed8SAndrew Rybchenko void (*eio_status_message)(efx_nic_t *, unsigned int, 3765e111ed8SAndrew Rybchenko boolean_t *); 3775e111ed8SAndrew Rybchenko void (*eio_fatal)(efx_nic_t *); 3785e111ed8SAndrew Rybchenko void (*eio_fini)(efx_nic_t *); 3795e111ed8SAndrew Rybchenko } efx_intr_ops_t; 3805e111ed8SAndrew Rybchenko 3815e111ed8SAndrew Rybchenko typedef struct efx_intr_s { 3825e111ed8SAndrew Rybchenko const efx_intr_ops_t *ei_eiop; 3835e111ed8SAndrew Rybchenko efsys_mem_t *ei_esmp; 3845e111ed8SAndrew Rybchenko efx_intr_type_t ei_type; 3855e111ed8SAndrew Rybchenko unsigned int ei_level; 3865e111ed8SAndrew Rybchenko } efx_intr_t; 3875e111ed8SAndrew Rybchenko 3885e111ed8SAndrew Rybchenko typedef struct efx_nic_ops_s { 3895e111ed8SAndrew Rybchenko efx_rc_t (*eno_probe)(efx_nic_t *); 3905e111ed8SAndrew Rybchenko efx_rc_t (*eno_board_cfg)(efx_nic_t *); 3915e111ed8SAndrew Rybchenko efx_rc_t (*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*); 3925e111ed8SAndrew Rybchenko efx_rc_t (*eno_reset)(efx_nic_t *); 3935e111ed8SAndrew Rybchenko efx_rc_t (*eno_init)(efx_nic_t *); 3945e111ed8SAndrew Rybchenko efx_rc_t (*eno_get_vi_pool)(efx_nic_t *, uint32_t *); 3955e111ed8SAndrew Rybchenko efx_rc_t (*eno_get_bar_region)(efx_nic_t *, efx_nic_region_t, 3965e111ed8SAndrew Rybchenko uint32_t *, size_t *); 3975e111ed8SAndrew Rybchenko boolean_t (*eno_hw_unavailable)(efx_nic_t *); 3985e111ed8SAndrew Rybchenko void (*eno_set_hw_unavailable)(efx_nic_t *); 3995e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 4005e111ed8SAndrew Rybchenko efx_rc_t (*eno_register_test)(efx_nic_t *); 4015e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 4025e111ed8SAndrew Rybchenko void (*eno_fini)(efx_nic_t *); 4035e111ed8SAndrew Rybchenko void (*eno_unprobe)(efx_nic_t *); 4045e111ed8SAndrew Rybchenko } efx_nic_ops_t; 4055e111ed8SAndrew Rybchenko 4065e111ed8SAndrew Rybchenko #ifndef EFX_TXQ_LIMIT_TARGET 4075e111ed8SAndrew Rybchenko #define EFX_TXQ_LIMIT_TARGET 259 4085e111ed8SAndrew Rybchenko #endif 4095e111ed8SAndrew Rybchenko #ifndef EFX_RXQ_LIMIT_TARGET 4105e111ed8SAndrew Rybchenko #define EFX_RXQ_LIMIT_TARGET 512 4115e111ed8SAndrew Rybchenko #endif 4125e111ed8SAndrew Rybchenko 4135e111ed8SAndrew Rybchenko 4145e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 4155e111ed8SAndrew Rybchenko 4165e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 4175e111ed8SAndrew Rybchenko 4185e111ed8SAndrew Rybchenko typedef struct siena_filter_spec_s { 4195e111ed8SAndrew Rybchenko uint8_t sfs_type; 4205e111ed8SAndrew Rybchenko uint32_t sfs_flags; 4215e111ed8SAndrew Rybchenko uint32_t sfs_dmaq_id; 4225e111ed8SAndrew Rybchenko uint32_t sfs_dword[3]; 4235e111ed8SAndrew Rybchenko } siena_filter_spec_t; 4245e111ed8SAndrew Rybchenko 4255e111ed8SAndrew Rybchenko typedef enum siena_filter_type_e { 4265e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4275e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_TCP_WILD, /* TCP/IPv4 {dIP,dTCP, -, -} */ 4285e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_UDP_FULL, /* UDP/IPv4 {dIP,dUDP,sIP,sUDP} */ 4295e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_UDP_WILD, /* UDP/IPv4 {dIP,dUDP, -, -} */ 4305e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_MAC_FULL, /* Ethernet {dMAC,VLAN} */ 4315e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_MAC_WILD, /* Ethernet {dMAC, -} */ 4325e111ed8SAndrew Rybchenko 4335e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4345e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_TCP_WILD, /* TCP/IPv4 { -, -,sIP,sTCP} */ 4355e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_UDP_FULL, /* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4365e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_UDP_WILD, /* UDP/IPv4 { -, -,sIP,sUDP} */ 4375e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_MAC_FULL, /* Ethernet {sMAC,VLAN} */ 4385e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_MAC_WILD, /* Ethernet {sMAC, -} */ 4395e111ed8SAndrew Rybchenko 4405e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_NTYPES 4415e111ed8SAndrew Rybchenko } siena_filter_type_t; 4425e111ed8SAndrew Rybchenko 4435e111ed8SAndrew Rybchenko typedef enum siena_filter_tbl_id_e { 4445e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_RX_IP = 0, 4455e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_RX_MAC, 4465e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_TX_IP, 4475e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_TX_MAC, 4485e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_NTBLS 4495e111ed8SAndrew Rybchenko } siena_filter_tbl_id_t; 4505e111ed8SAndrew Rybchenko 4515e111ed8SAndrew Rybchenko typedef struct siena_filter_tbl_s { 4525e111ed8SAndrew Rybchenko int sft_size; /* number of entries */ 4535e111ed8SAndrew Rybchenko int sft_used; /* active count */ 4545e111ed8SAndrew Rybchenko uint32_t *sft_bitmap; /* active bitmap */ 4555e111ed8SAndrew Rybchenko siena_filter_spec_t *sft_spec; /* array of saved specs */ 4565e111ed8SAndrew Rybchenko } siena_filter_tbl_t; 4575e111ed8SAndrew Rybchenko 4585e111ed8SAndrew Rybchenko typedef struct siena_filter_s { 4595e111ed8SAndrew Rybchenko siena_filter_tbl_t sf_tbl[EFX_SIENA_FILTER_NTBLS]; 4605e111ed8SAndrew Rybchenko unsigned int sf_depth[EFX_SIENA_FILTER_NTYPES]; 4615e111ed8SAndrew Rybchenko } siena_filter_t; 4625e111ed8SAndrew Rybchenko 4635e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 4645e111ed8SAndrew Rybchenko 4655e111ed8SAndrew Rybchenko typedef struct efx_filter_s { 4665e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 4675e111ed8SAndrew Rybchenko siena_filter_t *ef_siena_filter; 4685e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 469e1fe2c33SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 4705e111ed8SAndrew Rybchenko ef10_filter_table_t *ef_ef10_filter_table; 471e1fe2c33SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 4725e111ed8SAndrew Rybchenko } efx_filter_t; 4735e111ed8SAndrew Rybchenko 4745e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 4755e111ed8SAndrew Rybchenko 4765e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 4775e111ed8SAndrew Rybchenko extern void 4785e111ed8SAndrew Rybchenko siena_filter_tbl_clear( 4795e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 4805e111ed8SAndrew Rybchenko __in siena_filter_tbl_id_t tbl); 4815e111ed8SAndrew Rybchenko 4825e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 4835e111ed8SAndrew Rybchenko 4845e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 4855e111ed8SAndrew Rybchenko 4865e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 4875e111ed8SAndrew Rybchenko 4885e111ed8SAndrew Rybchenko #define EFX_TUNNEL_MAXNENTRIES (16) 4895e111ed8SAndrew Rybchenko 4905e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 4915e111ed8SAndrew Rybchenko 4925e111ed8SAndrew Rybchenko typedef struct efx_tunnel_udp_entry_s { 4935e111ed8SAndrew Rybchenko uint16_t etue_port; /* host/cpu-endian */ 4945e111ed8SAndrew Rybchenko uint16_t etue_protocol; 4955e111ed8SAndrew Rybchenko } efx_tunnel_udp_entry_t; 4965e111ed8SAndrew Rybchenko 4975e111ed8SAndrew Rybchenko typedef struct efx_tunnel_cfg_s { 4985e111ed8SAndrew Rybchenko efx_tunnel_udp_entry_t etc_udp_entries[EFX_TUNNEL_MAXNENTRIES]; 4995e111ed8SAndrew Rybchenko unsigned int etc_udp_entries_num; 5005e111ed8SAndrew Rybchenko } efx_tunnel_cfg_t; 5015e111ed8SAndrew Rybchenko 5025e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 5035e111ed8SAndrew Rybchenko 5045e111ed8SAndrew Rybchenko typedef struct efx_mcdi_ops_s { 5055e111ed8SAndrew Rybchenko efx_rc_t (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *); 5065e111ed8SAndrew Rybchenko void (*emco_send_request)(efx_nic_t *, void *, size_t, 5075e111ed8SAndrew Rybchenko void *, size_t); 5085e111ed8SAndrew Rybchenko efx_rc_t (*emco_poll_reboot)(efx_nic_t *); 5095e111ed8SAndrew Rybchenko boolean_t (*emco_poll_response)(efx_nic_t *); 5105e111ed8SAndrew Rybchenko void (*emco_read_response)(efx_nic_t *, void *, size_t, size_t); 5115e111ed8SAndrew Rybchenko void (*emco_fini)(efx_nic_t *); 5125e111ed8SAndrew Rybchenko efx_rc_t (*emco_feature_supported)(efx_nic_t *, 5135e111ed8SAndrew Rybchenko efx_mcdi_feature_id_t, boolean_t *); 5145e111ed8SAndrew Rybchenko void (*emco_get_timeout)(efx_nic_t *, efx_mcdi_req_t *, 5155e111ed8SAndrew Rybchenko uint32_t *); 5165e111ed8SAndrew Rybchenko } efx_mcdi_ops_t; 5175e111ed8SAndrew Rybchenko 5185e111ed8SAndrew Rybchenko typedef struct efx_mcdi_s { 5195e111ed8SAndrew Rybchenko const efx_mcdi_ops_t *em_emcop; 5205e111ed8SAndrew Rybchenko const efx_mcdi_transport_t *em_emtp; 5215e111ed8SAndrew Rybchenko efx_mcdi_iface_t em_emip; 5225e111ed8SAndrew Rybchenko } efx_mcdi_t; 5235e111ed8SAndrew Rybchenko 5245e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 5255e111ed8SAndrew Rybchenko 5265e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM 5275e111ed8SAndrew Rybchenko 5285e111ed8SAndrew Rybchenko /* Invalid partition ID for en_nvram_partn_locked field of efx_nc_t */ 5295e111ed8SAndrew Rybchenko #define EFX_NVRAM_PARTN_INVALID (0xffffffffu) 5305e111ed8SAndrew Rybchenko 5315e111ed8SAndrew Rybchenko typedef struct efx_nvram_ops_s { 5325e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 5335e111ed8SAndrew Rybchenko efx_rc_t (*envo_test)(efx_nic_t *); 5345e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 5355e111ed8SAndrew Rybchenko efx_rc_t (*envo_type_to_partn)(efx_nic_t *, efx_nvram_type_t, 5365e111ed8SAndrew Rybchenko uint32_t *); 5375e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_info)(efx_nic_t *, uint32_t, 5385e111ed8SAndrew Rybchenko efx_nvram_info_t *); 5395e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_rw_start)(efx_nic_t *, uint32_t, size_t *); 5405e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_read)(efx_nic_t *, uint32_t, 5415e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 5425e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_read_backup)(efx_nic_t *, uint32_t, 5435e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 5445e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_erase)(efx_nic_t *, uint32_t, 5455e111ed8SAndrew Rybchenko unsigned int, size_t); 5465e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_write)(efx_nic_t *, uint32_t, 5475e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 5485e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_rw_finish)(efx_nic_t *, uint32_t, 5495e111ed8SAndrew Rybchenko uint32_t *); 5505e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_get_version)(efx_nic_t *, uint32_t, 5515e111ed8SAndrew Rybchenko uint32_t *, uint16_t *); 5525e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_set_version)(efx_nic_t *, uint32_t, 5535e111ed8SAndrew Rybchenko uint16_t *); 5545e111ed8SAndrew Rybchenko efx_rc_t (*envo_buffer_validate)(uint32_t, 5555e111ed8SAndrew Rybchenko caddr_t, size_t); 5565e111ed8SAndrew Rybchenko } efx_nvram_ops_t; 5575e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM */ 5585e111ed8SAndrew Rybchenko 5595e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 5605e111ed8SAndrew Rybchenko typedef struct efx_vpd_ops_s { 5615e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_init)(efx_nic_t *); 5625e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_size)(efx_nic_t *, size_t *); 5635e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_read)(efx_nic_t *, caddr_t, size_t); 5645e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_verify)(efx_nic_t *, caddr_t, size_t); 5655e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_reinit)(efx_nic_t *, caddr_t, size_t); 5665e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_get)(efx_nic_t *, caddr_t, size_t, 5675e111ed8SAndrew Rybchenko efx_vpd_value_t *); 5685e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_set)(efx_nic_t *, caddr_t, size_t, 5695e111ed8SAndrew Rybchenko efx_vpd_value_t *); 5705e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_next)(efx_nic_t *, caddr_t, size_t, 5715e111ed8SAndrew Rybchenko efx_vpd_value_t *, unsigned int *); 5725e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_write)(efx_nic_t *, caddr_t, size_t); 5735e111ed8SAndrew Rybchenko void (*evpdo_fini)(efx_nic_t *); 5745e111ed8SAndrew Rybchenko } efx_vpd_ops_t; 5755e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 5765e111ed8SAndrew Rybchenko 5775e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM 5785e111ed8SAndrew Rybchenko 5795e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 5805e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 5815e111ed8SAndrew Rybchenko efx_mcdi_nvram_partitions( 5825e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 5835e111ed8SAndrew Rybchenko __out_bcount(size) caddr_t data, 5845e111ed8SAndrew Rybchenko __in size_t size, 5855e111ed8SAndrew Rybchenko __out unsigned int *npartnp); 5865e111ed8SAndrew Rybchenko 5875e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 5885e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 5895e111ed8SAndrew Rybchenko efx_mcdi_nvram_metadata( 5905e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 5915e111ed8SAndrew Rybchenko __in uint32_t partn, 5925e111ed8SAndrew Rybchenko __out uint32_t *subtypep, 5935e111ed8SAndrew Rybchenko __out_ecount(4) uint16_t version[4], 5945e111ed8SAndrew Rybchenko __out_bcount_opt(size) char *descp, 5955e111ed8SAndrew Rybchenko __in size_t size); 5965e111ed8SAndrew Rybchenko 5975e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 5985e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 5995e111ed8SAndrew Rybchenko efx_mcdi_nvram_info( 6005e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6015e111ed8SAndrew Rybchenko __in uint32_t partn, 6025e111ed8SAndrew Rybchenko __out efx_nvram_info_t *eni); 6035e111ed8SAndrew Rybchenko 6045e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6055e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6065e111ed8SAndrew Rybchenko efx_mcdi_nvram_update_start( 6075e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6085e111ed8SAndrew Rybchenko __in uint32_t partn); 6095e111ed8SAndrew Rybchenko 6105e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6115e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6125e111ed8SAndrew Rybchenko efx_mcdi_nvram_read( 6135e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6145e111ed8SAndrew Rybchenko __in uint32_t partn, 6155e111ed8SAndrew Rybchenko __in uint32_t offset, 6165e111ed8SAndrew Rybchenko __out_bcount(size) caddr_t data, 6175e111ed8SAndrew Rybchenko __in size_t size, 6185e111ed8SAndrew Rybchenko __in uint32_t mode); 6195e111ed8SAndrew Rybchenko 6205e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6215e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6225e111ed8SAndrew Rybchenko efx_mcdi_nvram_erase( 6235e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6245e111ed8SAndrew Rybchenko __in uint32_t partn, 6255e111ed8SAndrew Rybchenko __in uint32_t offset, 6265e111ed8SAndrew Rybchenko __in size_t size); 6275e111ed8SAndrew Rybchenko 6285e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6295e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6305e111ed8SAndrew Rybchenko efx_mcdi_nvram_write( 6315e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6325e111ed8SAndrew Rybchenko __in uint32_t partn, 6335e111ed8SAndrew Rybchenko __in uint32_t offset, 6345e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 6355e111ed8SAndrew Rybchenko __in size_t size); 6365e111ed8SAndrew Rybchenko 6375e111ed8SAndrew Rybchenko #define EFX_NVRAM_UPDATE_FLAGS_BACKGROUND 0x00000001 6385e111ed8SAndrew Rybchenko #define EFX_NVRAM_UPDATE_FLAGS_POLL 0x00000002 6395e111ed8SAndrew Rybchenko 6405e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6415e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6425e111ed8SAndrew Rybchenko efx_mcdi_nvram_update_finish( 6435e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6445e111ed8SAndrew Rybchenko __in uint32_t partn, 6455e111ed8SAndrew Rybchenko __in boolean_t reboot, 6465e111ed8SAndrew Rybchenko __in uint32_t flags, 6475e111ed8SAndrew Rybchenko __out_opt uint32_t *verify_resultp); 6485e111ed8SAndrew Rybchenko 6495e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 6505e111ed8SAndrew Rybchenko 6515e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6525e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6535e111ed8SAndrew Rybchenko efx_mcdi_nvram_test( 6545e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6555e111ed8SAndrew Rybchenko __in uint32_t partn); 6565e111ed8SAndrew Rybchenko 6575e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 6585e111ed8SAndrew Rybchenko 6595e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */ 6605e111ed8SAndrew Rybchenko 6615e111ed8SAndrew Rybchenko #if EFSYS_OPT_LICENSING 6625e111ed8SAndrew Rybchenko 6635e111ed8SAndrew Rybchenko typedef struct efx_lic_ops_s { 6645e111ed8SAndrew Rybchenko efx_rc_t (*elo_update_licenses)(efx_nic_t *); 6655e111ed8SAndrew Rybchenko efx_rc_t (*elo_get_key_stats)(efx_nic_t *, efx_key_stats_t *); 6665e111ed8SAndrew Rybchenko efx_rc_t (*elo_app_state)(efx_nic_t *, uint64_t, boolean_t *); 6675e111ed8SAndrew Rybchenko efx_rc_t (*elo_get_id)(efx_nic_t *, size_t, uint32_t *, 6685e111ed8SAndrew Rybchenko size_t *, uint8_t *); 6695e111ed8SAndrew Rybchenko efx_rc_t (*elo_find_start) 6705e111ed8SAndrew Rybchenko (efx_nic_t *, caddr_t, size_t, uint32_t *); 6715e111ed8SAndrew Rybchenko efx_rc_t (*elo_find_end)(efx_nic_t *, caddr_t, size_t, 6725e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 6735e111ed8SAndrew Rybchenko boolean_t (*elo_find_key)(efx_nic_t *, caddr_t, size_t, 6745e111ed8SAndrew Rybchenko uint32_t, uint32_t *, uint32_t *); 6755e111ed8SAndrew Rybchenko boolean_t (*elo_validate_key)(efx_nic_t *, 6765e111ed8SAndrew Rybchenko caddr_t, uint32_t); 6775e111ed8SAndrew Rybchenko efx_rc_t (*elo_read_key)(efx_nic_t *, 6785e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, uint32_t, 6795e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t *); 6805e111ed8SAndrew Rybchenko efx_rc_t (*elo_write_key)(efx_nic_t *, 6815e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, 6825e111ed8SAndrew Rybchenko caddr_t, uint32_t, uint32_t *); 6835e111ed8SAndrew Rybchenko efx_rc_t (*elo_delete_key)(efx_nic_t *, 6845e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, 6855e111ed8SAndrew Rybchenko uint32_t, uint32_t, uint32_t *); 6865e111ed8SAndrew Rybchenko efx_rc_t (*elo_create_partition)(efx_nic_t *, 6875e111ed8SAndrew Rybchenko caddr_t, size_t); 6885e111ed8SAndrew Rybchenko efx_rc_t (*elo_finish_partition)(efx_nic_t *, 6895e111ed8SAndrew Rybchenko caddr_t, size_t); 6905e111ed8SAndrew Rybchenko } efx_lic_ops_t; 6915e111ed8SAndrew Rybchenko 6925e111ed8SAndrew Rybchenko #endif 6935e111ed8SAndrew Rybchenko 6945e111ed8SAndrew Rybchenko #if EFSYS_OPT_EVB 6955e111ed8SAndrew Rybchenko 6965e111ed8SAndrew Rybchenko struct efx_vswitch_s { 6975e111ed8SAndrew Rybchenko efx_nic_t *ev_enp; 6985e111ed8SAndrew Rybchenko efx_vswitch_id_t ev_vswitch_id; 6995e111ed8SAndrew Rybchenko uint32_t ev_num_vports; 7005e111ed8SAndrew Rybchenko /* 7015e111ed8SAndrew Rybchenko * Vport configuration array: index 0 to store PF configuration 7025e111ed8SAndrew Rybchenko * and next ev_num_vports-1 entries hold VFs configuration. 7035e111ed8SAndrew Rybchenko */ 7045e111ed8SAndrew Rybchenko efx_vport_config_t *ev_evcp; 7055e111ed8SAndrew Rybchenko }; 7065e111ed8SAndrew Rybchenko 7075e111ed8SAndrew Rybchenko typedef struct efx_evb_ops_s { 7085e111ed8SAndrew Rybchenko efx_rc_t (*eeo_init)(efx_nic_t *); 7095e111ed8SAndrew Rybchenko void (*eeo_fini)(efx_nic_t *); 7105e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vswitch_alloc)(efx_nic_t *, efx_vswitch_id_t *); 7115e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vswitch_free)(efx_nic_t *, efx_vswitch_id_t); 7125e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_alloc)(efx_nic_t *, efx_vswitch_id_t, 7135e111ed8SAndrew Rybchenko efx_vport_type_t, uint16_t, 7145e111ed8SAndrew Rybchenko boolean_t, efx_vport_id_t *); 7155e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_free)(efx_nic_t *, efx_vswitch_id_t, 7165e111ed8SAndrew Rybchenko efx_vport_id_t); 7175e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_mac_addr_add)(efx_nic_t *, efx_vswitch_id_t, 7185e111ed8SAndrew Rybchenko efx_vport_id_t, uint8_t *); 7195e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_mac_addr_del)(efx_nic_t *, efx_vswitch_id_t, 7205e111ed8SAndrew Rybchenko efx_vport_id_t, uint8_t *); 7215e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vadaptor_alloc)(efx_nic_t *, efx_vswitch_id_t, 7225e111ed8SAndrew Rybchenko efx_vport_id_t); 7235e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vadaptor_free)(efx_nic_t *, efx_vswitch_id_t, 7245e111ed8SAndrew Rybchenko efx_vport_id_t); 7255e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_assign)(efx_nic_t *, efx_vswitch_id_t, 7265e111ed8SAndrew Rybchenko efx_vport_id_t, uint32_t); 7275e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_reconfigure)(efx_nic_t *, efx_vswitch_id_t, 7285e111ed8SAndrew Rybchenko efx_vport_id_t, 7295e111ed8SAndrew Rybchenko uint16_t *, uint8_t *, 7305e111ed8SAndrew Rybchenko boolean_t *); 7315e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_stats)(efx_nic_t *, efx_vswitch_id_t, 7325e111ed8SAndrew Rybchenko efx_vport_id_t, efsys_mem_t *); 7335e111ed8SAndrew Rybchenko } efx_evb_ops_t; 7345e111ed8SAndrew Rybchenko 7355e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 7365e111ed8SAndrew Rybchenko extern __checkReturn boolean_t 7375e111ed8SAndrew Rybchenko efx_is_zero_eth_addr( 7385e111ed8SAndrew Rybchenko __in_bcount(EFX_MAC_ADDR_LEN) const uint8_t *addrp); 7395e111ed8SAndrew Rybchenko 7405e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_EVB */ 7415e111ed8SAndrew Rybchenko 7425e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 7435e111ed8SAndrew Rybchenko 7445e111ed8SAndrew Rybchenko #define EFX_PROXY_CONFIGURE_MAGIC 0xAB2015EF 7455e111ed8SAndrew Rybchenko 7465e111ed8SAndrew Rybchenko 7475e111ed8SAndrew Rybchenko typedef struct efx_proxy_ops_s { 7485e111ed8SAndrew Rybchenko efx_rc_t (*epo_init)(efx_nic_t *); 7495e111ed8SAndrew Rybchenko void (*epo_fini)(efx_nic_t *); 7505e111ed8SAndrew Rybchenko efx_rc_t (*epo_mc_config)(efx_nic_t *, efsys_mem_t *, 7515e111ed8SAndrew Rybchenko efsys_mem_t *, efsys_mem_t *, 7525e111ed8SAndrew Rybchenko uint32_t, uint32_t *, size_t); 7535e111ed8SAndrew Rybchenko efx_rc_t (*epo_disable)(efx_nic_t *); 7545e111ed8SAndrew Rybchenko efx_rc_t (*epo_privilege_modify)(efx_nic_t *, uint32_t, uint32_t, 7555e111ed8SAndrew Rybchenko uint32_t, uint32_t, uint32_t); 7565e111ed8SAndrew Rybchenko efx_rc_t (*epo_set_privilege_mask)(efx_nic_t *, uint32_t, 7575e111ed8SAndrew Rybchenko uint32_t, uint32_t); 7585e111ed8SAndrew Rybchenko efx_rc_t (*epo_complete_request)(efx_nic_t *, uint32_t, 7595e111ed8SAndrew Rybchenko uint32_t, uint32_t); 7605e111ed8SAndrew Rybchenko efx_rc_t (*epo_exec_cmd)(efx_nic_t *, efx_proxy_cmd_params_t *); 7615e111ed8SAndrew Rybchenko efx_rc_t (*epo_get_privilege_mask)(efx_nic_t *, uint32_t, 7625e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 7635e111ed8SAndrew Rybchenko } efx_proxy_ops_t; 7645e111ed8SAndrew Rybchenko 7655e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 7665e111ed8SAndrew Rybchenko 7675e111ed8SAndrew Rybchenko #define EFX_DRV_VER_MAX 20 7685e111ed8SAndrew Rybchenko 7695e111ed8SAndrew Rybchenko typedef struct efx_drv_cfg_s { 7705e111ed8SAndrew Rybchenko uint32_t edc_min_vi_count; 7715e111ed8SAndrew Rybchenko uint32_t edc_max_vi_count; 7725e111ed8SAndrew Rybchenko 7735e111ed8SAndrew Rybchenko uint32_t edc_max_piobuf_count; 7745e111ed8SAndrew Rybchenko uint32_t edc_pio_alloc_size; 7755e111ed8SAndrew Rybchenko } efx_drv_cfg_t; 7765e111ed8SAndrew Rybchenko 7775e111ed8SAndrew Rybchenko struct efx_nic_s { 7785e111ed8SAndrew Rybchenko uint32_t en_magic; 7795e111ed8SAndrew Rybchenko efx_family_t en_family; 7805e111ed8SAndrew Rybchenko uint32_t en_features; 7815e111ed8SAndrew Rybchenko efsys_identifier_t *en_esip; 7825e111ed8SAndrew Rybchenko efsys_lock_t *en_eslp; 7835e111ed8SAndrew Rybchenko efsys_bar_t *en_esbp; 7845e111ed8SAndrew Rybchenko unsigned int en_mod_flags; 7855e111ed8SAndrew Rybchenko unsigned int en_reset_flags; 7865e111ed8SAndrew Rybchenko efx_nic_cfg_t en_nic_cfg; 7875e111ed8SAndrew Rybchenko efx_drv_cfg_t en_drv_cfg; 7885e111ed8SAndrew Rybchenko efx_port_t en_port; 7895e111ed8SAndrew Rybchenko efx_mon_t en_mon; 7905e111ed8SAndrew Rybchenko efx_intr_t en_intr; 7915e111ed8SAndrew Rybchenko uint32_t en_ev_qcount; 7925e111ed8SAndrew Rybchenko uint32_t en_rx_qcount; 7935e111ed8SAndrew Rybchenko uint32_t en_tx_qcount; 7945e111ed8SAndrew Rybchenko const efx_nic_ops_t *en_enop; 7955e111ed8SAndrew Rybchenko const efx_ev_ops_t *en_eevop; 7965e111ed8SAndrew Rybchenko const efx_tx_ops_t *en_etxop; 7975e111ed8SAndrew Rybchenko const efx_rx_ops_t *en_erxop; 7985e111ed8SAndrew Rybchenko efx_fw_variant_t efv; 7995e111ed8SAndrew Rybchenko char en_drv_version[EFX_DRV_VER_MAX]; 8005e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 8015e111ed8SAndrew Rybchenko efx_filter_t en_filter; 8025e111ed8SAndrew Rybchenko const efx_filter_ops_t *en_efop; 8035e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 8045e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 8055e111ed8SAndrew Rybchenko efx_tunnel_cfg_t en_tunnel_cfg; 8065e111ed8SAndrew Rybchenko const efx_tunnel_ops_t *en_etop; 8075e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 8085e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 8095e111ed8SAndrew Rybchenko efx_mcdi_t en_mcdi; 8105e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 8115e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM 8125e111ed8SAndrew Rybchenko uint32_t en_nvram_partn_locked; 8135e111ed8SAndrew Rybchenko const efx_nvram_ops_t *en_envop; 8145e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM */ 8155e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 8165e111ed8SAndrew Rybchenko const efx_vpd_ops_t *en_evpdop; 8175e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 8185e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCALE 8195e111ed8SAndrew Rybchenko efx_rx_hash_support_t en_hash_support; 8205e111ed8SAndrew Rybchenko efx_rx_scale_context_type_t en_rss_context_type; 8215e111ed8SAndrew Rybchenko uint32_t en_rss_context; 8225e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_RX_SCALE */ 8235e111ed8SAndrew Rybchenko uint32_t en_vport_id; 8245e111ed8SAndrew Rybchenko #if EFSYS_OPT_LICENSING 8255e111ed8SAndrew Rybchenko const efx_lic_ops_t *en_elop; 8265e111ed8SAndrew Rybchenko boolean_t en_licensing_supported; 8275e111ed8SAndrew Rybchenko #endif 8285e111ed8SAndrew Rybchenko union { 8295e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 8305e111ed8SAndrew Rybchenko struct { 8315e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 8325e111ed8SAndrew Rybchenko unsigned int enu_partn_mask; 8335e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 8345e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 8355e111ed8SAndrew Rybchenko caddr_t enu_svpd; 8365e111ed8SAndrew Rybchenko size_t enu_svpd_length; 8375e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 8385e111ed8SAndrew Rybchenko int enu_unused; 8395e111ed8SAndrew Rybchenko } siena; 8405e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 8415e111ed8SAndrew Rybchenko int enu_unused; 8425e111ed8SAndrew Rybchenko } en_u; 8433c1c5cc4SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 8445e111ed8SAndrew Rybchenko union en_arch { 8455e111ed8SAndrew Rybchenko struct { 8465e111ed8SAndrew Rybchenko int ena_vi_base; 8475e111ed8SAndrew Rybchenko int ena_vi_count; 8485e111ed8SAndrew Rybchenko int ena_vi_shift; 8495e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 8505e111ed8SAndrew Rybchenko caddr_t ena_svpd; 8515e111ed8SAndrew Rybchenko size_t ena_svpd_length; 8525e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 8535e111ed8SAndrew Rybchenko efx_piobuf_handle_t ena_piobuf_handle[EF10_MAX_PIOBUF_NBUFS]; 8545e111ed8SAndrew Rybchenko uint32_t ena_piobuf_count; 8555e111ed8SAndrew Rybchenko uint32_t ena_pio_alloc_map[EF10_MAX_PIOBUF_NBUFS]; 8565e111ed8SAndrew Rybchenko uint32_t ena_pio_write_vi_base; 8575e111ed8SAndrew Rybchenko /* Memory BAR mapping regions */ 8585e111ed8SAndrew Rybchenko uint32_t ena_uc_mem_map_offset; 8595e111ed8SAndrew Rybchenko size_t ena_uc_mem_map_size; 8605e111ed8SAndrew Rybchenko uint32_t ena_wc_mem_map_offset; 8615e111ed8SAndrew Rybchenko size_t ena_wc_mem_map_size; 8625e111ed8SAndrew Rybchenko } ef10; 8635e111ed8SAndrew Rybchenko } en_arch; 8643c1c5cc4SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 8655e111ed8SAndrew Rybchenko #if EFSYS_OPT_EVB 8665e111ed8SAndrew Rybchenko const efx_evb_ops_t *en_eeop; 8675e111ed8SAndrew Rybchenko struct efx_vswitch_s *en_vswitchp; 8685e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_EVB */ 8695e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 8705e111ed8SAndrew Rybchenko const efx_proxy_ops_t *en_epop; 8715e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 8725e111ed8SAndrew Rybchenko }; 8735e111ed8SAndrew Rybchenko 8745e111ed8SAndrew Rybchenko #define EFX_FAMILY_IS_EF10(_enp) \ 8755e111ed8SAndrew Rybchenko ((_enp)->en_family == EFX_FAMILY_MEDFORD2 || \ 8765e111ed8SAndrew Rybchenko (_enp)->en_family == EFX_FAMILY_MEDFORD || \ 8775e111ed8SAndrew Rybchenko (_enp)->en_family == EFX_FAMILY_HUNTINGTON) 8785e111ed8SAndrew Rybchenko 879206ef24fSAndrew Rybchenko #define EFX_FAMILY_IS_EF100(_enp) \ 880206ef24fSAndrew Rybchenko ((_enp)->en_family == EFX_FAMILY_RIVERHEAD) 881206ef24fSAndrew Rybchenko 8825e111ed8SAndrew Rybchenko 8835e111ed8SAndrew Rybchenko #define EFX_NIC_MAGIC 0x02121996 8845e111ed8SAndrew Rybchenko 8855e111ed8SAndrew Rybchenko typedef boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *, 8865e111ed8SAndrew Rybchenko const efx_ev_callbacks_t *, void *); 8875e111ed8SAndrew Rybchenko 8885e111ed8SAndrew Rybchenko typedef struct efx_evq_rxq_state_s { 8895e111ed8SAndrew Rybchenko unsigned int eers_rx_read_ptr; 8905e111ed8SAndrew Rybchenko unsigned int eers_rx_mask; 8915e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER 8925e111ed8SAndrew Rybchenko unsigned int eers_rx_stream_npackets; 8935e111ed8SAndrew Rybchenko boolean_t eers_rx_packed_stream; 8945e111ed8SAndrew Rybchenko #endif 8955e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 8965e111ed8SAndrew Rybchenko unsigned int eers_rx_packed_stream_credits; 8975e111ed8SAndrew Rybchenko #endif 8985e111ed8SAndrew Rybchenko } efx_evq_rxq_state_t; 8995e111ed8SAndrew Rybchenko 9005e111ed8SAndrew Rybchenko struct efx_evq_s { 9015e111ed8SAndrew Rybchenko uint32_t ee_magic; 9025e111ed8SAndrew Rybchenko uint32_t ee_flags; 9035e111ed8SAndrew Rybchenko efx_nic_t *ee_enp; 9045e111ed8SAndrew Rybchenko unsigned int ee_index; 9055e111ed8SAndrew Rybchenko unsigned int ee_mask; 9065e111ed8SAndrew Rybchenko efsys_mem_t *ee_esmp; 9075e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 9085e111ed8SAndrew Rybchenko uint32_t ee_stat[EV_NQSTATS]; 9095e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */ 9105e111ed8SAndrew Rybchenko 9115e111ed8SAndrew Rybchenko efx_ev_handler_t ee_rx; 9125e111ed8SAndrew Rybchenko efx_ev_handler_t ee_tx; 9135e111ed8SAndrew Rybchenko efx_ev_handler_t ee_driver; 9145e111ed8SAndrew Rybchenko efx_ev_handler_t ee_global; 9155e111ed8SAndrew Rybchenko efx_ev_handler_t ee_drv_gen; 9165e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 9175e111ed8SAndrew Rybchenko efx_ev_handler_t ee_mcdi; 9185e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 9195e111ed8SAndrew Rybchenko 9205e111ed8SAndrew Rybchenko efx_evq_rxq_state_t ee_rxq_state[EFX_EV_RX_NLABELS]; 9215e111ed8SAndrew Rybchenko }; 9225e111ed8SAndrew Rybchenko 9235e111ed8SAndrew Rybchenko #define EFX_EVQ_MAGIC 0x08081997 9245e111ed8SAndrew Rybchenko 9255e111ed8SAndrew Rybchenko #define EFX_EVQ_SIENA_TIMER_QUANTUM_NS 6144 /* 768 cycles */ 9265e111ed8SAndrew Rybchenko 9275e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 9285e111ed8SAndrew Rybchenko #define EFX_EV_QSTAT_INCR(_eep, _stat) \ 9295e111ed8SAndrew Rybchenko do { \ 9305e111ed8SAndrew Rybchenko (_eep)->ee_stat[_stat]++; \ 9315e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9325e111ed8SAndrew Rybchenko } while (B_FALSE) 9335e111ed8SAndrew Rybchenko #else 9345e111ed8SAndrew Rybchenko #define EFX_EV_QSTAT_INCR(_eep, _stat) 9355e111ed8SAndrew Rybchenko #endif 9365e111ed8SAndrew Rybchenko 9375e111ed8SAndrew Rybchenko struct efx_rxq_s { 9385e111ed8SAndrew Rybchenko uint32_t er_magic; 9395e111ed8SAndrew Rybchenko efx_nic_t *er_enp; 9405e111ed8SAndrew Rybchenko efx_evq_t *er_eep; 9415e111ed8SAndrew Rybchenko unsigned int er_index; 9425e111ed8SAndrew Rybchenko unsigned int er_label; 9435e111ed8SAndrew Rybchenko unsigned int er_mask; 9445e111ed8SAndrew Rybchenko size_t er_buf_size; 9455e111ed8SAndrew Rybchenko efsys_mem_t *er_esmp; 9465e111ed8SAndrew Rybchenko efx_evq_rxq_state_t *er_ev_qstate; 9475e111ed8SAndrew Rybchenko }; 9485e111ed8SAndrew Rybchenko 9495e111ed8SAndrew Rybchenko #define EFX_RXQ_MAGIC 0x15022005 9505e111ed8SAndrew Rybchenko 9515e111ed8SAndrew Rybchenko struct efx_txq_s { 9525e111ed8SAndrew Rybchenko uint32_t et_magic; 9535e111ed8SAndrew Rybchenko efx_nic_t *et_enp; 9545e111ed8SAndrew Rybchenko unsigned int et_index; 9555e111ed8SAndrew Rybchenko unsigned int et_mask; 9565e111ed8SAndrew Rybchenko efsys_mem_t *et_esmp; 9575e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON 9585e111ed8SAndrew Rybchenko uint32_t et_pio_bufnum; 9595e111ed8SAndrew Rybchenko uint32_t et_pio_blknum; 9605e111ed8SAndrew Rybchenko uint32_t et_pio_write_offset; 9615e111ed8SAndrew Rybchenko uint32_t et_pio_offset; 9625e111ed8SAndrew Rybchenko size_t et_pio_size; 9635e111ed8SAndrew Rybchenko #endif 9645e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 9655e111ed8SAndrew Rybchenko uint32_t et_stat[TX_NQSTATS]; 9665e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */ 9675e111ed8SAndrew Rybchenko }; 9685e111ed8SAndrew Rybchenko 9695e111ed8SAndrew Rybchenko #define EFX_TXQ_MAGIC 0x05092005 9705e111ed8SAndrew Rybchenko 9715e111ed8SAndrew Rybchenko #define EFX_MAC_ADDR_COPY(_dst, _src) \ 9725e111ed8SAndrew Rybchenko do { \ 9735e111ed8SAndrew Rybchenko (_dst)[0] = (_src)[0]; \ 9745e111ed8SAndrew Rybchenko (_dst)[1] = (_src)[1]; \ 9755e111ed8SAndrew Rybchenko (_dst)[2] = (_src)[2]; \ 9765e111ed8SAndrew Rybchenko (_dst)[3] = (_src)[3]; \ 9775e111ed8SAndrew Rybchenko (_dst)[4] = (_src)[4]; \ 9785e111ed8SAndrew Rybchenko (_dst)[5] = (_src)[5]; \ 9795e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9805e111ed8SAndrew Rybchenko } while (B_FALSE) 9815e111ed8SAndrew Rybchenko 9825e111ed8SAndrew Rybchenko #define EFX_MAC_BROADCAST_ADDR_SET(_dst) \ 9835e111ed8SAndrew Rybchenko do { \ 9845e111ed8SAndrew Rybchenko uint16_t *_d = (uint16_t *)(_dst); \ 9855e111ed8SAndrew Rybchenko _d[0] = 0xffff; \ 9865e111ed8SAndrew Rybchenko _d[1] = 0xffff; \ 9875e111ed8SAndrew Rybchenko _d[2] = 0xffff; \ 9885e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9895e111ed8SAndrew Rybchenko } while (B_FALSE) 9905e111ed8SAndrew Rybchenko 9915e111ed8SAndrew Rybchenko #if EFSYS_OPT_CHECK_REG 9925e111ed8SAndrew Rybchenko #define EFX_CHECK_REG(_enp, _reg) \ 9935e111ed8SAndrew Rybchenko do { \ 9945e111ed8SAndrew Rybchenko const char *name = #_reg; \ 9955e111ed8SAndrew Rybchenko char min = name[4]; \ 9965e111ed8SAndrew Rybchenko char max = name[5]; \ 9975e111ed8SAndrew Rybchenko char rev; \ 9985e111ed8SAndrew Rybchenko \ 9995e111ed8SAndrew Rybchenko switch ((_enp)->en_family) { \ 10005e111ed8SAndrew Rybchenko case EFX_FAMILY_SIENA: \ 10015e111ed8SAndrew Rybchenko rev = 'C'; \ 10025e111ed8SAndrew Rybchenko break; \ 10035e111ed8SAndrew Rybchenko \ 10045e111ed8SAndrew Rybchenko case EFX_FAMILY_HUNTINGTON: \ 10055e111ed8SAndrew Rybchenko rev = 'D'; \ 10065e111ed8SAndrew Rybchenko break; \ 10075e111ed8SAndrew Rybchenko \ 10085e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD: \ 10095e111ed8SAndrew Rybchenko rev = 'E'; \ 10105e111ed8SAndrew Rybchenko break; \ 10115e111ed8SAndrew Rybchenko \ 10125e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD2: \ 10135e111ed8SAndrew Rybchenko rev = 'F'; \ 10145e111ed8SAndrew Rybchenko break; \ 10155e111ed8SAndrew Rybchenko \ 101682c17c52SAndrew Rybchenko case EFX_FAMILY_RIVERHEAD: \ 101782c17c52SAndrew Rybchenko rev = 'G'; \ 101882c17c52SAndrew Rybchenko break; \ 101982c17c52SAndrew Rybchenko \ 10205e111ed8SAndrew Rybchenko default: \ 10215e111ed8SAndrew Rybchenko rev = '?'; \ 10225e111ed8SAndrew Rybchenko break; \ 10235e111ed8SAndrew Rybchenko } \ 10245e111ed8SAndrew Rybchenko \ 10255e111ed8SAndrew Rybchenko EFSYS_ASSERT3S(rev, >=, min); \ 10265e111ed8SAndrew Rybchenko EFSYS_ASSERT3S(rev, <=, max); \ 10275e111ed8SAndrew Rybchenko \ 10285e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10295e111ed8SAndrew Rybchenko } while (B_FALSE) 10305e111ed8SAndrew Rybchenko #else 10315e111ed8SAndrew Rybchenko #define EFX_CHECK_REG(_enp, _reg) do { \ 10325e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10335e111ed8SAndrew Rybchenko } while (B_FALSE) 10345e111ed8SAndrew Rybchenko #endif 10355e111ed8SAndrew Rybchenko 10365e111ed8SAndrew Rybchenko #define EFX_BAR_READD(_enp, _reg, _edp, _lock) \ 10375e111ed8SAndrew Rybchenko do { \ 10385e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 10395e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST, \ 10405e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 10415e111ed8SAndrew Rybchenko EFSYS_PROBE3(efx_bar_readd, const char *, #_reg, \ 10425e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 10435e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 10445e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10455e111ed8SAndrew Rybchenko } while (B_FALSE) 10465e111ed8SAndrew Rybchenko 10475e111ed8SAndrew Rybchenko #define EFX_BAR_WRITED(_enp, _reg, _edp, _lock) \ 10485e111ed8SAndrew Rybchenko do { \ 10495e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 10505e111ed8SAndrew Rybchenko EFSYS_PROBE3(efx_bar_writed, const char *, #_reg, \ 10515e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 10525e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 10535e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST, \ 10545e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 10555e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10565e111ed8SAndrew Rybchenko } while (B_FALSE) 10575e111ed8SAndrew Rybchenko 10585e111ed8SAndrew Rybchenko #define EFX_BAR_READQ(_enp, _reg, _eqp) \ 10595e111ed8SAndrew Rybchenko do { \ 10605e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 10615e111ed8SAndrew Rybchenko EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST, \ 10625e111ed8SAndrew Rybchenko (_eqp)); \ 10635e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_readq, const char *, #_reg, \ 10645e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 10655e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 10665e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 10675e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10685e111ed8SAndrew Rybchenko } while (B_FALSE) 10695e111ed8SAndrew Rybchenko 10705e111ed8SAndrew Rybchenko #define EFX_BAR_WRITEQ(_enp, _reg, _eqp) \ 10715e111ed8SAndrew Rybchenko do { \ 10725e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 10735e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_writeq, const char *, #_reg, \ 10745e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 10755e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 10765e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 10775e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST, \ 10785e111ed8SAndrew Rybchenko (_eqp)); \ 10795e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10805e111ed8SAndrew Rybchenko } while (B_FALSE) 10815e111ed8SAndrew Rybchenko 10825e111ed8SAndrew Rybchenko #define EFX_BAR_READO(_enp, _reg, _eop) \ 10835e111ed8SAndrew Rybchenko do { \ 10845e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 10855e111ed8SAndrew Rybchenko EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST, \ 10865e111ed8SAndrew Rybchenko (_eop), B_TRUE); \ 10875e111ed8SAndrew Rybchenko EFSYS_PROBE6(efx_bar_reado, const char *, #_reg, \ 10885e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 10895e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 10905e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 10915e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 10925e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 10935e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10945e111ed8SAndrew Rybchenko } while (B_FALSE) 10955e111ed8SAndrew Rybchenko 10965e111ed8SAndrew Rybchenko #define EFX_BAR_WRITEO(_enp, _reg, _eop) \ 10975e111ed8SAndrew Rybchenko do { \ 10985e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 10995e111ed8SAndrew Rybchenko EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg, \ 11005e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11015e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 11025e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 11035e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 11045e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 11055e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST, \ 11065e111ed8SAndrew Rybchenko (_eop), B_TRUE); \ 11075e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11085e111ed8SAndrew Rybchenko } while (B_FALSE) 11095e111ed8SAndrew Rybchenko 11105e111ed8SAndrew Rybchenko /* 11115e111ed8SAndrew Rybchenko * Accessors for memory BAR non-VI tables. 11125e111ed8SAndrew Rybchenko * 11135e111ed8SAndrew Rybchenko * Code used on EF10 *must* use EFX_BAR_VI_*() macros for per-VI registers, 11145e111ed8SAndrew Rybchenko * to ensure the correct runtime VI window size is used on Medford2. 11155e111ed8SAndrew Rybchenko * 11165e111ed8SAndrew Rybchenko * Siena-only code may continue using EFX_BAR_TBL_*() macros for VI registers. 11175e111ed8SAndrew Rybchenko */ 11185e111ed8SAndrew Rybchenko 11195e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock) \ 11205e111ed8SAndrew Rybchenko do { \ 11215e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11225e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, \ 11235e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 11245e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11255e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg, \ 11265e111ed8SAndrew Rybchenko uint32_t, (_index), \ 11275e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11285e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11295e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11305e111ed8SAndrew Rybchenko } while (B_FALSE) 11315e111ed8SAndrew Rybchenko 11325e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock) \ 11335e111ed8SAndrew Rybchenko do { \ 11345e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11355e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 11365e111ed8SAndrew Rybchenko uint32_t, (_index), \ 11375e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11385e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11395e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 11405e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 11415e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11425e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11435e111ed8SAndrew Rybchenko } while (B_FALSE) 11445e111ed8SAndrew Rybchenko 11455e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock) \ 11465e111ed8SAndrew Rybchenko do { \ 11475e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11485e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 11495e111ed8SAndrew Rybchenko uint32_t, (_index), \ 11505e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11515e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11525e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 11535e111ed8SAndrew Rybchenko (_reg ## _OFST + \ 11545e111ed8SAndrew Rybchenko (3 * sizeof (efx_dword_t)) + \ 11555e111ed8SAndrew Rybchenko ((_index) * _reg ## _STEP)), \ 11565e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11575e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11585e111ed8SAndrew Rybchenko } while (B_FALSE) 11595e111ed8SAndrew Rybchenko 11605e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp) \ 11615e111ed8SAndrew Rybchenko do { \ 11625e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11635e111ed8SAndrew Rybchenko EFSYS_BAR_READQ((_enp)->en_esbp, \ 11645e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 11655e111ed8SAndrew Rybchenko (_eqp)); \ 11665e111ed8SAndrew Rybchenko EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg, \ 11675e111ed8SAndrew Rybchenko uint32_t, (_index), \ 11685e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11695e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 11705e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 11715e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11725e111ed8SAndrew Rybchenko } while (B_FALSE) 11735e111ed8SAndrew Rybchenko 11745e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp) \ 11755e111ed8SAndrew Rybchenko do { \ 11765e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11775e111ed8SAndrew Rybchenko EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg, \ 11785e111ed8SAndrew Rybchenko uint32_t, (_index), \ 11795e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11805e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 11815e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 11825e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEQ((_enp)->en_esbp, \ 11835e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 11845e111ed8SAndrew Rybchenko (_eqp)); \ 11855e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11865e111ed8SAndrew Rybchenko } while (B_FALSE) 11875e111ed8SAndrew Rybchenko 11885e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READO(_enp, _reg, _index, _eop, _lock) \ 11895e111ed8SAndrew Rybchenko do { \ 11905e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11915e111ed8SAndrew Rybchenko EFSYS_BAR_READO((_enp)->en_esbp, \ 11925e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 11935e111ed8SAndrew Rybchenko (_eop), (_lock)); \ 11945e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg, \ 11955e111ed8SAndrew Rybchenko uint32_t, (_index), \ 11965e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11975e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 11985e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 11995e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 12005e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 12015e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12025e111ed8SAndrew Rybchenko } while (B_FALSE) 12035e111ed8SAndrew Rybchenko 12045e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop, _lock) \ 12055e111ed8SAndrew Rybchenko do { \ 12065e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12075e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg, \ 12085e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12095e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12105e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 12115e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 12125e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 12135e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 12145e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEO((_enp)->en_esbp, \ 12155e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12165e111ed8SAndrew Rybchenko (_eop), (_lock)); \ 12175e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12185e111ed8SAndrew Rybchenko } while (B_FALSE) 12195e111ed8SAndrew Rybchenko 12205e111ed8SAndrew Rybchenko /* 12215e111ed8SAndrew Rybchenko * Accessors for memory BAR per-VI registers. 12225e111ed8SAndrew Rybchenko * 12235e111ed8SAndrew Rybchenko * The VI window size is 8KB for Medford and all earlier controllers. 12245e111ed8SAndrew Rybchenko * For Medford2, the VI window size can be 8KB, 16KB or 64KB. 12255e111ed8SAndrew Rybchenko */ 12265e111ed8SAndrew Rybchenko 12275e111ed8SAndrew Rybchenko #define EFX_BAR_VI_READD(_enp, _reg, _index, _edp, _lock) \ 12285e111ed8SAndrew Rybchenko do { \ 12295e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12305e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, \ 12315e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 12325e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 12335e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12345e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_readd, const char *, #_reg, \ 12355e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12365e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12375e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12385e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12395e111ed8SAndrew Rybchenko } while (B_FALSE) 12405e111ed8SAndrew Rybchenko 12415e111ed8SAndrew Rybchenko #define EFX_BAR_VI_WRITED(_enp, _reg, _index, _edp, _lock) \ 12425e111ed8SAndrew Rybchenko do { \ 12435e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12445e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_writed, const char *, #_reg, \ 12455e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12465e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12475e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12485e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 12495e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 12505e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 12515e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12525e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12535e111ed8SAndrew Rybchenko } while (B_FALSE) 12545e111ed8SAndrew Rybchenko 12555e111ed8SAndrew Rybchenko #define EFX_BAR_VI_WRITED2(_enp, _reg, _index, _edp, _lock) \ 12565e111ed8SAndrew Rybchenko do { \ 12575e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12585e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_writed, const char *, #_reg, \ 12595e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12605e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12615e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12625e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 12635e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 12645e111ed8SAndrew Rybchenko (2 * sizeof (efx_dword_t)) + \ 12655e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 12665e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12675e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12685e111ed8SAndrew Rybchenko } while (B_FALSE) 12695e111ed8SAndrew Rybchenko 12705e111ed8SAndrew Rybchenko /* 12715e111ed8SAndrew Rybchenko * Allow drivers to perform optimised 128-bit VI doorbell writes. 12725e111ed8SAndrew Rybchenko * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are 12735e111ed8SAndrew Rybchenko * special-cased in the BIU on the Falcon/Siena and EF10 architectures to avoid 12745e111ed8SAndrew Rybchenko * the need for locking in the host, and are the only ones known to be safe to 12755e111ed8SAndrew Rybchenko * use 128-bites write with. 12765e111ed8SAndrew Rybchenko */ 12775e111ed8SAndrew Rybchenko #define EFX_BAR_VI_DOORBELL_WRITEO(_enp, _reg, _index, _eop) \ 12785e111ed8SAndrew Rybchenko do { \ 12795e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12805e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_vi_doorbell_writeo, \ 12815e111ed8SAndrew Rybchenko const char *, #_reg, \ 12825e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12835e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12845e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 12855e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 12865e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 12875e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 12885e111ed8SAndrew Rybchenko EFSYS_BAR_DOORBELL_WRITEO((_enp)->en_esbp, \ 12895e111ed8SAndrew Rybchenko (_reg ## _OFST + \ 12905e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 12915e111ed8SAndrew Rybchenko (_eop)); \ 12925e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12935e111ed8SAndrew Rybchenko } while (B_FALSE) 12945e111ed8SAndrew Rybchenko 12955e111ed8SAndrew Rybchenko #define EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _wptr, _owptr) \ 12965e111ed8SAndrew Rybchenko do { \ 12975e111ed8SAndrew Rybchenko unsigned int _new = (_wptr); \ 12985e111ed8SAndrew Rybchenko unsigned int _old = (_owptr); \ 12995e111ed8SAndrew Rybchenko \ 13005e111ed8SAndrew Rybchenko if ((_new) >= (_old)) \ 13015e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 13025e111ed8SAndrew Rybchenko (_old) * sizeof (efx_desc_t), \ 13035e111ed8SAndrew Rybchenko ((_new) - (_old)) * sizeof (efx_desc_t)); \ 13045e111ed8SAndrew Rybchenko else \ 13055e111ed8SAndrew Rybchenko /* \ 13065e111ed8SAndrew Rybchenko * It is cheaper to sync entire map than sync \ 13075e111ed8SAndrew Rybchenko * two parts especially when offset/size are \ 13085e111ed8SAndrew Rybchenko * ignored and entire map is synced in any case.\ 13095e111ed8SAndrew Rybchenko */ \ 13105e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 13115e111ed8SAndrew Rybchenko 0, \ 13125e111ed8SAndrew Rybchenko (_entries) * sizeof (efx_desc_t)); \ 13135e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13145e111ed8SAndrew Rybchenko } while (B_FALSE) 13155e111ed8SAndrew Rybchenko 13165e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13175e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13185e111ed8SAndrew Rybchenko efx_mac_select( 13195e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 13205e111ed8SAndrew Rybchenko 13215e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13225e111ed8SAndrew Rybchenko extern void 13235e111ed8SAndrew Rybchenko efx_mac_multicast_hash_compute( 13245e111ed8SAndrew Rybchenko __in_ecount(6*count) uint8_t const *addrs, 13255e111ed8SAndrew Rybchenko __in int count, 13265e111ed8SAndrew Rybchenko __out efx_oword_t *hash_low, 13275e111ed8SAndrew Rybchenko __out efx_oword_t *hash_high); 13285e111ed8SAndrew Rybchenko 13295e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13305e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13315e111ed8SAndrew Rybchenko efx_phy_probe( 13325e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 13335e111ed8SAndrew Rybchenko 13345e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13355e111ed8SAndrew Rybchenko extern void 13365e111ed8SAndrew Rybchenko efx_phy_unprobe( 13375e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 13385e111ed8SAndrew Rybchenko 13395e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 13405e111ed8SAndrew Rybchenko 13415e111ed8SAndrew Rybchenko /* VPD utility functions */ 13425e111ed8SAndrew Rybchenko 13435e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13445e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13455e111ed8SAndrew Rybchenko efx_vpd_hunk_length( 13465e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 13475e111ed8SAndrew Rybchenko __in size_t size, 13485e111ed8SAndrew Rybchenko __out size_t *lengthp); 13495e111ed8SAndrew Rybchenko 13505e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13515e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13525e111ed8SAndrew Rybchenko efx_vpd_hunk_verify( 13535e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 13545e111ed8SAndrew Rybchenko __in size_t size, 13555e111ed8SAndrew Rybchenko __out_opt boolean_t *cksummedp); 13565e111ed8SAndrew Rybchenko 13575e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13585e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13595e111ed8SAndrew Rybchenko efx_vpd_hunk_reinit( 13605e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 13615e111ed8SAndrew Rybchenko __in size_t size, 13625e111ed8SAndrew Rybchenko __in boolean_t wantpid); 13635e111ed8SAndrew Rybchenko 13645e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13655e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13665e111ed8SAndrew Rybchenko efx_vpd_hunk_get( 13675e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 13685e111ed8SAndrew Rybchenko __in size_t size, 13695e111ed8SAndrew Rybchenko __in efx_vpd_tag_t tag, 13705e111ed8SAndrew Rybchenko __in efx_vpd_keyword_t keyword, 13715e111ed8SAndrew Rybchenko __out unsigned int *payloadp, 13725e111ed8SAndrew Rybchenko __out uint8_t *paylenp); 13735e111ed8SAndrew Rybchenko 13745e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13755e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13765e111ed8SAndrew Rybchenko efx_vpd_hunk_next( 13775e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 13785e111ed8SAndrew Rybchenko __in size_t size, 13795e111ed8SAndrew Rybchenko __out efx_vpd_tag_t *tagp, 13805e111ed8SAndrew Rybchenko __out efx_vpd_keyword_t *keyword, 13815e111ed8SAndrew Rybchenko __out_opt unsigned int *payloadp, 13825e111ed8SAndrew Rybchenko __out_opt uint8_t *paylenp, 13835e111ed8SAndrew Rybchenko __inout unsigned int *contp); 13845e111ed8SAndrew Rybchenko 13855e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13865e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13875e111ed8SAndrew Rybchenko efx_vpd_hunk_set( 13885e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 13895e111ed8SAndrew Rybchenko __in size_t size, 13905e111ed8SAndrew Rybchenko __in efx_vpd_value_t *evvp); 13915e111ed8SAndrew Rybchenko 13925e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 13935e111ed8SAndrew Rybchenko 13945e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 13955e111ed8SAndrew Rybchenko 13965e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 13975e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 13985e111ed8SAndrew Rybchenko efx_mcdi_set_workaround( 13995e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 14005e111ed8SAndrew Rybchenko __in uint32_t type, 14015e111ed8SAndrew Rybchenko __in boolean_t enabled, 14025e111ed8SAndrew Rybchenko __out_opt uint32_t *flagsp); 14035e111ed8SAndrew Rybchenko 14045e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14055e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14065e111ed8SAndrew Rybchenko efx_mcdi_get_workarounds( 14075e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 14085e111ed8SAndrew Rybchenko __out_opt uint32_t *implementedp, 14095e111ed8SAndrew Rybchenko __out_opt uint32_t *enabledp); 14105e111ed8SAndrew Rybchenko 1411b97bf1caSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 141285270581SAndrew Rybchenko 141385270581SAndrew Rybchenko LIBEFX_INTERNAL 141485270581SAndrew Rybchenko extern __checkReturn efx_rc_t 141585270581SAndrew Rybchenko efx_mcdi_init_evq( 141685270581SAndrew Rybchenko __in efx_nic_t *enp, 141785270581SAndrew Rybchenko __in unsigned int instance, 141885270581SAndrew Rybchenko __in efsys_mem_t *esmp, 141985270581SAndrew Rybchenko __in size_t nevs, 142085270581SAndrew Rybchenko __in uint32_t irq, 142185270581SAndrew Rybchenko __in uint32_t us, 142285270581SAndrew Rybchenko __in uint32_t flags, 142385270581SAndrew Rybchenko __in boolean_t low_latency); 142485270581SAndrew Rybchenko 142585270581SAndrew Rybchenko LIBEFX_INTERNAL 142685270581SAndrew Rybchenko extern __checkReturn efx_rc_t 142785270581SAndrew Rybchenko efx_mcdi_fini_evq( 142885270581SAndrew Rybchenko __in efx_nic_t *enp, 142985270581SAndrew Rybchenko __in uint32_t instance); 143085270581SAndrew Rybchenko 1431b97bf1caSAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 143285270581SAndrew Rybchenko 1433*09b59c7dSAndrew Rybchenko #if EFX_OPTS_EF10() 1434*09b59c7dSAndrew Rybchenko 1435*09b59c7dSAndrew Rybchenko LIBEFX_INTERNAL 1436*09b59c7dSAndrew Rybchenko extern __checkReturn efx_rc_t 1437*09b59c7dSAndrew Rybchenko efx_mcdi_init_rxq( 1438*09b59c7dSAndrew Rybchenko __in efx_nic_t *enp, 1439*09b59c7dSAndrew Rybchenko __in uint32_t ndescs, 1440*09b59c7dSAndrew Rybchenko __in efx_evq_t *eep, 1441*09b59c7dSAndrew Rybchenko __in uint32_t label, 1442*09b59c7dSAndrew Rybchenko __in uint32_t instance, 1443*09b59c7dSAndrew Rybchenko __in efsys_mem_t *esmp, 1444*09b59c7dSAndrew Rybchenko __in boolean_t disable_scatter, 1445*09b59c7dSAndrew Rybchenko __in boolean_t want_inner_classes, 1446*09b59c7dSAndrew Rybchenko __in uint32_t buf_size, 1447*09b59c7dSAndrew Rybchenko __in uint32_t ps_bufsize, 1448*09b59c7dSAndrew Rybchenko __in uint32_t es_bufs_per_desc, 1449*09b59c7dSAndrew Rybchenko __in uint32_t es_max_dma_len, 1450*09b59c7dSAndrew Rybchenko __in uint32_t es_buf_stride, 1451*09b59c7dSAndrew Rybchenko __in uint32_t hol_block_timeout); 1452*09b59c7dSAndrew Rybchenko 1453*09b59c7dSAndrew Rybchenko LIBEFX_INTERNAL 1454*09b59c7dSAndrew Rybchenko extern __checkReturn efx_rc_t 1455*09b59c7dSAndrew Rybchenko efx_mcdi_fini_rxq( 1456*09b59c7dSAndrew Rybchenko __in efx_nic_t *enp, 1457*09b59c7dSAndrew Rybchenko __in uint32_t instance); 1458*09b59c7dSAndrew Rybchenko 1459*09b59c7dSAndrew Rybchenko #endif /* EFX_OPTS_EF10() */ 1460*09b59c7dSAndrew Rybchenko 14615e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 14625e111ed8SAndrew Rybchenko 14635e111ed8SAndrew Rybchenko #if EFSYS_OPT_MAC_STATS 14645e111ed8SAndrew Rybchenko 14655e111ed8SAndrew Rybchenko /* 14665e111ed8SAndrew Rybchenko * Closed range of stats (i.e. the first and the last are included). 14675e111ed8SAndrew Rybchenko * The last must be greater or equal (if the range is one item only) to 14685e111ed8SAndrew Rybchenko * the first. 14695e111ed8SAndrew Rybchenko */ 14705e111ed8SAndrew Rybchenko struct efx_mac_stats_range { 14715e111ed8SAndrew Rybchenko efx_mac_stat_t first; 14725e111ed8SAndrew Rybchenko efx_mac_stat_t last; 14735e111ed8SAndrew Rybchenko }; 14745e111ed8SAndrew Rybchenko 14755e111ed8SAndrew Rybchenko typedef enum efx_stats_action_e { 14765e111ed8SAndrew Rybchenko EFX_STATS_CLEAR, 14775e111ed8SAndrew Rybchenko EFX_STATS_UPLOAD, 14785e111ed8SAndrew Rybchenko EFX_STATS_ENABLE_NOEVENTS, 14795e111ed8SAndrew Rybchenko EFX_STATS_ENABLE_EVENTS, 14805e111ed8SAndrew Rybchenko EFX_STATS_DISABLE, 14815e111ed8SAndrew Rybchenko } efx_stats_action_t; 14825e111ed8SAndrew Rybchenko 14835e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14845e111ed8SAndrew Rybchenko extern efx_rc_t 14855e111ed8SAndrew Rybchenko efx_mac_stats_mask_add_ranges( 14865e111ed8SAndrew Rybchenko __inout_bcount(mask_size) uint32_t *maskp, 14875e111ed8SAndrew Rybchenko __in size_t mask_size, 14885e111ed8SAndrew Rybchenko __in_ecount(rng_count) const struct efx_mac_stats_range *rngp, 14895e111ed8SAndrew Rybchenko __in unsigned int rng_count); 14905e111ed8SAndrew Rybchenko 14915e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14925e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14935e111ed8SAndrew Rybchenko efx_mcdi_mac_stats( 14945e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 14955e111ed8SAndrew Rybchenko __in uint32_t vport_id, 14965e111ed8SAndrew Rybchenko __in_opt efsys_mem_t *esmp, 14975e111ed8SAndrew Rybchenko __in efx_stats_action_t action, 14985e111ed8SAndrew Rybchenko __in uint16_t period_ms); 14995e111ed8SAndrew Rybchenko 15005e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MAC_STATS */ 15015e111ed8SAndrew Rybchenko 15025e111ed8SAndrew Rybchenko #ifdef __cplusplus 15035e111ed8SAndrew Rybchenko } 15045e111ed8SAndrew Rybchenko #endif 15055e111ed8SAndrew Rybchenko 15065e111ed8SAndrew Rybchenko #endif /* _SYS_EFX_IMPL_H */ 1507