15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause 25e111ed8SAndrew Rybchenko * 3672386c1SAndrew Rybchenko * Copyright(c) 2019-2021 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 684dda72dbSVijay Srivastava #define EFX_MOD_VIRTIO 0x00020000 695e111ed8SAndrew Rybchenko 705e111ed8SAndrew Rybchenko #define EFX_RESET_PHY 0x00000001 715e111ed8SAndrew Rybchenko #define EFX_RESET_RXQ_ERR 0x00000002 725e111ed8SAndrew Rybchenko #define EFX_RESET_TXQ_ERR 0x00000004 735e111ed8SAndrew Rybchenko #define EFX_RESET_HW_UNAVAIL 0x00000008 745e111ed8SAndrew Rybchenko 755e111ed8SAndrew Rybchenko typedef enum efx_mac_type_e { 765e111ed8SAndrew Rybchenko EFX_MAC_INVALID = 0, 775e111ed8SAndrew Rybchenko EFX_MAC_SIENA, 785e111ed8SAndrew Rybchenko EFX_MAC_HUNTINGTON, 795e111ed8SAndrew Rybchenko EFX_MAC_MEDFORD, 805e111ed8SAndrew Rybchenko EFX_MAC_MEDFORD2, 81de0d268fSAndrew Rybchenko EFX_MAC_RIVERHEAD, 825e111ed8SAndrew Rybchenko EFX_MAC_NTYPES 835e111ed8SAndrew Rybchenko } efx_mac_type_t; 845e111ed8SAndrew Rybchenko 855e111ed8SAndrew Rybchenko typedef struct efx_ev_ops_s { 865e111ed8SAndrew Rybchenko efx_rc_t (*eevo_init)(efx_nic_t *); 875e111ed8SAndrew Rybchenko void (*eevo_fini)(efx_nic_t *); 885e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qcreate)(efx_nic_t *, unsigned int, 895e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, uint32_t, 90aa6dc101SAndrew Rybchenko uint32_t, uint32_t, uint32_t, 91aa6dc101SAndrew Rybchenko efx_evq_t *); 925e111ed8SAndrew Rybchenko void (*eevo_qdestroy)(efx_evq_t *); 935e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qprime)(efx_evq_t *, unsigned int); 945e111ed8SAndrew Rybchenko void (*eevo_qpost)(efx_evq_t *, uint16_t); 95ad1e3ed8SAndrew Rybchenko void (*eevo_qpoll)(efx_evq_t *, unsigned int *, 96ad1e3ed8SAndrew Rybchenko const efx_ev_callbacks_t *, void *); 975e111ed8SAndrew Rybchenko efx_rc_t (*eevo_qmoderate)(efx_evq_t *, unsigned int); 985e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 995e111ed8SAndrew Rybchenko void (*eevo_qstats_update)(efx_evq_t *, efsys_stat_t *); 1005e111ed8SAndrew Rybchenko #endif 1015e111ed8SAndrew Rybchenko } efx_ev_ops_t; 1025e111ed8SAndrew Rybchenko 1035e111ed8SAndrew Rybchenko typedef struct efx_tx_ops_s { 1045e111ed8SAndrew Rybchenko efx_rc_t (*etxo_init)(efx_nic_t *); 1055e111ed8SAndrew Rybchenko void (*etxo_fini)(efx_nic_t *); 1065e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qcreate)(efx_nic_t *, 1075e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1085e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, 1095e111ed8SAndrew Rybchenko uint32_t, uint16_t, 1105e111ed8SAndrew Rybchenko efx_evq_t *, efx_txq_t *, 1115e111ed8SAndrew Rybchenko unsigned int *); 1125e111ed8SAndrew Rybchenko void (*etxo_qdestroy)(efx_txq_t *); 1135e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpost)(efx_txq_t *, efx_buffer_t *, 1145e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1155e111ed8SAndrew Rybchenko unsigned int *); 1165e111ed8SAndrew Rybchenko void (*etxo_qpush)(efx_txq_t *, unsigned int, unsigned int); 1175e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpace)(efx_txq_t *, unsigned int); 1185e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qflush)(efx_txq_t *); 1195e111ed8SAndrew Rybchenko void (*etxo_qenable)(efx_txq_t *); 1205e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_enable)(efx_txq_t *); 1215e111ed8SAndrew Rybchenko void (*etxo_qpio_disable)(efx_txq_t *); 1225e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_write)(efx_txq_t *, uint8_t *, size_t, 1235e111ed8SAndrew Rybchenko size_t); 1245e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qpio_post)(efx_txq_t *, size_t, unsigned int, 1255e111ed8SAndrew Rybchenko unsigned int *); 1265e111ed8SAndrew Rybchenko efx_rc_t (*etxo_qdesc_post)(efx_txq_t *, efx_desc_t *, 1275e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1285e111ed8SAndrew Rybchenko unsigned int *); 1295e111ed8SAndrew Rybchenko void (*etxo_qdesc_dma_create)(efx_txq_t *, efsys_dma_addr_t, 1305e111ed8SAndrew Rybchenko size_t, boolean_t, 1315e111ed8SAndrew Rybchenko efx_desc_t *); 1325e111ed8SAndrew Rybchenko void (*etxo_qdesc_tso_create)(efx_txq_t *, uint16_t, 1335e111ed8SAndrew Rybchenko uint32_t, uint8_t, 1345e111ed8SAndrew Rybchenko efx_desc_t *); 1355e111ed8SAndrew Rybchenko void (*etxo_qdesc_tso2_create)(efx_txq_t *, uint16_t, 1365e111ed8SAndrew Rybchenko uint16_t, uint32_t, uint16_t, 1375e111ed8SAndrew Rybchenko efx_desc_t *, int); 1385e111ed8SAndrew Rybchenko void (*etxo_qdesc_vlantci_create)(efx_txq_t *, uint16_t, 1395e111ed8SAndrew Rybchenko efx_desc_t *); 1405e111ed8SAndrew Rybchenko void (*etxo_qdesc_checksum_create)(efx_txq_t *, uint16_t, 1415e111ed8SAndrew Rybchenko efx_desc_t *); 1425e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 1435e111ed8SAndrew Rybchenko void (*etxo_qstats_update)(efx_txq_t *, 1445e111ed8SAndrew Rybchenko efsys_stat_t *); 1455e111ed8SAndrew Rybchenko #endif 1465e111ed8SAndrew Rybchenko } efx_tx_ops_t; 1475e111ed8SAndrew Rybchenko 1485e111ed8SAndrew Rybchenko typedef union efx_rxq_type_data_u { 1495e111ed8SAndrew Rybchenko struct { 1505e111ed8SAndrew Rybchenko size_t ed_buf_size; 1515e111ed8SAndrew Rybchenko } ertd_default; 1525e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 1535e111ed8SAndrew Rybchenko struct { 1545e111ed8SAndrew Rybchenko uint32_t eps_buf_size; 1555e111ed8SAndrew Rybchenko } ertd_packed_stream; 1565e111ed8SAndrew Rybchenko #endif 1575e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_ES_SUPER_BUFFER 1585e111ed8SAndrew Rybchenko struct { 1595e111ed8SAndrew Rybchenko uint32_t eessb_bufs_per_desc; 1605e111ed8SAndrew Rybchenko uint32_t eessb_max_dma_len; 1615e111ed8SAndrew Rybchenko uint32_t eessb_buf_stride; 1625e111ed8SAndrew Rybchenko uint32_t eessb_hol_block_timeout; 1635e111ed8SAndrew Rybchenko } ertd_es_super_buffer; 1645e111ed8SAndrew Rybchenko #endif 1655e111ed8SAndrew Rybchenko } efx_rxq_type_data_t; 1665e111ed8SAndrew Rybchenko 1675e111ed8SAndrew Rybchenko typedef struct efx_rx_ops_s { 1685e111ed8SAndrew Rybchenko efx_rc_t (*erxo_init)(efx_nic_t *); 1695e111ed8SAndrew Rybchenko void (*erxo_fini)(efx_nic_t *); 1705e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCATTER 1715e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scatter_enable)(efx_nic_t *, unsigned int); 1725e111ed8SAndrew Rybchenko #endif 1735e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCALE 1745e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_context_alloc)(efx_nic_t *, 1755e111ed8SAndrew Rybchenko efx_rx_scale_context_type_t, 1765e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 1775e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_context_free)(efx_nic_t *, uint32_t); 1785e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_mode_set)(efx_nic_t *, uint32_t, 1795e111ed8SAndrew Rybchenko efx_rx_hash_alg_t, 1805e111ed8SAndrew Rybchenko efx_rx_hash_type_t, boolean_t); 1815e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_key_set)(efx_nic_t *, uint32_t, 1825e111ed8SAndrew Rybchenko uint8_t *, size_t); 1835e111ed8SAndrew Rybchenko efx_rc_t (*erxo_scale_tbl_set)(efx_nic_t *, uint32_t, 1845e111ed8SAndrew Rybchenko unsigned int *, size_t); 1855e111ed8SAndrew Rybchenko uint32_t (*erxo_prefix_hash)(efx_nic_t *, efx_rx_hash_alg_t, 1865e111ed8SAndrew Rybchenko uint8_t *); 1875e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_RX_SCALE */ 1885e111ed8SAndrew Rybchenko efx_rc_t (*erxo_prefix_pktlen)(efx_nic_t *, uint8_t *, 1895e111ed8SAndrew Rybchenko uint16_t *); 1905e111ed8SAndrew Rybchenko void (*erxo_qpost)(efx_rxq_t *, efsys_dma_addr_t *, size_t, 1915e111ed8SAndrew Rybchenko unsigned int, unsigned int, 1925e111ed8SAndrew Rybchenko unsigned int); 1935e111ed8SAndrew Rybchenko void (*erxo_qpush)(efx_rxq_t *, unsigned int, unsigned int *); 1945e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 1955e111ed8SAndrew Rybchenko void (*erxo_qpush_ps_credits)(efx_rxq_t *); 1965e111ed8SAndrew Rybchenko uint8_t * (*erxo_qps_packet_info)(efx_rxq_t *, uint8_t *, 1975e111ed8SAndrew Rybchenko uint32_t, uint32_t, 1985e111ed8SAndrew Rybchenko uint16_t *, uint32_t *, uint32_t *); 1995e111ed8SAndrew Rybchenko #endif 2005e111ed8SAndrew Rybchenko efx_rc_t (*erxo_qflush)(efx_rxq_t *); 2015e111ed8SAndrew Rybchenko void (*erxo_qenable)(efx_rxq_t *); 2025e111ed8SAndrew Rybchenko efx_rc_t (*erxo_qcreate)(efx_nic_t *enp, unsigned int, 2035e111ed8SAndrew Rybchenko unsigned int, efx_rxq_type_t, 2045e111ed8SAndrew Rybchenko const efx_rxq_type_data_t *, 2055e111ed8SAndrew Rybchenko efsys_mem_t *, size_t, uint32_t, 2065e111ed8SAndrew Rybchenko unsigned int, 2075e111ed8SAndrew Rybchenko efx_evq_t *, efx_rxq_t *); 2085e111ed8SAndrew Rybchenko void (*erxo_qdestroy)(efx_rxq_t *); 2095e111ed8SAndrew Rybchenko } efx_rx_ops_t; 2105e111ed8SAndrew Rybchenko 2115e111ed8SAndrew Rybchenko typedef struct efx_mac_ops_s { 2125e111ed8SAndrew Rybchenko efx_rc_t (*emo_poll)(efx_nic_t *, efx_link_mode_t *); 2135e111ed8SAndrew Rybchenko efx_rc_t (*emo_up)(efx_nic_t *, boolean_t *); 2145e111ed8SAndrew Rybchenko efx_rc_t (*emo_addr_set)(efx_nic_t *); 2155e111ed8SAndrew Rybchenko efx_rc_t (*emo_pdu_set)(efx_nic_t *); 2165e111ed8SAndrew Rybchenko efx_rc_t (*emo_pdu_get)(efx_nic_t *, size_t *); 2175e111ed8SAndrew Rybchenko efx_rc_t (*emo_reconfigure)(efx_nic_t *); 2185e111ed8SAndrew Rybchenko efx_rc_t (*emo_multicast_list_set)(efx_nic_t *); 2195e111ed8SAndrew Rybchenko efx_rc_t (*emo_filter_default_rxq_set)(efx_nic_t *, 2205e111ed8SAndrew Rybchenko efx_rxq_t *, boolean_t); 2215e111ed8SAndrew Rybchenko void (*emo_filter_default_rxq_clear)(efx_nic_t *); 2225e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK 2235e111ed8SAndrew Rybchenko efx_rc_t (*emo_loopback_set)(efx_nic_t *, efx_link_mode_t, 2245e111ed8SAndrew Rybchenko efx_loopback_type_t); 2255e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */ 2265e111ed8SAndrew Rybchenko #if EFSYS_OPT_MAC_STATS 2275e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_get_mask)(efx_nic_t *, uint32_t *, size_t); 2285e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_clear)(efx_nic_t *); 2295e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_upload)(efx_nic_t *, efsys_mem_t *); 2305e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_periodic)(efx_nic_t *, efsys_mem_t *, 2315e111ed8SAndrew Rybchenko uint16_t, boolean_t); 2325e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 2335e111ed8SAndrew Rybchenko efsys_stat_t *, uint32_t *); 2345e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MAC_STATS */ 2355e111ed8SAndrew Rybchenko } efx_mac_ops_t; 2365e111ed8SAndrew Rybchenko 2375e111ed8SAndrew Rybchenko typedef struct efx_phy_ops_s { 2385e111ed8SAndrew Rybchenko efx_rc_t (*epo_power)(efx_nic_t *, boolean_t); /* optional */ 2395e111ed8SAndrew Rybchenko efx_rc_t (*epo_reset)(efx_nic_t *); 2405e111ed8SAndrew Rybchenko efx_rc_t (*epo_reconfigure)(efx_nic_t *); 2415e111ed8SAndrew Rybchenko efx_rc_t (*epo_verify)(efx_nic_t *); 2425e111ed8SAndrew Rybchenko efx_rc_t (*epo_oui_get)(efx_nic_t *, uint32_t *); 2435e111ed8SAndrew Rybchenko efx_rc_t (*epo_link_state_get)(efx_nic_t *, efx_phy_link_state_t *); 2445e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_STATS 2455e111ed8SAndrew Rybchenko efx_rc_t (*epo_stats_update)(efx_nic_t *, efsys_mem_t *, 2465e111ed8SAndrew Rybchenko uint32_t *); 2475e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_STATS */ 2485e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST 2495e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_enable_offline)(efx_nic_t *); 2505e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_start)(efx_nic_t *, efx_bist_type_t); 2515e111ed8SAndrew Rybchenko efx_rc_t (*epo_bist_poll)(efx_nic_t *, efx_bist_type_t, 2525e111ed8SAndrew Rybchenko efx_bist_result_t *, uint32_t *, 2535e111ed8SAndrew Rybchenko unsigned long *, size_t); 2545e111ed8SAndrew Rybchenko void (*epo_bist_stop)(efx_nic_t *, efx_bist_type_t); 2555e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_BIST */ 2565e111ed8SAndrew Rybchenko } efx_phy_ops_t; 2575e111ed8SAndrew Rybchenko 2585e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 2595e111ed8SAndrew Rybchenko 2605e111ed8SAndrew Rybchenko /* 2615e111ed8SAndrew Rybchenko * Policy for replacing existing filter when inserting a new one. 2625e111ed8SAndrew Rybchenko * Note that all policies allow for storing the new lower priority 2635e111ed8SAndrew Rybchenko * filters as overridden by existing higher priority ones. It is needed 2645e111ed8SAndrew Rybchenko * to restore the lower priority filters on higher priority ones removal. 2655e111ed8SAndrew Rybchenko */ 2665e111ed8SAndrew Rybchenko typedef enum efx_filter_replacement_policy_e { 2675e111ed8SAndrew Rybchenko /* Cannot replace existing filter */ 2685e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_NEVER, 2695e111ed8SAndrew Rybchenko /* Higher priority filters can replace lower priotiry ones */ 2705e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_HIGHER_PRIORITY, 2715e111ed8SAndrew Rybchenko /* 2725e111ed8SAndrew Rybchenko * Higher priority filters can replace lower priority ones and 2735e111ed8SAndrew Rybchenko * equal priority filters can replace each other. 2745e111ed8SAndrew Rybchenko */ 2755e111ed8SAndrew Rybchenko EFX_FILTER_REPLACEMENT_HIGHER_OR_EQUAL_PRIORITY, 2765e111ed8SAndrew Rybchenko } efx_filter_replacement_policy_t; 2775e111ed8SAndrew Rybchenko 2785e111ed8SAndrew Rybchenko typedef struct efx_filter_ops_s { 2795e111ed8SAndrew Rybchenko efx_rc_t (*efo_init)(efx_nic_t *); 2805e111ed8SAndrew Rybchenko void (*efo_fini)(efx_nic_t *); 2815e111ed8SAndrew Rybchenko efx_rc_t (*efo_restore)(efx_nic_t *); 2825e111ed8SAndrew Rybchenko efx_rc_t (*efo_add)(efx_nic_t *, efx_filter_spec_t *, 2835e111ed8SAndrew Rybchenko efx_filter_replacement_policy_t policy); 2845e111ed8SAndrew Rybchenko efx_rc_t (*efo_delete)(efx_nic_t *, efx_filter_spec_t *); 2855e111ed8SAndrew Rybchenko efx_rc_t (*efo_supported_filters)(efx_nic_t *, uint32_t *, 2865e111ed8SAndrew Rybchenko size_t, size_t *); 2875e111ed8SAndrew Rybchenko efx_rc_t (*efo_reconfigure)(efx_nic_t *, uint8_t const *, boolean_t, 2885e111ed8SAndrew Rybchenko boolean_t, boolean_t, boolean_t, 2895e111ed8SAndrew Rybchenko uint8_t const *, uint32_t); 2905e111ed8SAndrew Rybchenko } efx_filter_ops_t; 2915e111ed8SAndrew Rybchenko 2925e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2935e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2945e111ed8SAndrew Rybchenko efx_filter_reconfigure( 2955e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2965e111ed8SAndrew Rybchenko __in_ecount(6) uint8_t const *mac_addr, 2975e111ed8SAndrew Rybchenko __in boolean_t all_unicst, 2985e111ed8SAndrew Rybchenko __in boolean_t mulcst, 2995e111ed8SAndrew Rybchenko __in boolean_t all_mulcst, 3005e111ed8SAndrew Rybchenko __in boolean_t brdcst, 3015e111ed8SAndrew Rybchenko __in_ecount(6*count) uint8_t const *addrs, 3025e111ed8SAndrew Rybchenko __in uint32_t count); 3035e111ed8SAndrew Rybchenko 3045e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 3055e111ed8SAndrew Rybchenko 3065e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 3075e111ed8SAndrew Rybchenko typedef struct efx_tunnel_ops_s { 3085e111ed8SAndrew Rybchenko efx_rc_t (*eto_reconfigure)(efx_nic_t *); 3094dda992fSIgor Romanov void (*eto_fini)(efx_nic_t *); 3105e111ed8SAndrew Rybchenko } efx_tunnel_ops_t; 3115e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 3125e111ed8SAndrew Rybchenko 3134dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 3144dda72dbSVijay Srivastava typedef struct efx_virtio_ops_s { 3154dda72dbSVijay Srivastava efx_rc_t (*evo_virtio_qstart)(efx_virtio_vq_t *, 3164dda72dbSVijay Srivastava efx_virtio_vq_cfg_t *, 3174dda72dbSVijay Srivastava efx_virtio_vq_dyncfg_t *); 3184dda72dbSVijay Srivastava efx_rc_t (*evo_virtio_qstop)(efx_virtio_vq_t *, 3194dda72dbSVijay Srivastava efx_virtio_vq_dyncfg_t *); 320ec03ce69SVijay Srivastava efx_rc_t (*evo_get_doorbell_offset)(efx_virtio_vq_t *, 321ec03ce69SVijay Srivastava uint32_t *); 32246d2b38bSVijay Kumar Srivastava efx_rc_t (*evo_get_features)(efx_nic_t *, 32346d2b38bSVijay Kumar Srivastava efx_virtio_device_type_t, uint64_t *); 324b8a896abSVijay Kumar Srivastava efx_rc_t (*evo_verify_features)(efx_nic_t *, 325b8a896abSVijay Kumar Srivastava efx_virtio_device_type_t, uint64_t); 3264dda72dbSVijay Srivastava } efx_virtio_ops_t; 3274dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VIRTIO */ 3284dda72dbSVijay Srivastava 3295e111ed8SAndrew Rybchenko typedef struct efx_port_s { 3305e111ed8SAndrew Rybchenko efx_mac_type_t ep_mac_type; 3315e111ed8SAndrew Rybchenko uint32_t ep_phy_type; 3325e111ed8SAndrew Rybchenko uint8_t ep_port; 3335e111ed8SAndrew Rybchenko uint32_t ep_mac_pdu; 3345e111ed8SAndrew Rybchenko uint8_t ep_mac_addr[6]; 3355e111ed8SAndrew Rybchenko efx_link_mode_t ep_link_mode; 3365e111ed8SAndrew Rybchenko boolean_t ep_all_unicst; 3375e111ed8SAndrew Rybchenko boolean_t ep_all_unicst_inserted; 3385e111ed8SAndrew Rybchenko boolean_t ep_mulcst; 3395e111ed8SAndrew Rybchenko boolean_t ep_all_mulcst; 3405e111ed8SAndrew Rybchenko boolean_t ep_all_mulcst_inserted; 3415e111ed8SAndrew Rybchenko boolean_t ep_brdcst; 3425e111ed8SAndrew Rybchenko unsigned int ep_fcntl; 3435e111ed8SAndrew Rybchenko boolean_t ep_fcntl_autoneg; 3445e111ed8SAndrew Rybchenko efx_oword_t ep_multicst_hash[2]; 3455e111ed8SAndrew Rybchenko uint8_t ep_mulcst_addr_list[EFX_MAC_ADDR_LEN * 3465e111ed8SAndrew Rybchenko EFX_MAC_MULTICAST_LIST_MAX]; 3475e111ed8SAndrew Rybchenko uint32_t ep_mulcst_addr_count; 3485e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK 3495e111ed8SAndrew Rybchenko efx_loopback_type_t ep_loopback_type; 3505e111ed8SAndrew Rybchenko efx_link_mode_t ep_loopback_link_mode; 3515e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */ 3525e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_FLAGS 3535e111ed8SAndrew Rybchenko uint32_t ep_phy_flags; 3545e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_FLAGS */ 3555e111ed8SAndrew Rybchenko #if EFSYS_OPT_PHY_LED_CONTROL 3565e111ed8SAndrew Rybchenko efx_phy_led_mode_t ep_phy_led_mode; 3575e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_PHY_LED_CONTROL */ 3585e111ed8SAndrew Rybchenko efx_phy_media_type_t ep_fixed_port_type; 3595e111ed8SAndrew Rybchenko efx_phy_media_type_t ep_module_type; 3605e111ed8SAndrew Rybchenko uint32_t ep_adv_cap_mask; 3615e111ed8SAndrew Rybchenko uint32_t ep_lp_cap_mask; 3625e111ed8SAndrew Rybchenko uint32_t ep_default_adv_cap_mask; 3635e111ed8SAndrew Rybchenko uint32_t ep_phy_cap_mask; 3645e111ed8SAndrew Rybchenko boolean_t ep_mac_drain; 3655e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST 3665e111ed8SAndrew Rybchenko efx_bist_type_t ep_current_bist; 3675e111ed8SAndrew Rybchenko #endif 3685e111ed8SAndrew Rybchenko const efx_mac_ops_t *ep_emop; 3695e111ed8SAndrew Rybchenko const efx_phy_ops_t *ep_epop; 3705e111ed8SAndrew Rybchenko } efx_port_t; 3715e111ed8SAndrew Rybchenko 3725e111ed8SAndrew Rybchenko typedef struct efx_mon_ops_s { 3735e111ed8SAndrew Rybchenko #if EFSYS_OPT_MON_STATS 3745e111ed8SAndrew Rybchenko efx_rc_t (*emo_stats_update)(efx_nic_t *, efsys_mem_t *, 3755e111ed8SAndrew Rybchenko efx_mon_stat_value_t *); 3765e111ed8SAndrew Rybchenko efx_rc_t (*emo_limits_update)(efx_nic_t *, 3775e111ed8SAndrew Rybchenko efx_mon_stat_limits_t *); 3785e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MON_STATS */ 3795e111ed8SAndrew Rybchenko } efx_mon_ops_t; 3805e111ed8SAndrew Rybchenko 3815e111ed8SAndrew Rybchenko typedef struct efx_mon_s { 3825e111ed8SAndrew Rybchenko efx_mon_type_t em_type; 3835e111ed8SAndrew Rybchenko const efx_mon_ops_t *em_emop; 3845e111ed8SAndrew Rybchenko } efx_mon_t; 3855e111ed8SAndrew Rybchenko 3865e111ed8SAndrew Rybchenko typedef struct efx_intr_ops_s { 3875e111ed8SAndrew Rybchenko efx_rc_t (*eio_init)(efx_nic_t *, efx_intr_type_t, efsys_mem_t *); 3885e111ed8SAndrew Rybchenko void (*eio_enable)(efx_nic_t *); 3895e111ed8SAndrew Rybchenko void (*eio_disable)(efx_nic_t *); 3905e111ed8SAndrew Rybchenko void (*eio_disable_unlocked)(efx_nic_t *); 3915e111ed8SAndrew Rybchenko efx_rc_t (*eio_trigger)(efx_nic_t *, unsigned int); 3925e111ed8SAndrew Rybchenko void (*eio_status_line)(efx_nic_t *, boolean_t *, uint32_t *); 3935e111ed8SAndrew Rybchenko void (*eio_status_message)(efx_nic_t *, unsigned int, 3945e111ed8SAndrew Rybchenko boolean_t *); 3955e111ed8SAndrew Rybchenko void (*eio_fatal)(efx_nic_t *); 3965e111ed8SAndrew Rybchenko void (*eio_fini)(efx_nic_t *); 3975e111ed8SAndrew Rybchenko } efx_intr_ops_t; 3985e111ed8SAndrew Rybchenko 3995e111ed8SAndrew Rybchenko typedef struct efx_intr_s { 4005e111ed8SAndrew Rybchenko const efx_intr_ops_t *ei_eiop; 4015e111ed8SAndrew Rybchenko efsys_mem_t *ei_esmp; 4025e111ed8SAndrew Rybchenko efx_intr_type_t ei_type; 4035e111ed8SAndrew Rybchenko unsigned int ei_level; 4045e111ed8SAndrew Rybchenko } efx_intr_t; 4055e111ed8SAndrew Rybchenko 4065e111ed8SAndrew Rybchenko typedef struct efx_nic_ops_s { 4075e111ed8SAndrew Rybchenko efx_rc_t (*eno_probe)(efx_nic_t *); 4085e111ed8SAndrew Rybchenko efx_rc_t (*eno_board_cfg)(efx_nic_t *); 4095e111ed8SAndrew Rybchenko efx_rc_t (*eno_set_drv_limits)(efx_nic_t *, efx_drv_limits_t*); 4105e111ed8SAndrew Rybchenko efx_rc_t (*eno_reset)(efx_nic_t *); 4115e111ed8SAndrew Rybchenko efx_rc_t (*eno_init)(efx_nic_t *); 4125e111ed8SAndrew Rybchenko efx_rc_t (*eno_get_vi_pool)(efx_nic_t *, uint32_t *); 4135e111ed8SAndrew Rybchenko efx_rc_t (*eno_get_bar_region)(efx_nic_t *, efx_nic_region_t, 4145e111ed8SAndrew Rybchenko uint32_t *, size_t *); 4155e111ed8SAndrew Rybchenko boolean_t (*eno_hw_unavailable)(efx_nic_t *); 4165e111ed8SAndrew Rybchenko void (*eno_set_hw_unavailable)(efx_nic_t *); 4175e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 4185e111ed8SAndrew Rybchenko efx_rc_t (*eno_register_test)(efx_nic_t *); 4195e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 4205e111ed8SAndrew Rybchenko void (*eno_fini)(efx_nic_t *); 4215e111ed8SAndrew Rybchenko void (*eno_unprobe)(efx_nic_t *); 4225e111ed8SAndrew Rybchenko } efx_nic_ops_t; 4235e111ed8SAndrew Rybchenko 4245e111ed8SAndrew Rybchenko #ifndef EFX_TXQ_LIMIT_TARGET 4255e111ed8SAndrew Rybchenko #define EFX_TXQ_LIMIT_TARGET 259 4265e111ed8SAndrew Rybchenko #endif 4275e111ed8SAndrew Rybchenko #ifndef EFX_RXQ_LIMIT_TARGET 4285e111ed8SAndrew Rybchenko #define EFX_RXQ_LIMIT_TARGET 512 4295e111ed8SAndrew Rybchenko #endif 4305e111ed8SAndrew Rybchenko 4315e111ed8SAndrew Rybchenko 4325e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 4335e111ed8SAndrew Rybchenko 4345e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 4355e111ed8SAndrew Rybchenko 4365e111ed8SAndrew Rybchenko typedef struct siena_filter_spec_s { 4375e111ed8SAndrew Rybchenko uint8_t sfs_type; 4385e111ed8SAndrew Rybchenko uint32_t sfs_flags; 4395e111ed8SAndrew Rybchenko uint32_t sfs_dmaq_id; 4405e111ed8SAndrew Rybchenko uint32_t sfs_dword[3]; 4415e111ed8SAndrew Rybchenko } siena_filter_spec_t; 4425e111ed8SAndrew Rybchenko 4435e111ed8SAndrew Rybchenko typedef enum siena_filter_type_e { 4445e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4455e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_TCP_WILD, /* TCP/IPv4 {dIP,dTCP, -, -} */ 4465e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_UDP_FULL, /* UDP/IPv4 {dIP,dUDP,sIP,sUDP} */ 4475e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_UDP_WILD, /* UDP/IPv4 {dIP,dUDP, -, -} */ 4485e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_MAC_FULL, /* Ethernet {dMAC,VLAN} */ 4495e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_RX_MAC_WILD, /* Ethernet {dMAC, -} */ 4505e111ed8SAndrew Rybchenko 4515e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_TCP_FULL, /* TCP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4525e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_TCP_WILD, /* TCP/IPv4 { -, -,sIP,sTCP} */ 4535e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_UDP_FULL, /* UDP/IPv4 {dIP,dTCP,sIP,sTCP} */ 4545e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_UDP_WILD, /* UDP/IPv4 { -, -,sIP,sUDP} */ 4555e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_MAC_FULL, /* Ethernet {sMAC,VLAN} */ 4565e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TX_MAC_WILD, /* Ethernet {sMAC, -} */ 4575e111ed8SAndrew Rybchenko 4585e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_NTYPES 4595e111ed8SAndrew Rybchenko } siena_filter_type_t; 4605e111ed8SAndrew Rybchenko 4615e111ed8SAndrew Rybchenko typedef enum siena_filter_tbl_id_e { 4625e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_RX_IP = 0, 4635e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_RX_MAC, 4645e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_TX_IP, 4655e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_TBL_TX_MAC, 4665e111ed8SAndrew Rybchenko EFX_SIENA_FILTER_NTBLS 4675e111ed8SAndrew Rybchenko } siena_filter_tbl_id_t; 4685e111ed8SAndrew Rybchenko 4695e111ed8SAndrew Rybchenko typedef struct siena_filter_tbl_s { 4705e111ed8SAndrew Rybchenko int sft_size; /* number of entries */ 4715e111ed8SAndrew Rybchenko int sft_used; /* active count */ 4725e111ed8SAndrew Rybchenko uint32_t *sft_bitmap; /* active bitmap */ 4735e111ed8SAndrew Rybchenko siena_filter_spec_t *sft_spec; /* array of saved specs */ 4745e111ed8SAndrew Rybchenko } siena_filter_tbl_t; 4755e111ed8SAndrew Rybchenko 4765e111ed8SAndrew Rybchenko typedef struct siena_filter_s { 4775e111ed8SAndrew Rybchenko siena_filter_tbl_t sf_tbl[EFX_SIENA_FILTER_NTBLS]; 4785e111ed8SAndrew Rybchenko unsigned int sf_depth[EFX_SIENA_FILTER_NTYPES]; 4795e111ed8SAndrew Rybchenko } siena_filter_t; 4805e111ed8SAndrew Rybchenko 4815e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 4825e111ed8SAndrew Rybchenko 4835e111ed8SAndrew Rybchenko typedef struct efx_filter_s { 4845e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 4855e111ed8SAndrew Rybchenko siena_filter_t *ef_siena_filter; 4865e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 487e1fe2c33SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 4885e111ed8SAndrew Rybchenko ef10_filter_table_t *ef_ef10_filter_table; 489e1fe2c33SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 4905e111ed8SAndrew Rybchenko } efx_filter_t; 4915e111ed8SAndrew Rybchenko 4925e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 4935e111ed8SAndrew Rybchenko 4945e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 4955e111ed8SAndrew Rybchenko extern void 4965e111ed8SAndrew Rybchenko siena_filter_tbl_clear( 4975e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 4985e111ed8SAndrew Rybchenko __in siena_filter_tbl_id_t tbl); 4995e111ed8SAndrew Rybchenko 5005e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 5015e111ed8SAndrew Rybchenko 5025e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 5035e111ed8SAndrew Rybchenko 5045e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 5055e111ed8SAndrew Rybchenko 5065e111ed8SAndrew Rybchenko #define EFX_TUNNEL_MAXNENTRIES (16) 5075e111ed8SAndrew Rybchenko 5085e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 5095e111ed8SAndrew Rybchenko 51072e9af05SIgor Romanov /* State of a UDP tunnel table entry */ 51172e9af05SIgor Romanov typedef enum efx_tunnel_udp_entry_state_e { 51272e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_ADDED, /* Tunnel addition is requested */ 51372e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_REMOVED, /* Tunnel removal is requested */ 51472e9af05SIgor Romanov EFX_TUNNEL_UDP_ENTRY_APPLIED, /* Tunnel is applied by HW */ 51572e9af05SIgor Romanov } efx_tunnel_udp_entry_state_t; 51672e9af05SIgor Romanov 517d874d2a1SIgor Romanov #if EFSYS_OPT_RIVERHEAD 518d874d2a1SIgor Romanov typedef uint32_t efx_vnic_encap_rule_handle_t; 519d874d2a1SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 520d874d2a1SIgor Romanov 5215e111ed8SAndrew Rybchenko typedef struct efx_tunnel_udp_entry_s { 5225e111ed8SAndrew Rybchenko uint16_t etue_port; /* host/cpu-endian */ 5235e111ed8SAndrew Rybchenko uint16_t etue_protocol; 52472e9af05SIgor Romanov boolean_t etue_busy; 52572e9af05SIgor Romanov efx_tunnel_udp_entry_state_t etue_state; 526d874d2a1SIgor Romanov #if EFSYS_OPT_RIVERHEAD 527d874d2a1SIgor Romanov efx_vnic_encap_rule_handle_t etue_handle; 528d874d2a1SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 5295e111ed8SAndrew Rybchenko } efx_tunnel_udp_entry_t; 5305e111ed8SAndrew Rybchenko 5315e111ed8SAndrew Rybchenko typedef struct efx_tunnel_cfg_s { 5325e111ed8SAndrew Rybchenko efx_tunnel_udp_entry_t etc_udp_entries[EFX_TUNNEL_MAXNENTRIES]; 5335e111ed8SAndrew Rybchenko unsigned int etc_udp_entries_num; 5345e111ed8SAndrew Rybchenko } efx_tunnel_cfg_t; 5355e111ed8SAndrew Rybchenko 5365e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 5375e111ed8SAndrew Rybchenko 5385e111ed8SAndrew Rybchenko typedef struct efx_mcdi_ops_s { 5395e111ed8SAndrew Rybchenko efx_rc_t (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *); 5405e111ed8SAndrew Rybchenko void (*emco_send_request)(efx_nic_t *, void *, size_t, 5415e111ed8SAndrew Rybchenko void *, size_t); 5425e111ed8SAndrew Rybchenko efx_rc_t (*emco_poll_reboot)(efx_nic_t *); 5435e111ed8SAndrew Rybchenko boolean_t (*emco_poll_response)(efx_nic_t *); 5445e111ed8SAndrew Rybchenko void (*emco_read_response)(efx_nic_t *, void *, size_t, size_t); 5455e111ed8SAndrew Rybchenko void (*emco_fini)(efx_nic_t *); 5465e111ed8SAndrew Rybchenko efx_rc_t (*emco_feature_supported)(efx_nic_t *, 5475e111ed8SAndrew Rybchenko efx_mcdi_feature_id_t, boolean_t *); 5485e111ed8SAndrew Rybchenko void (*emco_get_timeout)(efx_nic_t *, efx_mcdi_req_t *, 5495e111ed8SAndrew Rybchenko uint32_t *); 5505e111ed8SAndrew Rybchenko } efx_mcdi_ops_t; 5515e111ed8SAndrew Rybchenko 5525e111ed8SAndrew Rybchenko typedef struct efx_mcdi_s { 5535e111ed8SAndrew Rybchenko const efx_mcdi_ops_t *em_emcop; 5545e111ed8SAndrew Rybchenko const efx_mcdi_transport_t *em_emtp; 5555e111ed8SAndrew Rybchenko efx_mcdi_iface_t em_emip; 5565e111ed8SAndrew Rybchenko } efx_mcdi_t; 5575e111ed8SAndrew Rybchenko 5585e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 5595e111ed8SAndrew Rybchenko 5605e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM 5615e111ed8SAndrew Rybchenko 5625e111ed8SAndrew Rybchenko /* Invalid partition ID for en_nvram_partn_locked field of efx_nc_t */ 5635e111ed8SAndrew Rybchenko #define EFX_NVRAM_PARTN_INVALID (0xffffffffu) 5645e111ed8SAndrew Rybchenko 5655e111ed8SAndrew Rybchenko typedef struct efx_nvram_ops_s { 5665e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 5675e111ed8SAndrew Rybchenko efx_rc_t (*envo_test)(efx_nic_t *); 5685e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 5695e111ed8SAndrew Rybchenko efx_rc_t (*envo_type_to_partn)(efx_nic_t *, efx_nvram_type_t, 5705e111ed8SAndrew Rybchenko uint32_t *); 5715e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_info)(efx_nic_t *, uint32_t, 5725e111ed8SAndrew Rybchenko efx_nvram_info_t *); 5735e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_rw_start)(efx_nic_t *, uint32_t, size_t *); 5745e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_read)(efx_nic_t *, uint32_t, 5755e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 5765e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_read_backup)(efx_nic_t *, uint32_t, 5775e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 5785e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_erase)(efx_nic_t *, uint32_t, 5795e111ed8SAndrew Rybchenko unsigned int, size_t); 5805e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_write)(efx_nic_t *, uint32_t, 5815e111ed8SAndrew Rybchenko unsigned int, caddr_t, size_t); 5825e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_rw_finish)(efx_nic_t *, uint32_t, 5835e111ed8SAndrew Rybchenko uint32_t *); 5845e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_get_version)(efx_nic_t *, uint32_t, 5855e111ed8SAndrew Rybchenko uint32_t *, uint16_t *); 5865e111ed8SAndrew Rybchenko efx_rc_t (*envo_partn_set_version)(efx_nic_t *, uint32_t, 5875e111ed8SAndrew Rybchenko uint16_t *); 5885e111ed8SAndrew Rybchenko efx_rc_t (*envo_buffer_validate)(uint32_t, 5895e111ed8SAndrew Rybchenko caddr_t, size_t); 5905e111ed8SAndrew Rybchenko } efx_nvram_ops_t; 5915e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM */ 5925e111ed8SAndrew Rybchenko 5935e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 5945e111ed8SAndrew Rybchenko typedef struct efx_vpd_ops_s { 5955e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_init)(efx_nic_t *); 5965e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_size)(efx_nic_t *, size_t *); 5975e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_read)(efx_nic_t *, caddr_t, size_t); 5985e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_verify)(efx_nic_t *, caddr_t, size_t); 5995e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_reinit)(efx_nic_t *, caddr_t, size_t); 6005e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_get)(efx_nic_t *, caddr_t, size_t, 6015e111ed8SAndrew Rybchenko efx_vpd_value_t *); 6025e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_set)(efx_nic_t *, caddr_t, size_t, 6035e111ed8SAndrew Rybchenko efx_vpd_value_t *); 6045e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_next)(efx_nic_t *, caddr_t, size_t, 6055e111ed8SAndrew Rybchenko efx_vpd_value_t *, unsigned int *); 6065e111ed8SAndrew Rybchenko efx_rc_t (*evpdo_write)(efx_nic_t *, caddr_t, size_t); 6075e111ed8SAndrew Rybchenko void (*evpdo_fini)(efx_nic_t *); 6085e111ed8SAndrew Rybchenko } efx_vpd_ops_t; 6095e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 6105e111ed8SAndrew Rybchenko 6115e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM 6125e111ed8SAndrew Rybchenko 6135e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6145e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6155e111ed8SAndrew Rybchenko efx_mcdi_nvram_partitions( 6165e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6175e111ed8SAndrew Rybchenko __out_bcount(size) caddr_t data, 6185e111ed8SAndrew Rybchenko __in size_t size, 6195e111ed8SAndrew Rybchenko __out unsigned int *npartnp); 6205e111ed8SAndrew Rybchenko 6215e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6225e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6235e111ed8SAndrew Rybchenko efx_mcdi_nvram_metadata( 6245e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6255e111ed8SAndrew Rybchenko __in uint32_t partn, 6265e111ed8SAndrew Rybchenko __out uint32_t *subtypep, 6275e111ed8SAndrew Rybchenko __out_ecount(4) uint16_t version[4], 6285e111ed8SAndrew Rybchenko __out_bcount_opt(size) char *descp, 6295e111ed8SAndrew Rybchenko __in size_t size); 6305e111ed8SAndrew Rybchenko 6315e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6325e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6335e111ed8SAndrew Rybchenko efx_mcdi_nvram_info( 6345e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6355e111ed8SAndrew Rybchenko __in uint32_t partn, 6365e111ed8SAndrew Rybchenko __out efx_nvram_info_t *eni); 6375e111ed8SAndrew Rybchenko 6385e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6395e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6405e111ed8SAndrew Rybchenko efx_mcdi_nvram_update_start( 6415e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6425e111ed8SAndrew Rybchenko __in uint32_t partn); 6435e111ed8SAndrew Rybchenko 6445e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6455e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6465e111ed8SAndrew Rybchenko efx_mcdi_nvram_read( 6475e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6485e111ed8SAndrew Rybchenko __in uint32_t partn, 6495e111ed8SAndrew Rybchenko __in uint32_t offset, 6505e111ed8SAndrew Rybchenko __out_bcount(size) caddr_t data, 6515e111ed8SAndrew Rybchenko __in size_t size, 6525e111ed8SAndrew Rybchenko __in uint32_t mode); 6535e111ed8SAndrew Rybchenko 6545e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6555e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6565e111ed8SAndrew Rybchenko efx_mcdi_nvram_erase( 6575e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6585e111ed8SAndrew Rybchenko __in uint32_t partn, 6595e111ed8SAndrew Rybchenko __in uint32_t offset, 6605e111ed8SAndrew Rybchenko __in size_t size); 6615e111ed8SAndrew Rybchenko 6625e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6635e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6645e111ed8SAndrew Rybchenko efx_mcdi_nvram_write( 6655e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6665e111ed8SAndrew Rybchenko __in uint32_t partn, 6675e111ed8SAndrew Rybchenko __in uint32_t offset, 6685e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 6695e111ed8SAndrew Rybchenko __in size_t size); 6705e111ed8SAndrew Rybchenko 6715e111ed8SAndrew Rybchenko #define EFX_NVRAM_UPDATE_FLAGS_BACKGROUND 0x00000001 6725e111ed8SAndrew Rybchenko #define EFX_NVRAM_UPDATE_FLAGS_POLL 0x00000002 6735e111ed8SAndrew Rybchenko 6745e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6755e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6765e111ed8SAndrew Rybchenko efx_mcdi_nvram_update_finish( 6775e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6785e111ed8SAndrew Rybchenko __in uint32_t partn, 6795e111ed8SAndrew Rybchenko __in boolean_t reboot, 6805e111ed8SAndrew Rybchenko __in uint32_t flags, 6815e111ed8SAndrew Rybchenko __out_opt uint32_t *verify_resultp); 6825e111ed8SAndrew Rybchenko 6835e111ed8SAndrew Rybchenko #if EFSYS_OPT_DIAG 6845e111ed8SAndrew Rybchenko 6855e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 6865e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 6875e111ed8SAndrew Rybchenko efx_mcdi_nvram_test( 6885e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 6895e111ed8SAndrew Rybchenko __in uint32_t partn); 6905e111ed8SAndrew Rybchenko 6915e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_DIAG */ 6925e111ed8SAndrew Rybchenko 6935e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */ 6945e111ed8SAndrew Rybchenko 6955e111ed8SAndrew Rybchenko #if EFSYS_OPT_LICENSING 6965e111ed8SAndrew Rybchenko 6975e111ed8SAndrew Rybchenko typedef struct efx_lic_ops_s { 6985e111ed8SAndrew Rybchenko efx_rc_t (*elo_update_licenses)(efx_nic_t *); 6995e111ed8SAndrew Rybchenko efx_rc_t (*elo_get_key_stats)(efx_nic_t *, efx_key_stats_t *); 7005e111ed8SAndrew Rybchenko efx_rc_t (*elo_app_state)(efx_nic_t *, uint64_t, boolean_t *); 7015e111ed8SAndrew Rybchenko efx_rc_t (*elo_get_id)(efx_nic_t *, size_t, uint32_t *, 7025e111ed8SAndrew Rybchenko size_t *, uint8_t *); 7035e111ed8SAndrew Rybchenko efx_rc_t (*elo_find_start) 7045e111ed8SAndrew Rybchenko (efx_nic_t *, caddr_t, size_t, uint32_t *); 7055e111ed8SAndrew Rybchenko efx_rc_t (*elo_find_end)(efx_nic_t *, caddr_t, size_t, 7065e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 7075e111ed8SAndrew Rybchenko boolean_t (*elo_find_key)(efx_nic_t *, caddr_t, size_t, 7085e111ed8SAndrew Rybchenko uint32_t, uint32_t *, uint32_t *); 7095e111ed8SAndrew Rybchenko boolean_t (*elo_validate_key)(efx_nic_t *, 7105e111ed8SAndrew Rybchenko caddr_t, uint32_t); 7115e111ed8SAndrew Rybchenko efx_rc_t (*elo_read_key)(efx_nic_t *, 7125e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, uint32_t, 7135e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t *); 7145e111ed8SAndrew Rybchenko efx_rc_t (*elo_write_key)(efx_nic_t *, 7155e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, 7165e111ed8SAndrew Rybchenko caddr_t, uint32_t, uint32_t *); 7175e111ed8SAndrew Rybchenko efx_rc_t (*elo_delete_key)(efx_nic_t *, 7185e111ed8SAndrew Rybchenko caddr_t, size_t, uint32_t, 7195e111ed8SAndrew Rybchenko uint32_t, uint32_t, uint32_t *); 7205e111ed8SAndrew Rybchenko efx_rc_t (*elo_create_partition)(efx_nic_t *, 7215e111ed8SAndrew Rybchenko caddr_t, size_t); 7225e111ed8SAndrew Rybchenko efx_rc_t (*elo_finish_partition)(efx_nic_t *, 7235e111ed8SAndrew Rybchenko caddr_t, size_t); 7245e111ed8SAndrew Rybchenko } efx_lic_ops_t; 7255e111ed8SAndrew Rybchenko 7265e111ed8SAndrew Rybchenko #endif 7275e111ed8SAndrew Rybchenko 7285e111ed8SAndrew Rybchenko #if EFSYS_OPT_EVB 7295e111ed8SAndrew Rybchenko 7305e111ed8SAndrew Rybchenko struct efx_vswitch_s { 7315e111ed8SAndrew Rybchenko efx_nic_t *ev_enp; 7325e111ed8SAndrew Rybchenko efx_vswitch_id_t ev_vswitch_id; 7335e111ed8SAndrew Rybchenko uint32_t ev_num_vports; 7345e111ed8SAndrew Rybchenko /* 7355e111ed8SAndrew Rybchenko * Vport configuration array: index 0 to store PF configuration 7365e111ed8SAndrew Rybchenko * and next ev_num_vports-1 entries hold VFs configuration. 7375e111ed8SAndrew Rybchenko */ 7385e111ed8SAndrew Rybchenko efx_vport_config_t *ev_evcp; 7395e111ed8SAndrew Rybchenko }; 7405e111ed8SAndrew Rybchenko 7415e111ed8SAndrew Rybchenko typedef struct efx_evb_ops_s { 7425e111ed8SAndrew Rybchenko efx_rc_t (*eeo_init)(efx_nic_t *); 7435e111ed8SAndrew Rybchenko void (*eeo_fini)(efx_nic_t *); 7445e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vswitch_alloc)(efx_nic_t *, efx_vswitch_id_t *); 7455e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vswitch_free)(efx_nic_t *, efx_vswitch_id_t); 7465e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_alloc)(efx_nic_t *, efx_vswitch_id_t, 7475e111ed8SAndrew Rybchenko efx_vport_type_t, uint16_t, 7485e111ed8SAndrew Rybchenko boolean_t, efx_vport_id_t *); 7495e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_free)(efx_nic_t *, efx_vswitch_id_t, 7505e111ed8SAndrew Rybchenko efx_vport_id_t); 7515e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_mac_addr_add)(efx_nic_t *, efx_vswitch_id_t, 7525e111ed8SAndrew Rybchenko efx_vport_id_t, uint8_t *); 7535e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_mac_addr_del)(efx_nic_t *, efx_vswitch_id_t, 7545e111ed8SAndrew Rybchenko efx_vport_id_t, uint8_t *); 7555e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vadaptor_alloc)(efx_nic_t *, efx_vswitch_id_t, 7565e111ed8SAndrew Rybchenko efx_vport_id_t); 7575e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vadaptor_free)(efx_nic_t *, efx_vswitch_id_t, 7585e111ed8SAndrew Rybchenko efx_vport_id_t); 7595e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_assign)(efx_nic_t *, efx_vswitch_id_t, 7605e111ed8SAndrew Rybchenko efx_vport_id_t, uint32_t); 7615e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_reconfigure)(efx_nic_t *, efx_vswitch_id_t, 7625e111ed8SAndrew Rybchenko efx_vport_id_t, 7635e111ed8SAndrew Rybchenko uint16_t *, uint8_t *, 7645e111ed8SAndrew Rybchenko boolean_t *); 7655e111ed8SAndrew Rybchenko efx_rc_t (*eeo_vport_stats)(efx_nic_t *, efx_vswitch_id_t, 7665e111ed8SAndrew Rybchenko efx_vport_id_t, efsys_mem_t *); 7675e111ed8SAndrew Rybchenko } efx_evb_ops_t; 7685e111ed8SAndrew Rybchenko 7695e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 7705e111ed8SAndrew Rybchenko extern __checkReturn boolean_t 7715e111ed8SAndrew Rybchenko efx_is_zero_eth_addr( 7725e111ed8SAndrew Rybchenko __in_bcount(EFX_MAC_ADDR_LEN) const uint8_t *addrp); 7735e111ed8SAndrew Rybchenko 7745e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_EVB */ 7755e111ed8SAndrew Rybchenko 7765e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 7775e111ed8SAndrew Rybchenko 7785e111ed8SAndrew Rybchenko #define EFX_PROXY_CONFIGURE_MAGIC 0xAB2015EF 7795e111ed8SAndrew Rybchenko 7805e111ed8SAndrew Rybchenko 7815e111ed8SAndrew Rybchenko typedef struct efx_proxy_ops_s { 7825e111ed8SAndrew Rybchenko efx_rc_t (*epo_init)(efx_nic_t *); 7835e111ed8SAndrew Rybchenko void (*epo_fini)(efx_nic_t *); 7845e111ed8SAndrew Rybchenko efx_rc_t (*epo_mc_config)(efx_nic_t *, efsys_mem_t *, 7855e111ed8SAndrew Rybchenko efsys_mem_t *, efsys_mem_t *, 7865e111ed8SAndrew Rybchenko uint32_t, uint32_t *, size_t); 7875e111ed8SAndrew Rybchenko efx_rc_t (*epo_disable)(efx_nic_t *); 7885e111ed8SAndrew Rybchenko efx_rc_t (*epo_privilege_modify)(efx_nic_t *, uint32_t, uint32_t, 7895e111ed8SAndrew Rybchenko uint32_t, uint32_t, uint32_t); 7905e111ed8SAndrew Rybchenko efx_rc_t (*epo_set_privilege_mask)(efx_nic_t *, uint32_t, 7915e111ed8SAndrew Rybchenko uint32_t, uint32_t); 7925e111ed8SAndrew Rybchenko efx_rc_t (*epo_complete_request)(efx_nic_t *, uint32_t, 7935e111ed8SAndrew Rybchenko uint32_t, uint32_t); 7945e111ed8SAndrew Rybchenko efx_rc_t (*epo_exec_cmd)(efx_nic_t *, efx_proxy_cmd_params_t *); 7955e111ed8SAndrew Rybchenko efx_rc_t (*epo_get_privilege_mask)(efx_nic_t *, uint32_t, 7965e111ed8SAndrew Rybchenko uint32_t, uint32_t *); 7975e111ed8SAndrew Rybchenko } efx_proxy_ops_t; 7985e111ed8SAndrew Rybchenko 7995e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 8005e111ed8SAndrew Rybchenko 8016f956d5cSIvan Malov #if EFSYS_OPT_MAE 8026f956d5cSIvan Malov 80334285fd0SIvan Malov typedef struct efx_mae_field_cap_s { 80434285fd0SIvan Malov uint32_t emfc_support; 80534285fd0SIvan Malov boolean_t emfc_mask_affects_class; 80634285fd0SIvan Malov boolean_t emfc_match_affects_class; 80734285fd0SIvan Malov } efx_mae_field_cap_t; 80834285fd0SIvan Malov 8096f956d5cSIvan Malov typedef struct efx_mae_s { 810d761ec9fSIvan Malov uint32_t em_max_n_action_prios; 81134285fd0SIvan Malov /* 81234285fd0SIvan Malov * The number of MAE field IDs recognised by the FW implementation. 81334285fd0SIvan Malov * Any field ID greater than or equal to this value is unsupported. 81434285fd0SIvan Malov */ 81534285fd0SIvan Malov uint32_t em_max_nfields; 81634285fd0SIvan Malov /** Action rule match field capabilities. */ 81734285fd0SIvan Malov efx_mae_field_cap_t *em_action_rule_field_caps; 81834285fd0SIvan Malov size_t em_action_rule_field_caps_size; 819891408c4SIvan Malov uint32_t em_max_n_outer_prios; 820891408c4SIvan Malov uint32_t em_encap_types_supported; 821ed15d7f8SIvan Malov /** Outer rule match field capabilities. */ 822ed15d7f8SIvan Malov efx_mae_field_cap_t *em_outer_rule_field_caps; 823ed15d7f8SIvan Malov size_t em_outer_rule_field_caps_size; 824*bbc42f34SIgor Romanov uint32_t em_max_ncounters; 8256f956d5cSIvan Malov } efx_mae_t; 8266f956d5cSIvan Malov 8276f956d5cSIvan Malov #endif /* EFSYS_OPT_MAE */ 8286f956d5cSIvan Malov 8295e111ed8SAndrew Rybchenko #define EFX_DRV_VER_MAX 20 8305e111ed8SAndrew Rybchenko 8315e111ed8SAndrew Rybchenko typedef struct efx_drv_cfg_s { 8325e111ed8SAndrew Rybchenko uint32_t edc_min_vi_count; 8335e111ed8SAndrew Rybchenko uint32_t edc_max_vi_count; 8345e111ed8SAndrew Rybchenko 8355e111ed8SAndrew Rybchenko uint32_t edc_max_piobuf_count; 8365e111ed8SAndrew Rybchenko uint32_t edc_pio_alloc_size; 8375e111ed8SAndrew Rybchenko } efx_drv_cfg_t; 8385e111ed8SAndrew Rybchenko 8395e111ed8SAndrew Rybchenko struct efx_nic_s { 8405e111ed8SAndrew Rybchenko uint32_t en_magic; 8415e111ed8SAndrew Rybchenko efx_family_t en_family; 8425e111ed8SAndrew Rybchenko uint32_t en_features; 8435e111ed8SAndrew Rybchenko efsys_identifier_t *en_esip; 8445e111ed8SAndrew Rybchenko efsys_lock_t *en_eslp; 8455e111ed8SAndrew Rybchenko efsys_bar_t *en_esbp; 8465e111ed8SAndrew Rybchenko unsigned int en_mod_flags; 8475e111ed8SAndrew Rybchenko unsigned int en_reset_flags; 8485e111ed8SAndrew Rybchenko efx_nic_cfg_t en_nic_cfg; 8495e111ed8SAndrew Rybchenko efx_drv_cfg_t en_drv_cfg; 8505e111ed8SAndrew Rybchenko efx_port_t en_port; 8515e111ed8SAndrew Rybchenko efx_mon_t en_mon; 8525e111ed8SAndrew Rybchenko efx_intr_t en_intr; 8535e111ed8SAndrew Rybchenko uint32_t en_ev_qcount; 8545e111ed8SAndrew Rybchenko uint32_t en_rx_qcount; 8555e111ed8SAndrew Rybchenko uint32_t en_tx_qcount; 8565e111ed8SAndrew Rybchenko const efx_nic_ops_t *en_enop; 8575e111ed8SAndrew Rybchenko const efx_ev_ops_t *en_eevop; 8585e111ed8SAndrew Rybchenko const efx_tx_ops_t *en_etxop; 8595e111ed8SAndrew Rybchenko const efx_rx_ops_t *en_erxop; 8605e111ed8SAndrew Rybchenko efx_fw_variant_t efv; 8615e111ed8SAndrew Rybchenko char en_drv_version[EFX_DRV_VER_MAX]; 8625e111ed8SAndrew Rybchenko #if EFSYS_OPT_FILTER 8635e111ed8SAndrew Rybchenko efx_filter_t en_filter; 8645e111ed8SAndrew Rybchenko const efx_filter_ops_t *en_efop; 8655e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_FILTER */ 8665e111ed8SAndrew Rybchenko #if EFSYS_OPT_TUNNEL 8675e111ed8SAndrew Rybchenko efx_tunnel_cfg_t en_tunnel_cfg; 8685e111ed8SAndrew Rybchenko const efx_tunnel_ops_t *en_etop; 8695e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_TUNNEL */ 8705e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 8715e111ed8SAndrew Rybchenko efx_mcdi_t en_mcdi; 8725e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 8735e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM 8745e111ed8SAndrew Rybchenko uint32_t en_nvram_partn_locked; 8755e111ed8SAndrew Rybchenko const efx_nvram_ops_t *en_envop; 8765e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM */ 8775e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 8785e111ed8SAndrew Rybchenko const efx_vpd_ops_t *en_evpdop; 8795e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 8804dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 8814dda72dbSVijay Srivastava const efx_virtio_ops_t *en_evop; 8824dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VPD */ 8835e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_SCALE 8845e111ed8SAndrew Rybchenko efx_rx_hash_support_t en_hash_support; 8855e111ed8SAndrew Rybchenko efx_rx_scale_context_type_t en_rss_context_type; 8865e111ed8SAndrew Rybchenko uint32_t en_rss_context; 8875e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_RX_SCALE */ 8885e111ed8SAndrew Rybchenko uint32_t en_vport_id; 8895e111ed8SAndrew Rybchenko #if EFSYS_OPT_LICENSING 8905e111ed8SAndrew Rybchenko const efx_lic_ops_t *en_elop; 8915e111ed8SAndrew Rybchenko boolean_t en_licensing_supported; 8925e111ed8SAndrew Rybchenko #endif 8935e111ed8SAndrew Rybchenko union { 8945e111ed8SAndrew Rybchenko #if EFSYS_OPT_SIENA 8955e111ed8SAndrew Rybchenko struct { 8965e111ed8SAndrew Rybchenko #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 8975e111ed8SAndrew Rybchenko unsigned int enu_partn_mask; 8985e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 8995e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 9005e111ed8SAndrew Rybchenko caddr_t enu_svpd; 9015e111ed8SAndrew Rybchenko size_t enu_svpd_length; 9025e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 9035e111ed8SAndrew Rybchenko int enu_unused; 9045e111ed8SAndrew Rybchenko } siena; 9055e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_SIENA */ 9065e111ed8SAndrew Rybchenko int enu_unused; 9075e111ed8SAndrew Rybchenko } en_u; 9083c1c5cc4SAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 9095e111ed8SAndrew Rybchenko union en_arch { 9105e111ed8SAndrew Rybchenko struct { 9115e111ed8SAndrew Rybchenko int ena_vi_base; 9125e111ed8SAndrew Rybchenko int ena_vi_count; 9135e111ed8SAndrew Rybchenko int ena_vi_shift; 914341bd4e0SIgor Romanov uint32_t ena_fcw_base; 9155e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 9165e111ed8SAndrew Rybchenko caddr_t ena_svpd; 9175e111ed8SAndrew Rybchenko size_t ena_svpd_length; 9185e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 9195e111ed8SAndrew Rybchenko efx_piobuf_handle_t ena_piobuf_handle[EF10_MAX_PIOBUF_NBUFS]; 9205e111ed8SAndrew Rybchenko uint32_t ena_piobuf_count; 9215e111ed8SAndrew Rybchenko uint32_t ena_pio_alloc_map[EF10_MAX_PIOBUF_NBUFS]; 9225e111ed8SAndrew Rybchenko uint32_t ena_pio_write_vi_base; 9235e111ed8SAndrew Rybchenko /* Memory BAR mapping regions */ 9245e111ed8SAndrew Rybchenko uint32_t ena_uc_mem_map_offset; 9255e111ed8SAndrew Rybchenko size_t ena_uc_mem_map_size; 9265e111ed8SAndrew Rybchenko uint32_t ena_wc_mem_map_offset; 9275e111ed8SAndrew Rybchenko size_t ena_wc_mem_map_size; 9285e111ed8SAndrew Rybchenko } ef10; 9295e111ed8SAndrew Rybchenko } en_arch; 9303c1c5cc4SAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 9315e111ed8SAndrew Rybchenko #if EFSYS_OPT_EVB 9325e111ed8SAndrew Rybchenko const efx_evb_ops_t *en_eeop; 9335e111ed8SAndrew Rybchenko struct efx_vswitch_s *en_vswitchp; 9345e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_EVB */ 9355e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 9365e111ed8SAndrew Rybchenko const efx_proxy_ops_t *en_epop; 9375e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 9386f956d5cSIvan Malov #if EFSYS_OPT_MAE 9396f956d5cSIvan Malov efx_mae_t *en_maep; 9406f956d5cSIvan Malov #endif /* EFSYS_OPT_MAE */ 9415e111ed8SAndrew Rybchenko }; 9425e111ed8SAndrew Rybchenko 9435e111ed8SAndrew Rybchenko #define EFX_FAMILY_IS_EF10(_enp) \ 9445e111ed8SAndrew Rybchenko ((_enp)->en_family == EFX_FAMILY_MEDFORD2 || \ 9455e111ed8SAndrew Rybchenko (_enp)->en_family == EFX_FAMILY_MEDFORD || \ 9465e111ed8SAndrew Rybchenko (_enp)->en_family == EFX_FAMILY_HUNTINGTON) 9475e111ed8SAndrew Rybchenko 948206ef24fSAndrew Rybchenko #define EFX_FAMILY_IS_EF100(_enp) \ 949206ef24fSAndrew Rybchenko ((_enp)->en_family == EFX_FAMILY_RIVERHEAD) 950206ef24fSAndrew Rybchenko 9515e111ed8SAndrew Rybchenko 9525e111ed8SAndrew Rybchenko #define EFX_NIC_MAGIC 0x02121996 9535e111ed8SAndrew Rybchenko 9545e111ed8SAndrew Rybchenko typedef boolean_t (*efx_ev_handler_t)(efx_evq_t *, efx_qword_t *, 9555e111ed8SAndrew Rybchenko const efx_ev_callbacks_t *, void *); 9565e111ed8SAndrew Rybchenko 957ea42cae4SAndy Moreton #if EFSYS_OPT_EV_EXTENDED_WIDTH 958ea42cae4SAndy Moreton typedef boolean_t (*efx_ev_ew_handler_t)(efx_evq_t *, efx_xword_t *, 959ea42cae4SAndy Moreton const efx_ev_callbacks_t *, void *); 960ea42cae4SAndy Moreton #endif /* EFSYS_OPT_EV_EXTENDED_WIDTH */ 961ea42cae4SAndy Moreton 9625e111ed8SAndrew Rybchenko typedef struct efx_evq_rxq_state_s { 9635e111ed8SAndrew Rybchenko unsigned int eers_rx_read_ptr; 9645e111ed8SAndrew Rybchenko unsigned int eers_rx_mask; 9655e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM || EFSYS_OPT_RX_ES_SUPER_BUFFER 9665e111ed8SAndrew Rybchenko unsigned int eers_rx_stream_npackets; 9675e111ed8SAndrew Rybchenko boolean_t eers_rx_packed_stream; 9685e111ed8SAndrew Rybchenko #endif 9695e111ed8SAndrew Rybchenko #if EFSYS_OPT_RX_PACKED_STREAM 9705e111ed8SAndrew Rybchenko unsigned int eers_rx_packed_stream_credits; 9715e111ed8SAndrew Rybchenko #endif 9725e111ed8SAndrew Rybchenko } efx_evq_rxq_state_t; 9735e111ed8SAndrew Rybchenko 9745e111ed8SAndrew Rybchenko struct efx_evq_s { 9755e111ed8SAndrew Rybchenko uint32_t ee_magic; 9765e111ed8SAndrew Rybchenko uint32_t ee_flags; 9775e111ed8SAndrew Rybchenko efx_nic_t *ee_enp; 9785e111ed8SAndrew Rybchenko unsigned int ee_index; 9795e111ed8SAndrew Rybchenko unsigned int ee_mask; 9805e111ed8SAndrew Rybchenko efsys_mem_t *ee_esmp; 9815e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 9825e111ed8SAndrew Rybchenko uint32_t ee_stat[EV_NQSTATS]; 9835e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */ 9845e111ed8SAndrew Rybchenko 9855e111ed8SAndrew Rybchenko efx_ev_handler_t ee_rx; 9865e111ed8SAndrew Rybchenko efx_ev_handler_t ee_tx; 9875e111ed8SAndrew Rybchenko efx_ev_handler_t ee_driver; 9885e111ed8SAndrew Rybchenko efx_ev_handler_t ee_global; 9895e111ed8SAndrew Rybchenko efx_ev_handler_t ee_drv_gen; 9905e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 9915e111ed8SAndrew Rybchenko efx_ev_handler_t ee_mcdi; 9925e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 9935e111ed8SAndrew Rybchenko 994ea42cae4SAndy Moreton #if EFSYS_OPT_DESC_PROXY 995ea42cae4SAndy Moreton efx_ev_ew_handler_t ee_ew_txq_desc; 996ea42cae4SAndy Moreton efx_ev_ew_handler_t ee_ew_virtq_desc; 997ea42cae4SAndy Moreton #endif /* EFSYS_OPT_DESC_PROXY */ 998ea42cae4SAndy Moreton 9995e111ed8SAndrew Rybchenko efx_evq_rxq_state_t ee_rxq_state[EFX_EV_RX_NLABELS]; 10005e111ed8SAndrew Rybchenko }; 10015e111ed8SAndrew Rybchenko 10025e111ed8SAndrew Rybchenko #define EFX_EVQ_MAGIC 0x08081997 10035e111ed8SAndrew Rybchenko 10045e111ed8SAndrew Rybchenko #define EFX_EVQ_SIENA_TIMER_QUANTUM_NS 6144 /* 768 cycles */ 10055e111ed8SAndrew Rybchenko 10065e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 10075e111ed8SAndrew Rybchenko #define EFX_EV_QSTAT_INCR(_eep, _stat) \ 10085e111ed8SAndrew Rybchenko do { \ 10095e111ed8SAndrew Rybchenko (_eep)->ee_stat[_stat]++; \ 10105e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10115e111ed8SAndrew Rybchenko } while (B_FALSE) 10125e111ed8SAndrew Rybchenko #else 10135e111ed8SAndrew Rybchenko #define EFX_EV_QSTAT_INCR(_eep, _stat) 10145e111ed8SAndrew Rybchenko #endif 10155e111ed8SAndrew Rybchenko 10165e111ed8SAndrew Rybchenko struct efx_rxq_s { 10175e111ed8SAndrew Rybchenko uint32_t er_magic; 10185e111ed8SAndrew Rybchenko efx_nic_t *er_enp; 10195e111ed8SAndrew Rybchenko efx_evq_t *er_eep; 10205e111ed8SAndrew Rybchenko unsigned int er_index; 10215e111ed8SAndrew Rybchenko unsigned int er_label; 10225e111ed8SAndrew Rybchenko unsigned int er_mask; 10235e111ed8SAndrew Rybchenko size_t er_buf_size; 10245e111ed8SAndrew Rybchenko efsys_mem_t *er_esmp; 10255e111ed8SAndrew Rybchenko efx_evq_rxq_state_t *er_ev_qstate; 10266bba823fSAndrew Rybchenko efx_rx_prefix_layout_t er_prefix_layout; 10275e111ed8SAndrew Rybchenko }; 10285e111ed8SAndrew Rybchenko 10295e111ed8SAndrew Rybchenko #define EFX_RXQ_MAGIC 0x15022005 10305e111ed8SAndrew Rybchenko 10315e111ed8SAndrew Rybchenko struct efx_txq_s { 10325e111ed8SAndrew Rybchenko uint32_t et_magic; 10335e111ed8SAndrew Rybchenko efx_nic_t *et_enp; 10345e111ed8SAndrew Rybchenko unsigned int et_index; 10355e111ed8SAndrew Rybchenko unsigned int et_mask; 10365e111ed8SAndrew Rybchenko efsys_mem_t *et_esmp; 10375e111ed8SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON 10385e111ed8SAndrew Rybchenko uint32_t et_pio_bufnum; 10395e111ed8SAndrew Rybchenko uint32_t et_pio_blknum; 10405e111ed8SAndrew Rybchenko uint32_t et_pio_write_offset; 10415e111ed8SAndrew Rybchenko uint32_t et_pio_offset; 10425e111ed8SAndrew Rybchenko size_t et_pio_size; 10435e111ed8SAndrew Rybchenko #endif 10445e111ed8SAndrew Rybchenko #if EFSYS_OPT_QSTATS 10455e111ed8SAndrew Rybchenko uint32_t et_stat[TX_NQSTATS]; 10465e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */ 10475e111ed8SAndrew Rybchenko }; 10485e111ed8SAndrew Rybchenko 10495e111ed8SAndrew Rybchenko #define EFX_TXQ_MAGIC 0x05092005 10505e111ed8SAndrew Rybchenko 10515e111ed8SAndrew Rybchenko #define EFX_MAC_ADDR_COPY(_dst, _src) \ 10525e111ed8SAndrew Rybchenko do { \ 10535e111ed8SAndrew Rybchenko (_dst)[0] = (_src)[0]; \ 10545e111ed8SAndrew Rybchenko (_dst)[1] = (_src)[1]; \ 10555e111ed8SAndrew Rybchenko (_dst)[2] = (_src)[2]; \ 10565e111ed8SAndrew Rybchenko (_dst)[3] = (_src)[3]; \ 10575e111ed8SAndrew Rybchenko (_dst)[4] = (_src)[4]; \ 10585e111ed8SAndrew Rybchenko (_dst)[5] = (_src)[5]; \ 10595e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10605e111ed8SAndrew Rybchenko } while (B_FALSE) 10615e111ed8SAndrew Rybchenko 10625e111ed8SAndrew Rybchenko #define EFX_MAC_BROADCAST_ADDR_SET(_dst) \ 10635e111ed8SAndrew Rybchenko do { \ 10645e111ed8SAndrew Rybchenko uint16_t *_d = (uint16_t *)(_dst); \ 10655e111ed8SAndrew Rybchenko _d[0] = 0xffff; \ 10665e111ed8SAndrew Rybchenko _d[1] = 0xffff; \ 10675e111ed8SAndrew Rybchenko _d[2] = 0xffff; \ 10685e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10695e111ed8SAndrew Rybchenko } while (B_FALSE) 10705e111ed8SAndrew Rybchenko 10715e111ed8SAndrew Rybchenko #if EFSYS_OPT_CHECK_REG 10725e111ed8SAndrew Rybchenko #define EFX_CHECK_REG(_enp, _reg) \ 10735e111ed8SAndrew Rybchenko do { \ 10745e111ed8SAndrew Rybchenko const char *name = #_reg; \ 10755e111ed8SAndrew Rybchenko char min = name[4]; \ 10765e111ed8SAndrew Rybchenko char max = name[5]; \ 10775e111ed8SAndrew Rybchenko char rev; \ 10785e111ed8SAndrew Rybchenko \ 10795e111ed8SAndrew Rybchenko switch ((_enp)->en_family) { \ 10805e111ed8SAndrew Rybchenko case EFX_FAMILY_SIENA: \ 10815e111ed8SAndrew Rybchenko rev = 'C'; \ 10825e111ed8SAndrew Rybchenko break; \ 10835e111ed8SAndrew Rybchenko \ 10845e111ed8SAndrew Rybchenko case EFX_FAMILY_HUNTINGTON: \ 10855e111ed8SAndrew Rybchenko rev = 'D'; \ 10865e111ed8SAndrew Rybchenko break; \ 10875e111ed8SAndrew Rybchenko \ 10885e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD: \ 10895e111ed8SAndrew Rybchenko rev = 'E'; \ 10905e111ed8SAndrew Rybchenko break; \ 10915e111ed8SAndrew Rybchenko \ 10925e111ed8SAndrew Rybchenko case EFX_FAMILY_MEDFORD2: \ 10935e111ed8SAndrew Rybchenko rev = 'F'; \ 10945e111ed8SAndrew Rybchenko break; \ 10955e111ed8SAndrew Rybchenko \ 109682c17c52SAndrew Rybchenko case EFX_FAMILY_RIVERHEAD: \ 109782c17c52SAndrew Rybchenko rev = 'G'; \ 109882c17c52SAndrew Rybchenko break; \ 109982c17c52SAndrew Rybchenko \ 11005e111ed8SAndrew Rybchenko default: \ 11015e111ed8SAndrew Rybchenko rev = '?'; \ 11025e111ed8SAndrew Rybchenko break; \ 11035e111ed8SAndrew Rybchenko } \ 11045e111ed8SAndrew Rybchenko \ 11055e111ed8SAndrew Rybchenko EFSYS_ASSERT3S(rev, >=, min); \ 11065e111ed8SAndrew Rybchenko EFSYS_ASSERT3S(rev, <=, max); \ 11075e111ed8SAndrew Rybchenko \ 11085e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11095e111ed8SAndrew Rybchenko } while (B_FALSE) 11105e111ed8SAndrew Rybchenko #else 11115e111ed8SAndrew Rybchenko #define EFX_CHECK_REG(_enp, _reg) do { \ 11125e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11135e111ed8SAndrew Rybchenko } while (B_FALSE) 11145e111ed8SAndrew Rybchenko #endif 11155e111ed8SAndrew Rybchenko 11165e111ed8SAndrew Rybchenko #define EFX_BAR_READD(_enp, _reg, _edp, _lock) \ 11175e111ed8SAndrew Rybchenko do { \ 11185e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11195e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST, \ 11205e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11215e111ed8SAndrew Rybchenko EFSYS_PROBE3(efx_bar_readd, const char *, #_reg, \ 11225e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11235e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11245e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11255e111ed8SAndrew Rybchenko } while (B_FALSE) 11265e111ed8SAndrew Rybchenko 11275e111ed8SAndrew Rybchenko #define EFX_BAR_WRITED(_enp, _reg, _edp, _lock) \ 11285e111ed8SAndrew Rybchenko do { \ 11295e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11305e111ed8SAndrew Rybchenko EFSYS_PROBE3(efx_bar_writed, const char *, #_reg, \ 11315e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11325e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 11335e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST, \ 11345e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 11355e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11365e111ed8SAndrew Rybchenko } while (B_FALSE) 11375e111ed8SAndrew Rybchenko 11385e111ed8SAndrew Rybchenko #define EFX_BAR_READQ(_enp, _reg, _eqp) \ 11395e111ed8SAndrew Rybchenko do { \ 11405e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11415e111ed8SAndrew Rybchenko EFSYS_BAR_READQ((_enp)->en_esbp, _reg ## _OFST, \ 11425e111ed8SAndrew Rybchenko (_eqp)); \ 11435e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_readq, const char *, #_reg, \ 11445e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11455e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 11465e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 11475e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11485e111ed8SAndrew Rybchenko } while (B_FALSE) 11495e111ed8SAndrew Rybchenko 11505e111ed8SAndrew Rybchenko #define EFX_BAR_WRITEQ(_enp, _reg, _eqp) \ 11515e111ed8SAndrew Rybchenko do { \ 11525e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11535e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_writeq, const char *, #_reg, \ 11545e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11555e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 11565e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 11575e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEQ((_enp)->en_esbp, _reg ## _OFST, \ 11585e111ed8SAndrew Rybchenko (_eqp)); \ 11595e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11605e111ed8SAndrew Rybchenko } while (B_FALSE) 11615e111ed8SAndrew Rybchenko 11625e111ed8SAndrew Rybchenko #define EFX_BAR_READO(_enp, _reg, _eop) \ 11635e111ed8SAndrew Rybchenko do { \ 11645e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11655e111ed8SAndrew Rybchenko EFSYS_BAR_READO((_enp)->en_esbp, _reg ## _OFST, \ 11665e111ed8SAndrew Rybchenko (_eop), B_TRUE); \ 11675e111ed8SAndrew Rybchenko EFSYS_PROBE6(efx_bar_reado, const char *, #_reg, \ 11685e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11695e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 11705e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 11715e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 11725e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 11735e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11745e111ed8SAndrew Rybchenko } while (B_FALSE) 11755e111ed8SAndrew Rybchenko 11765e111ed8SAndrew Rybchenko #define EFX_BAR_WRITEO(_enp, _reg, _eop) \ 11775e111ed8SAndrew Rybchenko do { \ 11785e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 11795e111ed8SAndrew Rybchenko EFSYS_PROBE6(efx_bar_writeo, const char *, #_reg, \ 11805e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 11815e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 11825e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 11835e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 11845e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 11855e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEO((_enp)->en_esbp, _reg ## _OFST, \ 11865e111ed8SAndrew Rybchenko (_eop), B_TRUE); \ 11875e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 11885e111ed8SAndrew Rybchenko } while (B_FALSE) 11895e111ed8SAndrew Rybchenko 11905e111ed8SAndrew Rybchenko /* 11915e111ed8SAndrew Rybchenko * Accessors for memory BAR non-VI tables. 11925e111ed8SAndrew Rybchenko * 11935e111ed8SAndrew Rybchenko * Code used on EF10 *must* use EFX_BAR_VI_*() macros for per-VI registers, 11945e111ed8SAndrew Rybchenko * to ensure the correct runtime VI window size is used on Medford2. 11955e111ed8SAndrew Rybchenko * 1196341bd4e0SIgor Romanov * Code used on EF100 *must* use EFX_BAR_FCW_* macros for function control 1197341bd4e0SIgor Romanov * window registers, to ensure the correct starting offset is used. 1198341bd4e0SIgor Romanov * 11995e111ed8SAndrew Rybchenko * Siena-only code may continue using EFX_BAR_TBL_*() macros for VI registers. 12005e111ed8SAndrew Rybchenko */ 12015e111ed8SAndrew Rybchenko 12025e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READD(_enp, _reg, _index, _edp, _lock) \ 12035e111ed8SAndrew Rybchenko do { \ 12045e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12055e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, \ 12065e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12075e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12085e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_readd, const char *, #_reg, \ 12095e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12105e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12115e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12125e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12135e111ed8SAndrew Rybchenko } while (B_FALSE) 12145e111ed8SAndrew Rybchenko 12155e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITED(_enp, _reg, _index, _edp, _lock) \ 12165e111ed8SAndrew Rybchenko do { \ 12175e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12185e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 12195e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12205e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12215e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12225e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 12235e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12245e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12255e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12265e111ed8SAndrew Rybchenko } while (B_FALSE) 12275e111ed8SAndrew Rybchenko 12285e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITED3(_enp, _reg, _index, _edp, _lock) \ 12295e111ed8SAndrew Rybchenko do { \ 12305e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12315e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_tbl_writed, const char *, #_reg, \ 12325e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12335e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12345e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 12355e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 12365e111ed8SAndrew Rybchenko (_reg ## _OFST + \ 12375e111ed8SAndrew Rybchenko (3 * sizeof (efx_dword_t)) + \ 12385e111ed8SAndrew Rybchenko ((_index) * _reg ## _STEP)), \ 12395e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 12405e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12415e111ed8SAndrew Rybchenko } while (B_FALSE) 12425e111ed8SAndrew Rybchenko 12435e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READQ(_enp, _reg, _index, _eqp) \ 12445e111ed8SAndrew Rybchenko do { \ 12455e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12465e111ed8SAndrew Rybchenko EFSYS_BAR_READQ((_enp)->en_esbp, \ 12475e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12485e111ed8SAndrew Rybchenko (_eqp)); \ 12495e111ed8SAndrew Rybchenko EFSYS_PROBE5(efx_bar_tbl_readq, const char *, #_reg, \ 12505e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12515e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12525e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 12535e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 12545e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12555e111ed8SAndrew Rybchenko } while (B_FALSE) 12565e111ed8SAndrew Rybchenko 12575e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITEQ(_enp, _reg, _index, _eqp) \ 12585e111ed8SAndrew Rybchenko do { \ 12595e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12605e111ed8SAndrew Rybchenko EFSYS_PROBE5(efx_bar_tbl_writeq, const char *, #_reg, \ 12615e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12625e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12635e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 12645e111ed8SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 12655e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEQ((_enp)->en_esbp, \ 12665e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12675e111ed8SAndrew Rybchenko (_eqp)); \ 12685e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12695e111ed8SAndrew Rybchenko } while (B_FALSE) 12705e111ed8SAndrew Rybchenko 12715e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_READO(_enp, _reg, _index, _eop, _lock) \ 12725e111ed8SAndrew Rybchenko do { \ 12735e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12745e111ed8SAndrew Rybchenko EFSYS_BAR_READO((_enp)->en_esbp, \ 12755e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12765e111ed8SAndrew Rybchenko (_eop), (_lock)); \ 12775e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_tbl_reado, const char *, #_reg, \ 12785e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12795e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12805e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 12815e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 12825e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 12835e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 12845e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 12855e111ed8SAndrew Rybchenko } while (B_FALSE) 12865e111ed8SAndrew Rybchenko 12875e111ed8SAndrew Rybchenko #define EFX_BAR_TBL_WRITEO(_enp, _reg, _index, _eop, _lock) \ 12885e111ed8SAndrew Rybchenko do { \ 12895e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 12905e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_tbl_writeo, const char *, #_reg, \ 12915e111ed8SAndrew Rybchenko uint32_t, (_index), \ 12925e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 12935e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 12945e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 12955e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 12965e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 12975e111ed8SAndrew Rybchenko EFSYS_BAR_WRITEO((_enp)->en_esbp, \ 12985e111ed8SAndrew Rybchenko (_reg ## _OFST + ((_index) * _reg ## _STEP)), \ 12995e111ed8SAndrew Rybchenko (_eop), (_lock)); \ 13005e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13015e111ed8SAndrew Rybchenko } while (B_FALSE) 13025e111ed8SAndrew Rybchenko 13035e111ed8SAndrew Rybchenko /* 1304341bd4e0SIgor Romanov * Accessors for memory BAR function control window registers. 1305341bd4e0SIgor Romanov * 1306341bd4e0SIgor Romanov * The function control window is located at an offset which can be 1307341bd4e0SIgor Romanov * non-zero in case of Riverhead. 1308341bd4e0SIgor Romanov */ 1309341bd4e0SIgor Romanov 1310341bd4e0SIgor Romanov #if EFSYS_OPT_RIVERHEAD 1311341bd4e0SIgor Romanov 1312341bd4e0SIgor Romanov #define EFX_BAR_FCW_READD(_enp, _reg, _edp) \ 1313341bd4e0SIgor Romanov do { \ 1314341bd4e0SIgor Romanov EFX_CHECK_REG((_enp), (_reg)); \ 1315341bd4e0SIgor Romanov EFSYS_BAR_READD((_enp)->en_esbp, _reg ## _OFST + \ 1316341bd4e0SIgor Romanov (_enp)->en_arch.ef10.ena_fcw_base, \ 1317341bd4e0SIgor Romanov (_edp), B_FALSE); \ 1318341bd4e0SIgor Romanov EFSYS_PROBE3(efx_bar_fcw_readd, const char *, #_reg, \ 1319341bd4e0SIgor Romanov uint32_t, _reg ## _OFST, \ 1320341bd4e0SIgor Romanov uint32_t, (_edp)->ed_u32[0]); \ 1321341bd4e0SIgor Romanov _NOTE(CONSTANTCONDITION) \ 1322341bd4e0SIgor Romanov } while (B_FALSE) 1323341bd4e0SIgor Romanov 1324341bd4e0SIgor Romanov #define EFX_BAR_FCW_WRITED(_enp, _reg, _edp) \ 1325341bd4e0SIgor Romanov do { \ 1326341bd4e0SIgor Romanov EFX_CHECK_REG((_enp), (_reg)); \ 1327341bd4e0SIgor Romanov EFSYS_PROBE3(efx_bar_fcw_writed, const char *, #_reg, \ 1328341bd4e0SIgor Romanov uint32_t, _reg ## _OFST, \ 1329341bd4e0SIgor Romanov uint32_t, (_edp)->ed_u32[0]); \ 1330341bd4e0SIgor Romanov EFSYS_BAR_WRITED((_enp)->en_esbp, _reg ## _OFST + \ 1331341bd4e0SIgor Romanov (_enp)->en_arch.ef10.ena_fcw_base, \ 1332341bd4e0SIgor Romanov (_edp), B_FALSE); \ 1333341bd4e0SIgor Romanov _NOTE(CONSTANTCONDITION) \ 1334341bd4e0SIgor Romanov } while (B_FALSE) 1335341bd4e0SIgor Romanov 1336341bd4e0SIgor Romanov #endif /* EFSYS_OPT_RIVERHEAD */ 1337341bd4e0SIgor Romanov 1338341bd4e0SIgor Romanov /* 13395e111ed8SAndrew Rybchenko * Accessors for memory BAR per-VI registers. 13405e111ed8SAndrew Rybchenko * 13415e111ed8SAndrew Rybchenko * The VI window size is 8KB for Medford and all earlier controllers. 13425e111ed8SAndrew Rybchenko * For Medford2, the VI window size can be 8KB, 16KB or 64KB. 13435e111ed8SAndrew Rybchenko */ 13445e111ed8SAndrew Rybchenko 13455e111ed8SAndrew Rybchenko #define EFX_BAR_VI_READD(_enp, _reg, _index, _edp, _lock) \ 13465e111ed8SAndrew Rybchenko do { \ 13475e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13485e111ed8SAndrew Rybchenko EFSYS_BAR_READD((_enp)->en_esbp, \ 13495e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 13505e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 13515e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 13525e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_readd, const char *, #_reg, \ 13535e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13545e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13555e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 13565e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13575e111ed8SAndrew Rybchenko } while (B_FALSE) 13585e111ed8SAndrew Rybchenko 13595e111ed8SAndrew Rybchenko #define EFX_BAR_VI_WRITED(_enp, _reg, _index, _edp, _lock) \ 13605e111ed8SAndrew Rybchenko do { \ 13615e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13625e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_writed, const char *, #_reg, \ 13635e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13645e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13655e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 13665e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 13675e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 13685e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 13695e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 13705e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13715e111ed8SAndrew Rybchenko } while (B_FALSE) 13725e111ed8SAndrew Rybchenko 13735e111ed8SAndrew Rybchenko #define EFX_BAR_VI_WRITED2(_enp, _reg, _index, _edp, _lock) \ 13745e111ed8SAndrew Rybchenko do { \ 13755e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13765e111ed8SAndrew Rybchenko EFSYS_PROBE4(efx_bar_vi_writed, const char *, #_reg, \ 13775e111ed8SAndrew Rybchenko uint32_t, (_index), \ 13785e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 13795e111ed8SAndrew Rybchenko uint32_t, (_edp)->ed_u32[0]); \ 13805e111ed8SAndrew Rybchenko EFSYS_BAR_WRITED((_enp)->en_esbp, \ 13815e111ed8SAndrew Rybchenko ((_reg ## _OFST) + \ 13825e111ed8SAndrew Rybchenko (2 * sizeof (efx_dword_t)) + \ 13835e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 13845e111ed8SAndrew Rybchenko (_edp), (_lock)); \ 13855e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 13865e111ed8SAndrew Rybchenko } while (B_FALSE) 13875e111ed8SAndrew Rybchenko 13885e111ed8SAndrew Rybchenko /* 13895e111ed8SAndrew Rybchenko * Allow drivers to perform optimised 128-bit VI doorbell writes. 13905e111ed8SAndrew Rybchenko * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are 13915e111ed8SAndrew Rybchenko * special-cased in the BIU on the Falcon/Siena and EF10 architectures to avoid 13925e111ed8SAndrew Rybchenko * the need for locking in the host, and are the only ones known to be safe to 13935e111ed8SAndrew Rybchenko * use 128-bites write with. 13945e111ed8SAndrew Rybchenko */ 13955e111ed8SAndrew Rybchenko #define EFX_BAR_VI_DOORBELL_WRITEO(_enp, _reg, _index, _eop) \ 13965e111ed8SAndrew Rybchenko do { \ 13975e111ed8SAndrew Rybchenko EFX_CHECK_REG((_enp), (_reg)); \ 13985e111ed8SAndrew Rybchenko EFSYS_PROBE7(efx_bar_vi_doorbell_writeo, \ 13995e111ed8SAndrew Rybchenko const char *, #_reg, \ 14005e111ed8SAndrew Rybchenko uint32_t, (_index), \ 14015e111ed8SAndrew Rybchenko uint32_t, _reg ## _OFST, \ 14025e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 14035e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 14045e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 14055e111ed8SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 14065e111ed8SAndrew Rybchenko EFSYS_BAR_DOORBELL_WRITEO((_enp)->en_esbp, \ 14075e111ed8SAndrew Rybchenko (_reg ## _OFST + \ 14085e111ed8SAndrew Rybchenko ((_index) << (_enp)->en_nic_cfg.enc_vi_window_shift)), \ 14095e111ed8SAndrew Rybchenko (_eop)); \ 14105e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14115e111ed8SAndrew Rybchenko } while (B_FALSE) 14125e111ed8SAndrew Rybchenko 141382192e22SAndrew Rybchenko #define EFX_DMA_SYNC_QUEUE_FOR_DEVICE(_esmp, _entries, _desc_size, \ 141482192e22SAndrew Rybchenko _wptr, _owptr) \ 14155e111ed8SAndrew Rybchenko do { \ 14165e111ed8SAndrew Rybchenko unsigned int _new = (_wptr); \ 14175e111ed8SAndrew Rybchenko unsigned int _old = (_owptr); \ 14185e111ed8SAndrew Rybchenko \ 14195e111ed8SAndrew Rybchenko if ((_new) >= (_old)) \ 14205e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 142182192e22SAndrew Rybchenko (_old) * (_desc_size), \ 142282192e22SAndrew Rybchenko ((_new) - (_old)) * (_desc_size)); \ 14235e111ed8SAndrew Rybchenko else \ 14245e111ed8SAndrew Rybchenko /* \ 14255e111ed8SAndrew Rybchenko * It is cheaper to sync entire map than sync \ 14265e111ed8SAndrew Rybchenko * two parts especially when offset/size are \ 14275e111ed8SAndrew Rybchenko * ignored and entire map is synced in any case.\ 14285e111ed8SAndrew Rybchenko */ \ 14295e111ed8SAndrew Rybchenko EFSYS_DMA_SYNC_FOR_DEVICE((_esmp), \ 14305e111ed8SAndrew Rybchenko 0, \ 143182192e22SAndrew Rybchenko (_entries) * (_desc_size)); \ 14325e111ed8SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 14335e111ed8SAndrew Rybchenko } while (B_FALSE) 14345e111ed8SAndrew Rybchenko 14355e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14365e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14375e111ed8SAndrew Rybchenko efx_mac_select( 14385e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14395e111ed8SAndrew Rybchenko 14405e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14415e111ed8SAndrew Rybchenko extern void 14425e111ed8SAndrew Rybchenko efx_mac_multicast_hash_compute( 14435e111ed8SAndrew Rybchenko __in_ecount(6*count) uint8_t const *addrs, 14445e111ed8SAndrew Rybchenko __in int count, 14455e111ed8SAndrew Rybchenko __out efx_oword_t *hash_low, 14465e111ed8SAndrew Rybchenko __out efx_oword_t *hash_high); 14475e111ed8SAndrew Rybchenko 14485e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14495e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14505e111ed8SAndrew Rybchenko efx_phy_probe( 14515e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14525e111ed8SAndrew Rybchenko 14535e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14545e111ed8SAndrew Rybchenko extern void 14555e111ed8SAndrew Rybchenko efx_phy_unprobe( 14565e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 14575e111ed8SAndrew Rybchenko 14585e111ed8SAndrew Rybchenko #if EFSYS_OPT_VPD 14595e111ed8SAndrew Rybchenko 14605e111ed8SAndrew Rybchenko /* VPD utility functions */ 14615e111ed8SAndrew Rybchenko 14625e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14635e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14645e111ed8SAndrew Rybchenko efx_vpd_hunk_length( 14655e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 14665e111ed8SAndrew Rybchenko __in size_t size, 14675e111ed8SAndrew Rybchenko __out size_t *lengthp); 14685e111ed8SAndrew Rybchenko 14695e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14705e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14715e111ed8SAndrew Rybchenko efx_vpd_hunk_verify( 14725e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 14735e111ed8SAndrew Rybchenko __in size_t size, 14745e111ed8SAndrew Rybchenko __out_opt boolean_t *cksummedp); 14755e111ed8SAndrew Rybchenko 14765e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14775e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14785e111ed8SAndrew Rybchenko efx_vpd_hunk_reinit( 14795e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 14805e111ed8SAndrew Rybchenko __in size_t size, 14815e111ed8SAndrew Rybchenko __in boolean_t wantpid); 14825e111ed8SAndrew Rybchenko 14835e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14845e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14855e111ed8SAndrew Rybchenko efx_vpd_hunk_get( 14865e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 14875e111ed8SAndrew Rybchenko __in size_t size, 14885e111ed8SAndrew Rybchenko __in efx_vpd_tag_t tag, 14895e111ed8SAndrew Rybchenko __in efx_vpd_keyword_t keyword, 14905e111ed8SAndrew Rybchenko __out unsigned int *payloadp, 14915e111ed8SAndrew Rybchenko __out uint8_t *paylenp); 14925e111ed8SAndrew Rybchenko 14935e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 14945e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 14955e111ed8SAndrew Rybchenko efx_vpd_hunk_next( 14965e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 14975e111ed8SAndrew Rybchenko __in size_t size, 14985e111ed8SAndrew Rybchenko __out efx_vpd_tag_t *tagp, 14995e111ed8SAndrew Rybchenko __out efx_vpd_keyword_t *keyword, 15005e111ed8SAndrew Rybchenko __out_opt unsigned int *payloadp, 15015e111ed8SAndrew Rybchenko __out_opt uint8_t *paylenp, 15025e111ed8SAndrew Rybchenko __inout unsigned int *contp); 15035e111ed8SAndrew Rybchenko 15045e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15055e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15065e111ed8SAndrew Rybchenko efx_vpd_hunk_set( 15075e111ed8SAndrew Rybchenko __in_bcount(size) caddr_t data, 15085e111ed8SAndrew Rybchenko __in size_t size, 15095e111ed8SAndrew Rybchenko __in efx_vpd_value_t *evvp); 15105e111ed8SAndrew Rybchenko 15115e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_VPD */ 15125e111ed8SAndrew Rybchenko 15135e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI 15145e111ed8SAndrew Rybchenko 15155e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15165e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15175e111ed8SAndrew Rybchenko efx_mcdi_set_workaround( 15185e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 15195e111ed8SAndrew Rybchenko __in uint32_t type, 15205e111ed8SAndrew Rybchenko __in boolean_t enabled, 15215e111ed8SAndrew Rybchenko __out_opt uint32_t *flagsp); 15225e111ed8SAndrew Rybchenko 15235e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 15245e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 15255e111ed8SAndrew Rybchenko efx_mcdi_get_workarounds( 15265e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 15275e111ed8SAndrew Rybchenko __out_opt uint32_t *implementedp, 15285e111ed8SAndrew Rybchenko __out_opt uint32_t *enabledp); 15295e111ed8SAndrew Rybchenko 1530b97bf1caSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() 153185270581SAndrew Rybchenko 153285270581SAndrew Rybchenko LIBEFX_INTERNAL 153385270581SAndrew Rybchenko extern __checkReturn efx_rc_t 153485270581SAndrew Rybchenko efx_mcdi_init_evq( 153585270581SAndrew Rybchenko __in efx_nic_t *enp, 153685270581SAndrew Rybchenko __in unsigned int instance, 153785270581SAndrew Rybchenko __in efsys_mem_t *esmp, 153885270581SAndrew Rybchenko __in size_t nevs, 153985270581SAndrew Rybchenko __in uint32_t irq, 15403dee345aSAndrew Rybchenko __in uint32_t target_evq, 154185270581SAndrew Rybchenko __in uint32_t us, 154285270581SAndrew Rybchenko __in uint32_t flags, 154385270581SAndrew Rybchenko __in boolean_t low_latency); 154485270581SAndrew Rybchenko 154585270581SAndrew Rybchenko LIBEFX_INTERNAL 154685270581SAndrew Rybchenko extern __checkReturn efx_rc_t 154785270581SAndrew Rybchenko efx_mcdi_fini_evq( 154885270581SAndrew Rybchenko __in efx_nic_t *enp, 154985270581SAndrew Rybchenko __in uint32_t instance); 155085270581SAndrew Rybchenko 15517640543fSAndrew Rybchenko typedef struct efx_mcdi_init_rxq_params_s { 15527640543fSAndrew Rybchenko boolean_t disable_scatter; 15537640543fSAndrew Rybchenko boolean_t want_inner_classes; 15547640543fSAndrew Rybchenko uint32_t buf_size; 15557640543fSAndrew Rybchenko uint32_t ps_buf_size; 15567640543fSAndrew Rybchenko uint32_t es_bufs_per_desc; 15577640543fSAndrew Rybchenko uint32_t es_max_dma_len; 15587640543fSAndrew Rybchenko uint32_t es_buf_stride; 15597640543fSAndrew Rybchenko uint32_t hol_block_timeout; 1560c1f02189SAndrew Rybchenko uint32_t prefix_id; 15617640543fSAndrew Rybchenko } efx_mcdi_init_rxq_params_t; 15627640543fSAndrew Rybchenko 156309b59c7dSAndrew Rybchenko LIBEFX_INTERNAL 156409b59c7dSAndrew Rybchenko extern __checkReturn efx_rc_t 156509b59c7dSAndrew Rybchenko efx_mcdi_init_rxq( 156609b59c7dSAndrew Rybchenko __in efx_nic_t *enp, 156709b59c7dSAndrew Rybchenko __in uint32_t ndescs, 156809b59c7dSAndrew Rybchenko __in efx_evq_t *eep, 156909b59c7dSAndrew Rybchenko __in uint32_t label, 157009b59c7dSAndrew Rybchenko __in uint32_t instance, 157109b59c7dSAndrew Rybchenko __in efsys_mem_t *esmp, 15727640543fSAndrew Rybchenko __in const efx_mcdi_init_rxq_params_t *params); 157309b59c7dSAndrew Rybchenko 157409b59c7dSAndrew Rybchenko LIBEFX_INTERNAL 157509b59c7dSAndrew Rybchenko extern __checkReturn efx_rc_t 157609b59c7dSAndrew Rybchenko efx_mcdi_fini_rxq( 157709b59c7dSAndrew Rybchenko __in efx_nic_t *enp, 157809b59c7dSAndrew Rybchenko __in uint32_t instance); 157909b59c7dSAndrew Rybchenko 158070dc9c54SAndrew Rybchenko LIBEFX_INTERNAL 158170dc9c54SAndrew Rybchenko extern __checkReturn efx_rc_t 158270dc9c54SAndrew Rybchenko efx_mcdi_init_txq( 158370dc9c54SAndrew Rybchenko __in efx_nic_t *enp, 158470dc9c54SAndrew Rybchenko __in uint32_t ndescs, 158570dc9c54SAndrew Rybchenko __in uint32_t target_evq, 158670dc9c54SAndrew Rybchenko __in uint32_t label, 158770dc9c54SAndrew Rybchenko __in uint32_t instance, 158870dc9c54SAndrew Rybchenko __in uint16_t flags, 158970dc9c54SAndrew Rybchenko __in efsys_mem_t *esmp); 159070dc9c54SAndrew Rybchenko 159170dc9c54SAndrew Rybchenko LIBEFX_INTERNAL 159270dc9c54SAndrew Rybchenko extern __checkReturn efx_rc_t 159370dc9c54SAndrew Rybchenko efx_mcdi_fini_txq( 159470dc9c54SAndrew Rybchenko __in efx_nic_t *enp, 159570dc9c54SAndrew Rybchenko __in uint32_t instance); 159670dc9c54SAndrew Rybchenko 15974fd0181fSAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD || EFX_OPTS_EF10() */ 159809b59c7dSAndrew Rybchenko 15995e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI */ 16005e111ed8SAndrew Rybchenko 16015e111ed8SAndrew Rybchenko #if EFSYS_OPT_MAC_STATS 16025e111ed8SAndrew Rybchenko 16035e111ed8SAndrew Rybchenko /* 16045e111ed8SAndrew Rybchenko * Closed range of stats (i.e. the first and the last are included). 16055e111ed8SAndrew Rybchenko * The last must be greater or equal (if the range is one item only) to 16065e111ed8SAndrew Rybchenko * the first. 16075e111ed8SAndrew Rybchenko */ 16085e111ed8SAndrew Rybchenko struct efx_mac_stats_range { 16095e111ed8SAndrew Rybchenko efx_mac_stat_t first; 16105e111ed8SAndrew Rybchenko efx_mac_stat_t last; 16115e111ed8SAndrew Rybchenko }; 16125e111ed8SAndrew Rybchenko 16135e111ed8SAndrew Rybchenko typedef enum efx_stats_action_e { 16145e111ed8SAndrew Rybchenko EFX_STATS_CLEAR, 16155e111ed8SAndrew Rybchenko EFX_STATS_UPLOAD, 16165e111ed8SAndrew Rybchenko EFX_STATS_ENABLE_NOEVENTS, 16175e111ed8SAndrew Rybchenko EFX_STATS_ENABLE_EVENTS, 16185e111ed8SAndrew Rybchenko EFX_STATS_DISABLE, 16195e111ed8SAndrew Rybchenko } efx_stats_action_t; 16205e111ed8SAndrew Rybchenko 16215e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 16225e111ed8SAndrew Rybchenko extern efx_rc_t 16235e111ed8SAndrew Rybchenko efx_mac_stats_mask_add_ranges( 16245e111ed8SAndrew Rybchenko __inout_bcount(mask_size) uint32_t *maskp, 16255e111ed8SAndrew Rybchenko __in size_t mask_size, 16265e111ed8SAndrew Rybchenko __in_ecount(rng_count) const struct efx_mac_stats_range *rngp, 16275e111ed8SAndrew Rybchenko __in unsigned int rng_count); 16285e111ed8SAndrew Rybchenko 16295e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 16305e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 16315e111ed8SAndrew Rybchenko efx_mcdi_mac_stats( 16325e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 16335e111ed8SAndrew Rybchenko __in uint32_t vport_id, 16345e111ed8SAndrew Rybchenko __in_opt efsys_mem_t *esmp, 16355e111ed8SAndrew Rybchenko __in efx_stats_action_t action, 16365e111ed8SAndrew Rybchenko __in uint16_t period_ms); 16375e111ed8SAndrew Rybchenko 16385e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MAC_STATS */ 16395e111ed8SAndrew Rybchenko 1640a45edfceSIgor Romanov #if EFSYS_OPT_PCI 1641a45edfceSIgor Romanov 1642a45edfceSIgor Romanov /* 1643a45edfceSIgor Romanov * Find the next extended capability in a PCI device's config space 1644a45edfceSIgor Romanov * with specified capability id. 1645a45edfceSIgor Romanov * Passing 0 offset makes the function search from the start. 1646a45edfceSIgor Romanov * If search succeeds, found capability is in modified offset. 1647a45edfceSIgor Romanov * 1648a45edfceSIgor Romanov * Returns ENOENT if a capability is not found. 1649a45edfceSIgor Romanov */ 1650a45edfceSIgor Romanov LIBEFX_INTERNAL 1651a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1652a45edfceSIgor Romanov efx_pci_config_find_next_ext_cap( 1653a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 165407999984SIgor Romanov __in const efx_pci_ops_t *epop, 1655a45edfceSIgor Romanov __in uint16_t cap_id, 1656a45edfceSIgor Romanov __inout size_t *offsetp); 1657a45edfceSIgor Romanov 1658a45edfceSIgor Romanov /* 1659a45edfceSIgor Romanov * Get the next extended capability in a PCI device's config space. 1660a45edfceSIgor Romanov * Passing 0 offset makes the function get the first capability. 1661a45edfceSIgor Romanov * If search succeeds, the capability is in modified offset. 1662a45edfceSIgor Romanov * 1663a45edfceSIgor Romanov * Returns ENOENT if there is no next capability. 1664a45edfceSIgor Romanov */ 1665a45edfceSIgor Romanov LIBEFX_INTERNAL 1666a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1667a45edfceSIgor Romanov efx_pci_config_next_ext_cap( 1668a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 166907999984SIgor Romanov __in const efx_pci_ops_t *epop, 1670a45edfceSIgor Romanov __inout size_t *offsetp); 1671a45edfceSIgor Romanov 1672a45edfceSIgor Romanov /* 1673a45edfceSIgor Romanov * Find the next Xilinx capabilities table location by searching 1674a45edfceSIgor Romanov * PCI extended capabilities. 1675a45edfceSIgor Romanov * 1676a45edfceSIgor Romanov * Returns ENOENT if a table location is not found. 1677a45edfceSIgor Romanov */ 1678a45edfceSIgor Romanov LIBEFX_INTERNAL 1679a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1680a45edfceSIgor Romanov efx_pci_find_next_xilinx_cap_table( 1681a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 168207999984SIgor Romanov __in const efx_pci_ops_t *epop, 1683a45edfceSIgor Romanov __inout size_t *pci_cap_offsetp, 1684a45edfceSIgor Romanov __out unsigned int *xilinx_tbl_barp, 1685a45edfceSIgor Romanov __out efsys_dma_addr_t *xilinx_tbl_offsetp); 1686a45edfceSIgor Romanov 1687a45edfceSIgor Romanov /* 1688a45edfceSIgor Romanov * Read a Xilinx extended PCI capability that gives the location 1689a45edfceSIgor Romanov * of a Xilinx capabilities table. 1690a45edfceSIgor Romanov * 1691a45edfceSIgor Romanov * Returns ENOENT if the extended PCI capability does not contain 1692a45edfceSIgor Romanov * Xilinx capabilities table locator. 1693a45edfceSIgor Romanov */ 1694a45edfceSIgor Romanov LIBEFX_INTERNAL 1695a45edfceSIgor Romanov extern __checkReturn efx_rc_t 1696a45edfceSIgor Romanov efx_pci_read_ext_cap_xilinx_table( 1697a45edfceSIgor Romanov __in efsys_pci_config_t *espcp, 169807999984SIgor Romanov __in const efx_pci_ops_t *epop, 1699a45edfceSIgor Romanov __in size_t cap_offset, 1700a45edfceSIgor Romanov __out unsigned int *barp, 1701a45edfceSIgor Romanov __out efsys_dma_addr_t *offsetp); 1702a45edfceSIgor Romanov 1703ba9568b8SIgor Romanov /* 1704ba9568b8SIgor Romanov * Find a capability with specified format_id in a Xilinx capabilities table. 1705ba9568b8SIgor Romanov * Searching is started from provided offset, taking skip_first into account. 1706ba9568b8SIgor Romanov * If search succeeds, found capability is in modified offset. 1707ba9568b8SIgor Romanov * 1708ba9568b8SIgor Romanov * Returns ENOENT if an entry with specified format id is not found. 1709ba9568b8SIgor Romanov */ 1710ba9568b8SIgor Romanov LIBEFX_INTERNAL 1711ba9568b8SIgor Romanov extern __checkReturn efx_rc_t 1712ba9568b8SIgor Romanov efx_pci_xilinx_cap_tbl_find( 1713ba9568b8SIgor Romanov __in efsys_bar_t *esbp, 1714ba9568b8SIgor Romanov __in uint32_t format_id, 1715ba9568b8SIgor Romanov __in boolean_t skip_first, 1716ba9568b8SIgor Romanov __inout efsys_dma_addr_t *entry_offsetp); 1717ba9568b8SIgor Romanov 1718a45edfceSIgor Romanov #endif /* EFSYS_OPT_PCI */ 1719a45edfceSIgor Romanov 1720b75eb50dSIvan Malov #if EFSYS_OPT_MAE 1721b75eb50dSIvan Malov 1722b75eb50dSIvan Malov struct efx_mae_match_spec_s { 1723b75eb50dSIvan Malov efx_mae_rule_type_t emms_type; 1724b75eb50dSIvan Malov uint32_t emms_prio; 172534285fd0SIvan Malov union emms_mask_value_pairs { 172637907899SIvan Malov uint8_t action[ 172737907899SIvan Malov MAE_FIELD_MASK_VALUE_PAIRS_V2_LEN]; 17281efc26e1SIvan Malov uint8_t outer[MAE_ENC_FIELD_PAIRS_LEN]; 172934285fd0SIvan Malov } emms_mask_value_pairs; 1730b75eb50dSIvan Malov }; 1731b75eb50dSIvan Malov 173280019097SIvan Malov typedef enum efx_mae_action_e { 1733616b03e0SIvan Malov /* These actions are strictly ordered. */ 17340f6b017bSIvan Malov EFX_MAE_ACTION_DECAP, 1735616b03e0SIvan Malov EFX_MAE_ACTION_VLAN_POP, 173612cd7909SIvan Malov EFX_MAE_ACTION_VLAN_PUSH, 17373907defaSIvan Malov EFX_MAE_ACTION_ENCAP, 1738616b03e0SIvan Malov 173977da5888SIvan Malov /* 174077da5888SIvan Malov * These actions are not strictly ordered and can 174177da5888SIvan Malov * be passed by a client in any order (before DELIVER). 174277da5888SIvan Malov * However, these enumerants must be kept compactly 174377da5888SIvan Malov * in the end of the enumeration (before DELIVER). 174477da5888SIvan Malov */ 174577da5888SIvan Malov EFX_MAE_ACTION_FLAG, 174683352289SIvan Malov EFX_MAE_ACTION_MARK, 174777da5888SIvan Malov 174880019097SIvan Malov /* DELIVER is always the last action. */ 174980019097SIvan Malov EFX_MAE_ACTION_DELIVER, 175080019097SIvan Malov 175180019097SIvan Malov EFX_MAE_NACTIONS 175280019097SIvan Malov } efx_mae_action_t; 175380019097SIvan Malov 1754616b03e0SIvan Malov /* MAE VLAN_POP action can handle 1 or 2 tags. */ 1755616b03e0SIvan Malov #define EFX_MAE_VLAN_POP_MAX_NTAGS (2) 1756616b03e0SIvan Malov 175712cd7909SIvan Malov /* MAE VLAN_PUSH action can handle 1 or 2 tags. */ 175812cd7909SIvan Malov #define EFX_MAE_VLAN_PUSH_MAX_NTAGS (2) 175912cd7909SIvan Malov 176012cd7909SIvan Malov typedef struct efx_mae_action_vlan_push_s { 176112cd7909SIvan Malov uint16_t emavp_tpid_be; 176212cd7909SIvan Malov uint16_t emavp_tci_be; 176312cd7909SIvan Malov } efx_mae_action_vlan_push_t; 176412cd7909SIvan Malov 17653907defaSIvan Malov typedef struct efx_mae_actions_rsrc_s { 17663907defaSIvan Malov efx_mae_eh_id_t emar_eh_id; 17673907defaSIvan Malov } efx_mae_actions_rsrc_t; 17683907defaSIvan Malov 1769799889baSIvan Malov struct efx_mae_actions_s { 177080019097SIvan Malov /* Bitmap of actions in spec, indexed by action type */ 177180019097SIvan Malov uint32_t ema_actions; 177280019097SIvan Malov 1773616b03e0SIvan Malov unsigned int ema_n_vlan_tags_to_pop; 177412cd7909SIvan Malov unsigned int ema_n_vlan_tags_to_push; 177512cd7909SIvan Malov efx_mae_action_vlan_push_t ema_vlan_push_descs[ 177612cd7909SIvan Malov EFX_MAE_VLAN_PUSH_MAX_NTAGS]; 177783352289SIvan Malov uint32_t ema_mark_value; 177880019097SIvan Malov efx_mport_sel_t ema_deliver_mport; 17793907defaSIvan Malov 17803907defaSIvan Malov /* 17813907defaSIvan Malov * Always keep this at the end of the struct since 17823907defaSIvan Malov * efx_mae_action_set_specs_equal() relies on that 17833907defaSIvan Malov * to make sure that resource IDs are not compared. 17843907defaSIvan Malov */ 17853907defaSIvan Malov efx_mae_actions_rsrc_t ema_rsrc; 1786799889baSIvan Malov }; 1787799889baSIvan Malov 1788b75eb50dSIvan Malov #endif /* EFSYS_OPT_MAE */ 1789b75eb50dSIvan Malov 17904dda72dbSVijay Srivastava #if EFSYS_OPT_VIRTIO 17914dda72dbSVijay Srivastava 17924dda72dbSVijay Srivastava #define EFX_VQ_MAGIC 0x026011950 17934dda72dbSVijay Srivastava 17944dda72dbSVijay Srivastava typedef enum efx_virtio_vq_state_e { 17954dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_UNKNOWN = 0, 17964dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_INITIALIZED, 17974dda72dbSVijay Srivastava EFX_VIRTIO_VQ_STATE_STARTED, 17984dda72dbSVijay Srivastava EFX_VIRTIO_VQ_NSTATES 17994dda72dbSVijay Srivastava } efx_virtio_vq_state_t; 18004dda72dbSVijay Srivastava 18014dda72dbSVijay Srivastava struct efx_virtio_vq_s { 18024dda72dbSVijay Srivastava uint32_t evv_magic; 18034dda72dbSVijay Srivastava efx_nic_t *evv_enp; 18044dda72dbSVijay Srivastava efx_virtio_vq_state_t evv_state; 18054dda72dbSVijay Srivastava uint32_t evv_vi_index; 18064dda72dbSVijay Srivastava efx_virtio_vq_type_t evv_type; 18074dda72dbSVijay Srivastava uint16_t evv_target_vf; 18084dda72dbSVijay Srivastava }; 18094dda72dbSVijay Srivastava 18104dda72dbSVijay Srivastava #endif /* EFSYS_OPT_VIRTIO */ 18114dda72dbSVijay Srivastava 18125e111ed8SAndrew Rybchenko #ifdef __cplusplus 18135e111ed8SAndrew Rybchenko } 18145e111ed8SAndrew Rybchenko #endif 18155e111ed8SAndrew Rybchenko 18165e111ed8SAndrew Rybchenko #endif /* _SYS_EFX_IMPL_H */ 1817