15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause 25e111ed8SAndrew Rybchenko * 3672386c1SAndrew Rybchenko * Copyright(c) 2019-2021 Xilinx, Inc. 45e111ed8SAndrew Rybchenko * Copyright(c) 2009-2019 Solarflare Communications Inc. 55e111ed8SAndrew Rybchenko */ 65e111ed8SAndrew Rybchenko 75e111ed8SAndrew Rybchenko #ifndef _SYS_EFX_MCDI_H 85e111ed8SAndrew Rybchenko #define _SYS_EFX_MCDI_H 95e111ed8SAndrew Rybchenko 105e111ed8SAndrew Rybchenko #include "efx.h" 115e111ed8SAndrew Rybchenko #include "efx_regs_mcdi.h" 125e111ed8SAndrew Rybchenko 135e111ed8SAndrew Rybchenko #if EFSYS_OPT_NAMES 145e111ed8SAndrew Rybchenko #include "efx_regs_mcdi_strs.h" 155e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NAMES */ 165e111ed8SAndrew Rybchenko 175e111ed8SAndrew Rybchenko #ifdef __cplusplus 185e111ed8SAndrew Rybchenko extern "C" { 195e111ed8SAndrew Rybchenko #endif 205e111ed8SAndrew Rybchenko 215e111ed8SAndrew Rybchenko /* 225e111ed8SAndrew Rybchenko * A reboot/assertion causes the MCDI status word to be set after the 235e111ed8SAndrew Rybchenko * command word is set or a REBOOT event is sent. If we notice a reboot 245e111ed8SAndrew Rybchenko * via these mechanisms then wait 10ms for the status word to be set. 255e111ed8SAndrew Rybchenko */ 265e111ed8SAndrew Rybchenko #define EFX_MCDI_STATUS_SLEEP_US 10000 275e111ed8SAndrew Rybchenko 285e111ed8SAndrew Rybchenko struct efx_mcdi_req_s { 295e111ed8SAndrew Rybchenko boolean_t emr_quiet; 305e111ed8SAndrew Rybchenko /* Inputs: Command #, input buffer and length */ 315e111ed8SAndrew Rybchenko unsigned int emr_cmd; 325e111ed8SAndrew Rybchenko uint8_t *emr_in_buf; 335e111ed8SAndrew Rybchenko size_t emr_in_length; 345e111ed8SAndrew Rybchenko /* Outputs: retcode, buffer, length and length used */ 355e111ed8SAndrew Rybchenko efx_rc_t emr_rc; 365e111ed8SAndrew Rybchenko uint8_t *emr_out_buf; 375e111ed8SAndrew Rybchenko size_t emr_out_length; 385e111ed8SAndrew Rybchenko size_t emr_out_length_used; 395e111ed8SAndrew Rybchenko /* Internals: low level transport details */ 405e111ed8SAndrew Rybchenko unsigned int emr_err_code; 415e111ed8SAndrew Rybchenko unsigned int emr_err_arg; 425e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH 435e111ed8SAndrew Rybchenko uint32_t emr_proxy_handle; 445e111ed8SAndrew Rybchenko #endif 455e111ed8SAndrew Rybchenko }; 465e111ed8SAndrew Rybchenko 475e111ed8SAndrew Rybchenko typedef struct efx_mcdi_iface_s { 485e111ed8SAndrew Rybchenko unsigned int emi_port; 495e111ed8SAndrew Rybchenko unsigned int emi_max_version; 505e111ed8SAndrew Rybchenko unsigned int emi_seq; 515e111ed8SAndrew Rybchenko efx_mcdi_req_t *emi_pending_req; 525e111ed8SAndrew Rybchenko boolean_t emi_ev_cpl; 535e111ed8SAndrew Rybchenko boolean_t emi_new_epoch; 545e111ed8SAndrew Rybchenko int emi_aborted; 555e111ed8SAndrew Rybchenko uint32_t emi_poll_cnt; 565e111ed8SAndrew Rybchenko uint32_t emi_mc_reboot_status; 575e111ed8SAndrew Rybchenko } efx_mcdi_iface_t; 585e111ed8SAndrew Rybchenko 595e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 605e111ed8SAndrew Rybchenko extern void 615e111ed8SAndrew Rybchenko efx_mcdi_execute( 625e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 635e111ed8SAndrew Rybchenko __inout efx_mcdi_req_t *emrp); 645e111ed8SAndrew Rybchenko 655e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 665e111ed8SAndrew Rybchenko extern void 675e111ed8SAndrew Rybchenko efx_mcdi_execute_quiet( 685e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 695e111ed8SAndrew Rybchenko __inout efx_mcdi_req_t *emrp); 705e111ed8SAndrew Rybchenko 715e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 725e111ed8SAndrew Rybchenko extern void 735e111ed8SAndrew Rybchenko efx_mcdi_ev_cpl( 745e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 755e111ed8SAndrew Rybchenko __in unsigned int seq, 765e111ed8SAndrew Rybchenko __in unsigned int outlen, 775e111ed8SAndrew Rybchenko __in int errcode); 785e111ed8SAndrew Rybchenko 795e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH 805e111ed8SAndrew Rybchenko LIBEFX_API 815e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 825e111ed8SAndrew Rybchenko efx_mcdi_get_proxy_handle( 835e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 845e111ed8SAndrew Rybchenko __in efx_mcdi_req_t *emrp, 855e111ed8SAndrew Rybchenko __out uint32_t *handlep); 865e111ed8SAndrew Rybchenko 875e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 885e111ed8SAndrew Rybchenko extern void 895e111ed8SAndrew Rybchenko efx_mcdi_ev_proxy_response( 905e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 915e111ed8SAndrew Rybchenko __in unsigned int handle, 925e111ed8SAndrew Rybchenko __in unsigned int status); 935e111ed8SAndrew Rybchenko #endif 945e111ed8SAndrew Rybchenko 955e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER 965e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 975e111ed8SAndrew Rybchenko extern void 985e111ed8SAndrew Rybchenko efx_mcdi_ev_proxy_request( 995e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 1005e111ed8SAndrew Rybchenko __in unsigned int index); 1015e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */ 1025e111ed8SAndrew Rybchenko 1035e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1045e111ed8SAndrew Rybchenko extern void 1055e111ed8SAndrew Rybchenko efx_mcdi_ev_death( 1065e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 1075e111ed8SAndrew Rybchenko __in int rc); 1085e111ed8SAndrew Rybchenko 1095e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1105e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 1115e111ed8SAndrew Rybchenko efx_mcdi_request_errcode( 1125e111ed8SAndrew Rybchenko __in unsigned int err); 1135e111ed8SAndrew Rybchenko 1145e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1155e111ed8SAndrew Rybchenko extern void 1165e111ed8SAndrew Rybchenko efx_mcdi_raise_exception( 1175e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 1185e111ed8SAndrew Rybchenko __in_opt efx_mcdi_req_t *emrp, 1195e111ed8SAndrew Rybchenko __in int rc); 1205e111ed8SAndrew Rybchenko 121833cfcd5SIvan Malov /* 122833cfcd5SIvan Malov * Flags that name portions of extended version information 123833cfcd5SIvan Malov * 124833cfcd5SIvan Malov * The values match their MCDI counterparts. 125833cfcd5SIvan Malov */ 126833cfcd5SIvan Malov #define EFX_MCDI_VERSION_BOARD_INFO (1U << 4) 127833cfcd5SIvan Malov 128312191e8SIvan Malov typedef struct efx_mcdi_version_s { 129312191e8SIvan Malov /* Basic version information */ 130312191e8SIvan Malov uint16_t emv_version[4]; 131312191e8SIvan Malov uint32_t emv_firmware; 132833cfcd5SIvan Malov 133833cfcd5SIvan Malov /* 134833cfcd5SIvan Malov * Extended version information 135833cfcd5SIvan Malov * 136833cfcd5SIvan Malov * Valid portions of obtained information are indicated by flags. 137833cfcd5SIvan Malov */ 138833cfcd5SIvan Malov uint32_t emv_flags; 139833cfcd5SIvan Malov 140833cfcd5SIvan Malov /* Information valid if emv_flags has EFX_MCDI_VERSION_BOARD_INFO set */ 141833cfcd5SIvan Malov efx_nic_board_info_t emv_board_info; 142312191e8SIvan Malov } efx_mcdi_version_t; 143312191e8SIvan Malov 144312191e8SIvan Malov LIBEFX_INTERNAL 145312191e8SIvan Malov extern __checkReturn efx_rc_t 146312191e8SIvan Malov efx_mcdi_get_version( 147312191e8SIvan Malov __in efx_nic_t *enp, 148833cfcd5SIvan Malov __in uint32_t flags_req, 149312191e8SIvan Malov __out efx_mcdi_version_t *verp); 150312191e8SIvan Malov 1515e111ed8SAndrew Rybchenko typedef enum efx_mcdi_boot_e { 1525e111ed8SAndrew Rybchenko EFX_MCDI_BOOT_PRIMARY, 1535e111ed8SAndrew Rybchenko EFX_MCDI_BOOT_SECONDARY, 1545e111ed8SAndrew Rybchenko EFX_MCDI_BOOT_ROM, 1555e111ed8SAndrew Rybchenko } efx_mcdi_boot_t; 1565e111ed8SAndrew Rybchenko 1575e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1585e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 1595e111ed8SAndrew Rybchenko efx_mcdi_version( 1605e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 1615e111ed8SAndrew Rybchenko __out_ecount_opt(4) uint16_t versionp[4], 1625e111ed8SAndrew Rybchenko __out_opt uint32_t *buildp, 1635e111ed8SAndrew Rybchenko __out_opt efx_mcdi_boot_t *statusp); 1645e111ed8SAndrew Rybchenko 1655e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1665e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 1675e111ed8SAndrew Rybchenko efx_mcdi_get_capabilities( 1685e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 1695e111ed8SAndrew Rybchenko __out_opt uint32_t *flagsp, 1705e111ed8SAndrew Rybchenko __out_opt uint16_t *rx_dpcpu_fw_idp, 1715e111ed8SAndrew Rybchenko __out_opt uint16_t *tx_dpcpu_fw_idp, 1725e111ed8SAndrew Rybchenko __out_opt uint32_t *flags2p, 1735e111ed8SAndrew Rybchenko __out_opt uint32_t *tso2ncp); 1745e111ed8SAndrew Rybchenko 1755e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1765e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 1775e111ed8SAndrew Rybchenko efx_mcdi_read_assertion( 1785e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 1795e111ed8SAndrew Rybchenko 1805e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1815e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 1825e111ed8SAndrew Rybchenko efx_mcdi_exit_assertion_handler( 1835e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 1845e111ed8SAndrew Rybchenko 1855e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1865e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 1875e111ed8SAndrew Rybchenko efx_mcdi_drv_attach( 1885e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 1895e111ed8SAndrew Rybchenko __in boolean_t attach); 1905e111ed8SAndrew Rybchenko 1915e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 1925e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 1935e111ed8SAndrew Rybchenko efx_mcdi_get_board_cfg( 1945e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 1955e111ed8SAndrew Rybchenko __out_opt uint32_t *board_typep, 1965e111ed8SAndrew Rybchenko __out_opt efx_dword_t *capabilitiesp, 1975e111ed8SAndrew Rybchenko __out_ecount_opt(6) uint8_t mac_addrp[6]); 1985e111ed8SAndrew Rybchenko 1995e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2005e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2015e111ed8SAndrew Rybchenko efx_mcdi_get_phy_cfg( 2025e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 2035e111ed8SAndrew Rybchenko 2045e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2055e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2065e111ed8SAndrew Rybchenko efx_mcdi_firmware_update_supported( 2075e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2085e111ed8SAndrew Rybchenko __out boolean_t *supportedp); 2095e111ed8SAndrew Rybchenko 2105e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2115e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2125e111ed8SAndrew Rybchenko efx_mcdi_macaddr_change_supported( 2135e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2145e111ed8SAndrew Rybchenko __out boolean_t *supportedp); 2155e111ed8SAndrew Rybchenko 2165e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2175e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2185e111ed8SAndrew Rybchenko efx_mcdi_link_control_supported( 2195e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2205e111ed8SAndrew Rybchenko __out boolean_t *supportedp); 2215e111ed8SAndrew Rybchenko 2225e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2235e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2245e111ed8SAndrew Rybchenko efx_mcdi_mac_spoofing_supported( 2255e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2265e111ed8SAndrew Rybchenko __out boolean_t *supportedp); 2275e111ed8SAndrew Rybchenko 2285e111ed8SAndrew Rybchenko 2295e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST 2305e111ed8SAndrew Rybchenko #if EFX_OPTS_EF10() 2315e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2325e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2335e111ed8SAndrew Rybchenko efx_mcdi_bist_enable_offline( 2345e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 2355e111ed8SAndrew Rybchenko #endif /* EFX_OPTS_EF10() */ 2365e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2375e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2385e111ed8SAndrew Rybchenko efx_mcdi_bist_start( 2395e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2405e111ed8SAndrew Rybchenko __in efx_bist_type_t type); 2415e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_BIST */ 2425e111ed8SAndrew Rybchenko 2435e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2445e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2455e111ed8SAndrew Rybchenko efx_mcdi_get_resource_limits( 2465e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2475e111ed8SAndrew Rybchenko __out_opt uint32_t *nevqp, 2485e111ed8SAndrew Rybchenko __out_opt uint32_t *nrxqp, 2495e111ed8SAndrew Rybchenko __out_opt uint32_t *ntxqp); 2505e111ed8SAndrew Rybchenko 2515e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2525e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2535e111ed8SAndrew Rybchenko efx_mcdi_log_ctrl( 2545e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 2555e111ed8SAndrew Rybchenko 2565e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2575e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2585e111ed8SAndrew Rybchenko efx_mcdi_mac_stats_clear( 2595e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 2605e111ed8SAndrew Rybchenko 2615e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2625e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2635e111ed8SAndrew Rybchenko efx_mcdi_mac_stats_upload( 2645e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2655e111ed8SAndrew Rybchenko __in efsys_mem_t *esmp); 2665e111ed8SAndrew Rybchenko 2675e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2685e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2695e111ed8SAndrew Rybchenko efx_mcdi_mac_stats_periodic( 2705e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2715e111ed8SAndrew Rybchenko __in efsys_mem_t *esmp, 2725e111ed8SAndrew Rybchenko __in uint16_t period_ms, 2735e111ed8SAndrew Rybchenko __in boolean_t events); 2745e111ed8SAndrew Rybchenko 2755e111ed8SAndrew Rybchenko 2765e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK 2775e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2785e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2795e111ed8SAndrew Rybchenko efx_mcdi_get_loopback_modes( 2805e111ed8SAndrew Rybchenko __in efx_nic_t *enp); 2815e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */ 2825e111ed8SAndrew Rybchenko 2835e111ed8SAndrew Rybchenko LIBEFX_INTERNAL 2845e111ed8SAndrew Rybchenko extern __checkReturn efx_rc_t 2855e111ed8SAndrew Rybchenko efx_mcdi_phy_module_get_info( 2865e111ed8SAndrew Rybchenko __in efx_nic_t *enp, 2875e111ed8SAndrew Rybchenko __in uint8_t dev_addr, 2885e111ed8SAndrew Rybchenko __in size_t offset, 2895e111ed8SAndrew Rybchenko __in size_t len, 2905e111ed8SAndrew Rybchenko __out_bcount(len) uint8_t *data); 2915e111ed8SAndrew Rybchenko 29260fb370cSAndrew Rybchenko LIBEFX_INTERNAL 29360fb370cSAndrew Rybchenko extern __checkReturn efx_rc_t 29460fb370cSAndrew Rybchenko efx_mcdi_get_nic_addr_info( 29560fb370cSAndrew Rybchenko __in efx_nic_t *enp, 29660fb370cSAndrew Rybchenko __out uint32_t *mapping_typep); 29760fb370cSAndrew Rybchenko 29860fb370cSAndrew Rybchenko struct efx_nic_dma_region_info_s; 29960fb370cSAndrew Rybchenko 30060fb370cSAndrew Rybchenko LIBEFX_INTERNAL 30160fb370cSAndrew Rybchenko extern __checkReturn efx_rc_t 30260fb370cSAndrew Rybchenko efx_mcdi_get_nic_addr_regions( 30360fb370cSAndrew Rybchenko __in efx_nic_t *enp, 30460fb370cSAndrew Rybchenko __out struct efx_nic_dma_region_info_s *endrip); 30560fb370cSAndrew Rybchenko 30660fb370cSAndrew Rybchenko LIBEFX_INTERNAL 30760fb370cSAndrew Rybchenko extern __checkReturn efx_rc_t 30860fb370cSAndrew Rybchenko efx_mcdi_set_nic_addr_regions( 30960fb370cSAndrew Rybchenko __in efx_nic_t *enp, 31060fb370cSAndrew Rybchenko __in const struct efx_nic_dma_region_info_s *endrip); 31160fb370cSAndrew Rybchenko 3125e111ed8SAndrew Rybchenko #define MCDI_IN(_emr, _type, _ofst) \ 3135e111ed8SAndrew Rybchenko ((_type *)((_emr).emr_in_buf + (_ofst))) 3145e111ed8SAndrew Rybchenko 3155e111ed8SAndrew Rybchenko #define MCDI_IN2(_emr, _type, _ofst) \ 3165e111ed8SAndrew Rybchenko MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 3175e111ed8SAndrew Rybchenko 318e7ea5f30SIvan Malov #define MCDI_INDEXED_IN2(_emr, _type, _ofst, _idx) \ 319e7ea5f30SIvan Malov MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST + \ 320e7ea5f30SIvan Malov _idx * MC_CMD_ ## _ofst ## _LEN) 321e7ea5f30SIvan Malov 3225e111ed8SAndrew Rybchenko #define MCDI_IN_SET_BYTE(_emr, _ofst, _value) \ 3235e111ed8SAndrew Rybchenko EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst), \ 3245e111ed8SAndrew Rybchenko EFX_BYTE_0, _value) 3255e111ed8SAndrew Rybchenko 3265e111ed8SAndrew Rybchenko #define MCDI_IN_SET_WORD(_emr, _ofst, _value) \ 3275e111ed8SAndrew Rybchenko EFX_POPULATE_WORD_1(*MCDI_IN2(_emr, efx_word_t, _ofst), \ 3285e111ed8SAndrew Rybchenko EFX_WORD_0, _value) 3295e111ed8SAndrew Rybchenko 3305e111ed8SAndrew Rybchenko #define MCDI_IN_SET_DWORD(_emr, _ofst, _value) \ 3315e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 3325e111ed8SAndrew Rybchenko EFX_DWORD_0, _value) 3335e111ed8SAndrew Rybchenko 3345e111ed8SAndrew Rybchenko #define MCDI_IN_SET_DWORD_FIELD(_emr, _ofst, _field, _value) \ 3355e111ed8SAndrew Rybchenko EFX_SET_DWORD_FIELD(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 3365e111ed8SAndrew Rybchenko MC_CMD_ ## _field, _value) 3375e111ed8SAndrew Rybchenko 338bbc42f34SIgor Romanov #define MCDI_IN_SET_INDEXED_DWORD(_emr, _ofst, _idx, _value) \ 339bbc42f34SIgor Romanov EFX_POPULATE_DWORD_1(*(MCDI_IN2(_emr, efx_dword_t, _ofst) + \ 340bbc42f34SIgor Romanov (_idx)), EFX_DWORD_0, _value) \ 341bbc42f34SIgor Romanov 34260fb370cSAndrew Rybchenko #define MCDI_IN_SET_QWORD(_emr, _ofst, _value) \ 34360fb370cSAndrew Rybchenko EFX_POPULATE_QWORD_2(*MCDI_IN2(_emr, efx_qword_t, _ofst), \ 34460fb370cSAndrew Rybchenko EFX_DWORD_0, ((_value) & 0xffffffff), \ 34560fb370cSAndrew Rybchenko EFX_DWORD_1, ((_value) >> 32)) 34660fb370cSAndrew Rybchenko 34760fb370cSAndrew Rybchenko #define MCDI_IN_SET_INDEXED_QWORD(_emr, _ofst, _idx, _value) \ 34860fb370cSAndrew Rybchenko EFX_POPULATE_QWORD_2(*(MCDI_IN2(_emr, efx_qword_t, _ofst) + \ 34960fb370cSAndrew Rybchenko (_idx)), \ 35060fb370cSAndrew Rybchenko EFX_DWORD_0, ((_value) & 0xffffffff), \ 35160fb370cSAndrew Rybchenko EFX_DWORD_1, ((_value) >> 32)) 35260fb370cSAndrew Rybchenko 3535e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1) \ 3545e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 3555e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1) 3565e111ed8SAndrew Rybchenko 3575e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1, \ 3585e111ed8SAndrew Rybchenko _field2, _value2) \ 3595e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 3605e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 3615e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2) 3625e111ed8SAndrew Rybchenko 363e7ea5f30SIvan Malov #define MCDI_IN_POPULATE_INDEXED_DWORD_2(_emr, _ofst, _idx, \ 364e7ea5f30SIvan Malov _field1, _value1, _field2, _value2) \ 365e7ea5f30SIvan Malov EFX_POPULATE_DWORD_2( \ 366e7ea5f30SIvan Malov *MCDI_INDEXED_IN2(_emr, efx_dword_t, _ofst, _idx), \ 367e7ea5f30SIvan Malov MC_CMD_ ## _field1, _value1, \ 368e7ea5f30SIvan Malov MC_CMD_ ## _field2, _value2) 369e7ea5f30SIvan Malov 3705e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1, \ 3715e111ed8SAndrew Rybchenko _field2, _value2, _field3, _value3) \ 3725e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 3735e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 3745e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2, \ 3755e111ed8SAndrew Rybchenko MC_CMD_ ## _field3, _value3) 3765e111ed8SAndrew Rybchenko 3775e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1, \ 3785e111ed8SAndrew Rybchenko _field2, _value2, _field3, _value3, _field4, _value4) \ 3795e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 3805e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 3815e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2, \ 3825e111ed8SAndrew Rybchenko MC_CMD_ ## _field3, _value3, \ 3835e111ed8SAndrew Rybchenko MC_CMD_ ## _field4, _value4) 3845e111ed8SAndrew Rybchenko 3855e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1, \ 3865e111ed8SAndrew Rybchenko _field2, _value2, _field3, _value3, _field4, _value4, \ 3875e111ed8SAndrew Rybchenko _field5, _value5) \ 3885e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 3895e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 3905e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2, \ 3915e111ed8SAndrew Rybchenko MC_CMD_ ## _field3, _value3, \ 3925e111ed8SAndrew Rybchenko MC_CMD_ ## _field4, _value4, \ 3935e111ed8SAndrew Rybchenko MC_CMD_ ## _field5, _value5) 3945e111ed8SAndrew Rybchenko 3955e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1, \ 3965e111ed8SAndrew Rybchenko _field2, _value2, _field3, _value3, _field4, _value4, \ 3975e111ed8SAndrew Rybchenko _field5, _value5, _field6, _value6) \ 3985e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 3995e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 4005e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2, \ 4015e111ed8SAndrew Rybchenko MC_CMD_ ## _field3, _value3, \ 4025e111ed8SAndrew Rybchenko MC_CMD_ ## _field4, _value4, \ 4035e111ed8SAndrew Rybchenko MC_CMD_ ## _field5, _value5, \ 4045e111ed8SAndrew Rybchenko MC_CMD_ ## _field6, _value6) 4055e111ed8SAndrew Rybchenko 4065e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1, \ 4075e111ed8SAndrew Rybchenko _field2, _value2, _field3, _value3, _field4, _value4, \ 4085e111ed8SAndrew Rybchenko _field5, _value5, _field6, _value6, _field7, _value7) \ 4095e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_7(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 4105e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 4115e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2, \ 4125e111ed8SAndrew Rybchenko MC_CMD_ ## _field3, _value3, \ 4135e111ed8SAndrew Rybchenko MC_CMD_ ## _field4, _value4, \ 4145e111ed8SAndrew Rybchenko MC_CMD_ ## _field5, _value5, \ 4155e111ed8SAndrew Rybchenko MC_CMD_ ## _field6, _value6, \ 4165e111ed8SAndrew Rybchenko MC_CMD_ ## _field7, _value7) 4175e111ed8SAndrew Rybchenko 4185e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1, \ 4195e111ed8SAndrew Rybchenko _field2, _value2, _field3, _value3, _field4, _value4, \ 4205e111ed8SAndrew Rybchenko _field5, _value5, _field6, _value6, _field7, _value7, \ 4215e111ed8SAndrew Rybchenko _field8, _value8) \ 4225e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 4235e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 4245e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2, \ 4255e111ed8SAndrew Rybchenko MC_CMD_ ## _field3, _value3, \ 4265e111ed8SAndrew Rybchenko MC_CMD_ ## _field4, _value4, \ 4275e111ed8SAndrew Rybchenko MC_CMD_ ## _field5, _value5, \ 4285e111ed8SAndrew Rybchenko MC_CMD_ ## _field6, _value6, \ 4295e111ed8SAndrew Rybchenko MC_CMD_ ## _field7, _value7, \ 4305e111ed8SAndrew Rybchenko MC_CMD_ ## _field8, _value8) 4315e111ed8SAndrew Rybchenko 4325e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1, \ 4335e111ed8SAndrew Rybchenko _field2, _value2, _field3, _value3, _field4, _value4, \ 4345e111ed8SAndrew Rybchenko _field5, _value5, _field6, _value6, _field7, _value7, \ 4355e111ed8SAndrew Rybchenko _field8, _value8, _field9, _value9) \ 4365e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 4375e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 4385e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2, \ 4395e111ed8SAndrew Rybchenko MC_CMD_ ## _field3, _value3, \ 4405e111ed8SAndrew Rybchenko MC_CMD_ ## _field4, _value4, \ 4415e111ed8SAndrew Rybchenko MC_CMD_ ## _field5, _value5, \ 4425e111ed8SAndrew Rybchenko MC_CMD_ ## _field6, _value6, \ 4435e111ed8SAndrew Rybchenko MC_CMD_ ## _field7, _value7, \ 4445e111ed8SAndrew Rybchenko MC_CMD_ ## _field8, _value8, \ 4455e111ed8SAndrew Rybchenko MC_CMD_ ## _field9, _value9) 4465e111ed8SAndrew Rybchenko 4475e111ed8SAndrew Rybchenko #define MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1, \ 4485e111ed8SAndrew Rybchenko _field2, _value2, _field3, _value3, _field4, _value4, \ 4495e111ed8SAndrew Rybchenko _field5, _value5, _field6, _value6, _field7, _value7, \ 4505e111ed8SAndrew Rybchenko _field8, _value8, _field9, _value9, _field10, _value10) \ 4515e111ed8SAndrew Rybchenko EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 4525e111ed8SAndrew Rybchenko MC_CMD_ ## _field1, _value1, \ 4535e111ed8SAndrew Rybchenko MC_CMD_ ## _field2, _value2, \ 4545e111ed8SAndrew Rybchenko MC_CMD_ ## _field3, _value3, \ 4555e111ed8SAndrew Rybchenko MC_CMD_ ## _field4, _value4, \ 4565e111ed8SAndrew Rybchenko MC_CMD_ ## _field5, _value5, \ 4575e111ed8SAndrew Rybchenko MC_CMD_ ## _field6, _value6, \ 4585e111ed8SAndrew Rybchenko MC_CMD_ ## _field7, _value7, \ 4595e111ed8SAndrew Rybchenko MC_CMD_ ## _field8, _value8, \ 4605e111ed8SAndrew Rybchenko MC_CMD_ ## _field9, _value9, \ 4615e111ed8SAndrew Rybchenko MC_CMD_ ## _field10, _value10) 4625e111ed8SAndrew Rybchenko 463d874d2a1SIgor Romanov /* 464d874d2a1SIgor Romanov * Native setters (MCDI_IN_SET_*_NATIVE) are used when MCDI field is in 465d874d2a1SIgor Romanov * network order to avoid conversion to little-endian that is done in 466d874d2a1SIgor Romanov * other setters. 467d874d2a1SIgor Romanov */ 468d874d2a1SIgor Romanov #define MCDI_IN_SET_WORD_NATIVE(_emr, _ofst, _value) \ 469d874d2a1SIgor Romanov MCDI_IN2((_emr), efx_word_t, _ofst)->ew_u16[0] = (_value) 470d874d2a1SIgor Romanov 471d874d2a1SIgor Romanov #define MCDI_IN_SET_DWORD_NATIVE(_emr, _ofst, _value) \ 472d874d2a1SIgor Romanov MCDI_IN2((_emr), efx_dword_t, _ofst)->ed_u32[0] = (_value) 473d874d2a1SIgor Romanov 4745e111ed8SAndrew Rybchenko #define MCDI_OUT(_emr, _type, _ofst) \ 4755e111ed8SAndrew Rybchenko ((_type *)((_emr).emr_out_buf + (_ofst))) 4765e111ed8SAndrew Rybchenko 4775e111ed8SAndrew Rybchenko #define MCDI_OUT2(_emr, _type, _ofst) \ 4785e111ed8SAndrew Rybchenko MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 4795e111ed8SAndrew Rybchenko 4805e111ed8SAndrew Rybchenko #define MCDI_OUT_BYTE(_emr, _ofst) \ 4815e111ed8SAndrew Rybchenko EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst), \ 4825e111ed8SAndrew Rybchenko EFX_BYTE_0) 4835e111ed8SAndrew Rybchenko 4845e111ed8SAndrew Rybchenko #define MCDI_OUT_WORD(_emr, _ofst) \ 4855e111ed8SAndrew Rybchenko EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst), \ 4865e111ed8SAndrew Rybchenko EFX_WORD_0) 4875e111ed8SAndrew Rybchenko 4885e111ed8SAndrew Rybchenko #define MCDI_OUT_WORD_FIELD(_emr, _ofst, _field) \ 4895e111ed8SAndrew Rybchenko EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst), \ 4905e111ed8SAndrew Rybchenko MC_CMD_ ## _field) 4915e111ed8SAndrew Rybchenko 4925e111ed8SAndrew Rybchenko #define MCDI_OUT_DWORD(_emr, _ofst) \ 4935e111ed8SAndrew Rybchenko EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 4945e111ed8SAndrew Rybchenko EFX_DWORD_0) 4955e111ed8SAndrew Rybchenko 4965e111ed8SAndrew Rybchenko #define MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field) \ 4975e111ed8SAndrew Rybchenko EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 4985e111ed8SAndrew Rybchenko MC_CMD_ ## _field) 4995e111ed8SAndrew Rybchenko 500bbc42f34SIgor Romanov #define MCDI_OUT_INDEXED_DWORD(_emr, _ofst, _idx) \ 501bbc42f34SIgor Romanov MCDI_OUT_INDEXED_DWORD_FIELD(_emr, _ofst, _idx, EFX_DWORD_0) 502bbc42f34SIgor Romanov 50334285fd0SIvan Malov #define MCDI_OUT_INDEXED_DWORD_FIELD(_emr, _ofst, _idx, _field) \ 50434285fd0SIvan Malov EFX_DWORD_FIELD(*(MCDI_OUT2(_emr, efx_dword_t, _ofst) + \ 50534285fd0SIvan Malov (_idx)), _field) 50634285fd0SIvan Malov 507*2d68e24fSDenis Pryazhennikov #define MCDI_OUT_INDEXED_QWORD_FIELD(_emr, _ofst, _idx, _field) \ 508*2d68e24fSDenis Pryazhennikov EFX_QWORD_FIELD(*(MCDI_OUT2(_emr, efx_qword_t, _ofst) + \ 509*2d68e24fSDenis Pryazhennikov (_idx)), _field) 510*2d68e24fSDenis Pryazhennikov 51123748069SViacheslav Galaktionov #define MCDI_OUT_INDEXED_STRUCT_MEMBER(_emr, _type, _arr_ofst, _idx, \ 51223748069SViacheslav Galaktionov _member_ofst) \ 51323748069SViacheslav Galaktionov ((_type *)(MCDI_OUT2(_emr, uint8_t, _arr_ofst) + \ 51423748069SViacheslav Galaktionov _idx * MC_CMD_ ## _arr_ofst ## _LEN + \ 51523748069SViacheslav Galaktionov _member_ofst ## _OFST)) 51623748069SViacheslav Galaktionov 51723748069SViacheslav Galaktionov #define MCDI_OUT_INDEXED_MEMBER_DWORD(_emr, _arr_ofst, _idx, \ 51823748069SViacheslav Galaktionov _member_ofst) \ 51923748069SViacheslav Galaktionov EFX_DWORD_FIELD( \ 52023748069SViacheslav Galaktionov *(MCDI_OUT_INDEXED_STRUCT_MEMBER(_emr, efx_dword_t, \ 52123748069SViacheslav Galaktionov _arr_ofst, _idx, \ 52223748069SViacheslav Galaktionov _member_ofst)), \ 52323748069SViacheslav Galaktionov EFX_DWORD_0) 52423748069SViacheslav Galaktionov 52523748069SViacheslav Galaktionov #define MCDI_OUT_INDEXED_MEMBER_QWORD(_emr, _arr_ofst, _idx, \ 52623748069SViacheslav Galaktionov _member_ofst) \ 52723748069SViacheslav Galaktionov ((uint64_t)EFX_QWORD_FIELD( \ 52823748069SViacheslav Galaktionov *(MCDI_OUT_INDEXED_STRUCT_MEMBER(_emr, efx_qword_t, \ 52923748069SViacheslav Galaktionov _arr_ofst, _idx, \ 53023748069SViacheslav Galaktionov _member_ofst)), \ 53123748069SViacheslav Galaktionov EFX_DWORD_0) | \ 53223748069SViacheslav Galaktionov (uint64_t)EFX_QWORD_FIELD( \ 53323748069SViacheslav Galaktionov *(MCDI_OUT_INDEXED_STRUCT_MEMBER(_emr, efx_qword_t, \ 53423748069SViacheslav Galaktionov _arr_ofst, _idx, \ 53523748069SViacheslav Galaktionov _member_ofst)), \ 53623748069SViacheslav Galaktionov EFX_DWORD_1) << 32) 53723748069SViacheslav Galaktionov 53823748069SViacheslav Galaktionov #define MCDI_STRUCT_MEMBER(_buf, _type, _ofst) \ 53923748069SViacheslav Galaktionov ((_type *)((char *)_buf + _ofst ## _OFST)) \ 54023748069SViacheslav Galaktionov 54123748069SViacheslav Galaktionov #define MCDI_STRUCT_BYTE(_buf, _ofst) \ 54223748069SViacheslav Galaktionov EFX_BYTE_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_byte_t, _ofst), \ 54323748069SViacheslav Galaktionov EFX_BYTE_0) 54423748069SViacheslav Galaktionov 54523748069SViacheslav Galaktionov #define MCDI_STRUCT_BYTE_FIELD(_buf, _ofst, _field) \ 54623748069SViacheslav Galaktionov EFX_BYTE_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_byte_t, _ofst), \ 54723748069SViacheslav Galaktionov _field) 54823748069SViacheslav Galaktionov 54923748069SViacheslav Galaktionov #define MCDI_STRUCT_WORD(_buf, _ofst) \ 55023748069SViacheslav Galaktionov EFX_WORD_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_word_t, _ofst), \ 55123748069SViacheslav Galaktionov EFX_WORD_0) 55223748069SViacheslav Galaktionov 55323748069SViacheslav Galaktionov #define MCDI_STRUCT_WORD_FIELD(_buf, _ofst, _field) \ 55423748069SViacheslav Galaktionov EFX_WORD_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_word_t, _ofst), \ 55523748069SViacheslav Galaktionov _field) 55623748069SViacheslav Galaktionov 55723748069SViacheslav Galaktionov #define MCDI_STRUCT_DWORD(_buf, _ofst) \ 55823748069SViacheslav Galaktionov EFX_DWORD_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_dword_t, _ofst), \ 55923748069SViacheslav Galaktionov EFX_DWORD_0) 56023748069SViacheslav Galaktionov 56123748069SViacheslav Galaktionov #define MCDI_STRUCT_DWORD_FIELD(_buf, _ofst, _field) \ 56223748069SViacheslav Galaktionov EFX_DWORD_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_dword_t, _ofst), \ 56323748069SViacheslav Galaktionov _field) 56423748069SViacheslav Galaktionov 5655e111ed8SAndrew Rybchenko #define MCDI_EV_FIELD(_eqp, _field) \ 5665e111ed8SAndrew Rybchenko EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field) 5675e111ed8SAndrew Rybchenko 5685e111ed8SAndrew Rybchenko #define MCDI_CMD_DWORD_FIELD(_edp, _field) \ 5695e111ed8SAndrew Rybchenko EFX_DWORD_FIELD(*_edp, MC_CMD_ ## _field) 5705e111ed8SAndrew Rybchenko 5715e111ed8SAndrew Rybchenko #define EFX_MCDI_HAVE_PRIVILEGE(mask, priv) \ 5725e111ed8SAndrew Rybchenko (((mask) & (MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv)) == \ 5735e111ed8SAndrew Rybchenko (MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv)) 5745e111ed8SAndrew Rybchenko 5755e111ed8SAndrew Rybchenko #define EFX_MCDI_BUF_SIZE(_in_len, _out_len) \ 5765e111ed8SAndrew Rybchenko EFX_P2ROUNDUP(size_t, \ 5775e111ed8SAndrew Rybchenko MAX(MAX(_in_len, _out_len), (2 * sizeof (efx_dword_t))),\ 5785e111ed8SAndrew Rybchenko sizeof (efx_dword_t)) 5795e111ed8SAndrew Rybchenko 5805e111ed8SAndrew Rybchenko /* 5815e111ed8SAndrew Rybchenko * The buffer size must be a multiple of dword to ensure that MCDI works 5825e111ed8SAndrew Rybchenko * properly with Siena based boards (which use on-chip buffer). Also, it 5835e111ed8SAndrew Rybchenko * should be at minimum the size of two dwords to allow space for extended 5845e111ed8SAndrew Rybchenko * error responses if the request/response buffer sizes are smaller. 5855e111ed8SAndrew Rybchenko */ 5865e111ed8SAndrew Rybchenko #define EFX_MCDI_DECLARE_BUF(_name, _in_len, _out_len) \ 5875e111ed8SAndrew Rybchenko uint8_t _name[EFX_MCDI_BUF_SIZE(_in_len, _out_len)] = {0} 5885e111ed8SAndrew Rybchenko 5895e111ed8SAndrew Rybchenko typedef enum efx_mcdi_feature_id_e { 5905e111ed8SAndrew Rybchenko EFX_MCDI_FEATURE_FW_UPDATE = 0, 5915e111ed8SAndrew Rybchenko EFX_MCDI_FEATURE_LINK_CONTROL, 5925e111ed8SAndrew Rybchenko EFX_MCDI_FEATURE_MACADDR_CHANGE, 5935e111ed8SAndrew Rybchenko EFX_MCDI_FEATURE_MAC_SPOOFING, 5945e111ed8SAndrew Rybchenko EFX_MCDI_FEATURE_NIDS 5955e111ed8SAndrew Rybchenko } efx_mcdi_feature_id_t; 5965e111ed8SAndrew Rybchenko 5975e111ed8SAndrew Rybchenko #ifdef __cplusplus 5985e111ed8SAndrew Rybchenko } 5995e111ed8SAndrew Rybchenko #endif 6005e111ed8SAndrew Rybchenko 6015e111ed8SAndrew Rybchenko #endif /* _SYS_EFX_MCDI_H */ 602