efx_mcdi.h revision 292051
1227569Sphilip/*- 2283514Sarybchik * Copyright (c) 2009-2015 Solarflare Communications Inc. 3283514Sarybchik * All rights reserved. 4227569Sphilip * 5227569Sphilip * Redistribution and use in source and binary forms, with or without 6283514Sarybchik * modification, are permitted provided that the following conditions are met: 7227569Sphilip * 8283514Sarybchik * 1. Redistributions of source code must retain the above copyright notice, 9283514Sarybchik * this list of conditions and the following disclaimer. 10283514Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice, 11283514Sarybchik * this list of conditions and the following disclaimer in the documentation 12283514Sarybchik * and/or other materials provided with the distribution. 13228078Sphilip * 14283514Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15283514Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 16283514Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17283514Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 18283514Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19283514Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20283514Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21283514Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22283514Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23283514Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 24283514Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25283514Sarybchik * 26283514Sarybchik * The views and conclusions contained in the software and documentation are 27283514Sarybchik * those of the authors and should not be interpreted as representing official 28283514Sarybchik * policies, either expressed or implied, of the FreeBSD Project. 29283514Sarybchik * 30228078Sphilip * $FreeBSD: head/sys/dev/sfxge/common/efx_mcdi.h 292051 2015-12-10 07:16:21Z arybchik $ 31227569Sphilip */ 32227569Sphilip 33227569Sphilip#ifndef _SYS_EFX_MCDI_H 34227569Sphilip#define _SYS_EFX_MCDI_H 35227569Sphilip 36227569Sphilip#include "efx.h" 37227569Sphilip#include "efx_regs.h" 38227569Sphilip#include "efx_regs_mcdi.h" 39227569Sphilip 40227569Sphilip#ifdef __cplusplus 41227569Sphilipextern "C" { 42227569Sphilip#endif 43227569Sphilip 44283514Sarybchik/* 45283514Sarybchik * A reboot/assertion causes the MCDI status word to be set after the 46283514Sarybchik * command word is set or a REBOOT event is sent. If we notice a reboot 47283514Sarybchik * via these mechanisms then wait 10ms for the status word to be set. 48283514Sarybchik */ 49283514Sarybchik#define EFX_MCDI_STATUS_SLEEP_US 10000 50227569Sphilip 51227569Sphilipstruct efx_mcdi_req_s { 52283514Sarybchik boolean_t emr_quiet; 53227569Sphilip /* Inputs: Command #, input buffer and length */ 54227569Sphilip unsigned int emr_cmd; 55227569Sphilip uint8_t *emr_in_buf; 56227569Sphilip size_t emr_in_length; 57227569Sphilip /* Outputs: retcode, buffer, length, and length used*/ 58227569Sphilip int emr_rc; 59227569Sphilip uint8_t *emr_out_buf; 60227569Sphilip size_t emr_out_length; 61227569Sphilip size_t emr_out_length_used; 62292007Sarybchik /* Internals: low level transport details */ 63292007Sarybchik unsigned int emr_err_code; 64292007Sarybchik unsigned int emr_err_arg; 65292051Sarybchik#if EFSYS_OPT_MCDI_PROXY_AUTH 66292051Sarybchik uint32_t emr_proxy_handle; 67292051Sarybchik#endif 68227569Sphilip}; 69227569Sphilip 70227569Sphiliptypedef struct efx_mcdi_iface_s { 71227569Sphilip unsigned int emi_port; 72227569Sphilip unsigned int emi_seq; 73227569Sphilip efx_mcdi_req_t *emi_pending_req; 74227569Sphilip boolean_t emi_ev_cpl; 75283514Sarybchik boolean_t emi_new_epoch; 76227569Sphilip int emi_aborted; 77227569Sphilip uint32_t emi_poll_cnt; 78283514Sarybchik uint32_t emi_mc_reboot_status; 79227569Sphilip} efx_mcdi_iface_t; 80227569Sphilip 81227569Sphilipextern void 82227569Sphilipefx_mcdi_execute( 83227569Sphilip __in efx_nic_t *enp, 84283514Sarybchik __inout efx_mcdi_req_t *emrp); 85227569Sphilip 86227569Sphilipextern void 87283514Sarybchikefx_mcdi_execute_quiet( 88283514Sarybchik __in efx_nic_t *enp, 89283514Sarybchik __inout efx_mcdi_req_t *emrp); 90283514Sarybchik 91292007Sarybchik extern void 92292007Sarybchikefx_mcdi_read_response_header( 93292007Sarybchik __in efx_nic_t *enp, 94292007Sarybchik __inout efx_mcdi_req_t *emrp); 95292007Sarybchik 96283514Sarybchikextern void 97227569Sphilipefx_mcdi_ev_cpl( 98227569Sphilip __in efx_nic_t *enp, 99227569Sphilip __in unsigned int seq, 100227569Sphilip __in unsigned int outlen, 101227569Sphilip __in int errcode); 102227569Sphilip 103292051Sarybchik#if EFSYS_OPT_MCDI_PROXY_AUTH 104292051Sarybchik __checkReturn efx_rc_t 105292051Sarybchikefx_mcdi_get_proxy_handle( 106292051Sarybchik __in efx_nic_t *enp, 107292051Sarybchik __in efx_mcdi_req_t *emrp, 108292051Sarybchik __out uint32_t *handlep); 109292051Sarybchik 110227569Sphilipextern void 111292051Sarybchikefx_mcdi_ev_proxy_response( 112292051Sarybchik __in efx_nic_t *enp, 113292051Sarybchik __in unsigned int handle, 114292051Sarybchik __in unsigned int status); 115292051Sarybchik#endif 116292051Sarybchik 117292051Sarybchikextern void 118227569Sphilipefx_mcdi_ev_death( 119227569Sphilip __in efx_nic_t *enp, 120227569Sphilip __in int rc); 121227569Sphilip 122291436Sarybchikextern __checkReturn efx_rc_t 123283514Sarybchikefx_mcdi_request_errcode( 124283514Sarybchik __in unsigned int err); 125283514Sarybchik 126283514Sarybchikextern void 127283514Sarybchikefx_mcdi_raise_exception( 128283514Sarybchik __in efx_nic_t *enp, 129283514Sarybchik __in_opt efx_mcdi_req_t *emrp, 130283514Sarybchik __in int rc); 131283514Sarybchik 132227569Sphiliptypedef enum efx_mcdi_boot_e { 133227569Sphilip EFX_MCDI_BOOT_PRIMARY, 134227569Sphilip EFX_MCDI_BOOT_SECONDARY, 135227569Sphilip EFX_MCDI_BOOT_ROM, 136227569Sphilip} efx_mcdi_boot_t; 137227569Sphilip 138291436Sarybchikextern __checkReturn efx_rc_t 139227569Sphilipefx_mcdi_version( 140227569Sphilip __in efx_nic_t *enp, 141227569Sphilip __out_ecount_opt(4) uint16_t versionp[4], 142227569Sphilip __out_opt uint32_t *buildp, 143227569Sphilip __out_opt efx_mcdi_boot_t *statusp); 144227569Sphilip 145291436Sarybchikextern __checkReturn efx_rc_t 146283514Sarybchikefx_mcdi_read_assertion( 147283514Sarybchik __in efx_nic_t *enp); 148283514Sarybchik 149291436Sarybchikextern __checkReturn efx_rc_t 150283514Sarybchikefx_mcdi_exit_assertion_handler( 151283514Sarybchik __in efx_nic_t *enp); 152283514Sarybchik 153291436Sarybchikextern __checkReturn efx_rc_t 154283514Sarybchikefx_mcdi_drv_attach( 155283514Sarybchik __in efx_nic_t *enp, 156283514Sarybchik __in boolean_t attach); 157283514Sarybchik 158291436Sarybchikextern __checkReturn efx_rc_t 159283514Sarybchikefx_mcdi_get_board_cfg( 160283514Sarybchik __in efx_nic_t *enp, 161283514Sarybchik __out_opt uint32_t *board_typep, 162283514Sarybchik __out_opt efx_dword_t *capabilitiesp, 163283514Sarybchik __out_ecount_opt(6) uint8_t mac_addrp[6]); 164283514Sarybchik 165291436Sarybchikextern __checkReturn efx_rc_t 166283514Sarybchikefx_mcdi_get_phy_cfg( 167283514Sarybchik __in efx_nic_t *enp); 168283514Sarybchik 169291436Sarybchikextern __checkReturn efx_rc_t 170283514Sarybchikefx_mcdi_firmware_update_supported( 171283514Sarybchik __in efx_nic_t *enp, 172283514Sarybchik __out boolean_t *supportedp); 173283514Sarybchik 174291436Sarybchikextern __checkReturn efx_rc_t 175283514Sarybchikefx_mcdi_macaddr_change_supported( 176283514Sarybchik __in efx_nic_t *enp, 177283514Sarybchik __out boolean_t *supportedp); 178283514Sarybchik 179291588Sarybchikextern __checkReturn efx_rc_t 180291588Sarybchikefx_mcdi_link_control_supported( 181291588Sarybchik __in efx_nic_t *enp, 182291588Sarybchik __out boolean_t *supportedp); 183291588Sarybchik 184292008Sarybchikextern __checkReturn efx_rc_t 185292008Sarybchikefx_mcdi_mac_spoofing_supported( 186292008Sarybchik __in efx_nic_t *enp, 187292008Sarybchik __out boolean_t *supportedp); 188292008Sarybchik 189292008Sarybchik 190283514Sarybchik#if EFSYS_OPT_BIST 191283514Sarybchik#if EFSYS_OPT_HUNTINGTON 192291436Sarybchikextern __checkReturn efx_rc_t 193283514Sarybchikefx_mcdi_bist_enable_offline( 194283514Sarybchik __in efx_nic_t *enp); 195283514Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 196291436Sarybchikextern __checkReturn efx_rc_t 197283514Sarybchikefx_mcdi_bist_start( 198283514Sarybchik __in efx_nic_t *enp, 199283514Sarybchik __in efx_bist_type_t type); 200283514Sarybchik#endif /* EFSYS_OPT_BIST */ 201283514Sarybchik 202291436Sarybchikextern __checkReturn efx_rc_t 203283514Sarybchikefx_mcdi_get_resource_limits( 204283514Sarybchik __in efx_nic_t *enp, 205283514Sarybchik __out_opt uint32_t *nevqp, 206283514Sarybchik __out_opt uint32_t *nrxqp, 207283514Sarybchik __out_opt uint32_t *ntxqp); 208283514Sarybchik 209291436Sarybchikextern __checkReturn efx_rc_t 210283514Sarybchikefx_mcdi_log_ctrl( 211283514Sarybchik __in efx_nic_t *enp); 212283514Sarybchik 213291436Sarybchikextern __checkReturn efx_rc_t 214283514Sarybchikefx_mcdi_mac_stats_clear( 215283514Sarybchik __in efx_nic_t *enp); 216283514Sarybchik 217291436Sarybchikextern __checkReturn efx_rc_t 218283514Sarybchikefx_mcdi_mac_stats_upload( 219283514Sarybchik __in efx_nic_t *enp, 220283514Sarybchik __in efsys_mem_t *esmp); 221283514Sarybchik 222291436Sarybchikextern __checkReturn efx_rc_t 223283514Sarybchikefx_mcdi_mac_stats_periodic( 224283514Sarybchik __in efx_nic_t *enp, 225283514Sarybchik __in efsys_mem_t *esmp, 226283514Sarybchik __in uint16_t period, 227283514Sarybchik __in boolean_t events); 228283514Sarybchik 229283514Sarybchik 230283514Sarybchik#if EFSYS_OPT_LOOPBACK 231291436Sarybchikextern __checkReturn efx_rc_t 232283514Sarybchikefx_mcdi_get_loopback_modes( 233283514Sarybchik __in efx_nic_t *enp); 234283514Sarybchik#endif /* EFSYS_OPT_LOOPBACK */ 235283514Sarybchik 236227569Sphilip#define MCDI_IN(_emr, _type, _ofst) \ 237227569Sphilip ((_type *)((_emr).emr_in_buf + (_ofst))) 238227569Sphilip 239227569Sphilip#define MCDI_IN2(_emr, _type, _ofst) \ 240227569Sphilip MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 241227569Sphilip 242227569Sphilip#define MCDI_IN_SET_BYTE(_emr, _ofst, _value) \ 243227569Sphilip EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst), \ 244227569Sphilip EFX_BYTE_0, _value) 245227569Sphilip 246283514Sarybchik#define MCDI_IN_SET_WORD(_emr, _ofst, _value) \ 247283514Sarybchik EFX_POPULATE_WORD_1(*MCDI_IN2(_emr, efx_word_t, _ofst), \ 248283514Sarybchik EFX_WORD_0, _value) 249283514Sarybchik 250227569Sphilip#define MCDI_IN_SET_DWORD(_emr, _ofst, _value) \ 251227569Sphilip EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 252227569Sphilip EFX_DWORD_0, _value) 253227569Sphilip 254283514Sarybchik#define MCDI_IN_SET_DWORD_FIELD(_emr, _ofst, _field, _value) \ 255283514Sarybchik EFX_SET_DWORD_FIELD(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 256283514Sarybchik MC_CMD_ ## _field, _value) 257283514Sarybchik 258227569Sphilip#define MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1) \ 259227569Sphilip EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 260227569Sphilip MC_CMD_ ## _field1, _value1) 261227569Sphilip 262227569Sphilip#define MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1, \ 263227569Sphilip _field2, _value2) \ 264227569Sphilip EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 265227569Sphilip MC_CMD_ ## _field1, _value1, \ 266227569Sphilip MC_CMD_ ## _field2, _value2) 267227569Sphilip 268227569Sphilip#define MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1, \ 269227569Sphilip _field2, _value2, _field3, _value3) \ 270227569Sphilip EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 271227569Sphilip MC_CMD_ ## _field1, _value1, \ 272227569Sphilip MC_CMD_ ## _field2, _value2, \ 273227569Sphilip MC_CMD_ ## _field3, _value3) 274227569Sphilip 275227569Sphilip#define MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1, \ 276227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4) \ 277227569Sphilip EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 278227569Sphilip MC_CMD_ ## _field1, _value1, \ 279227569Sphilip MC_CMD_ ## _field2, _value2, \ 280227569Sphilip MC_CMD_ ## _field3, _value3, \ 281227569Sphilip MC_CMD_ ## _field4, _value4) 282227569Sphilip 283227569Sphilip#define MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1, \ 284227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 285227569Sphilip _field5, _value5) \ 286227569Sphilip EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 287227569Sphilip MC_CMD_ ## _field1, _value1, \ 288227569Sphilip MC_CMD_ ## _field2, _value2, \ 289227569Sphilip MC_CMD_ ## _field3, _value3, \ 290227569Sphilip MC_CMD_ ## _field4, _value4, \ 291227569Sphilip MC_CMD_ ## _field5, _value5) 292227569Sphilip 293227569Sphilip#define MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1, \ 294227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 295227569Sphilip _field5, _value5, _field6, _value6) \ 296227569Sphilip EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 297227569Sphilip MC_CMD_ ## _field1, _value1, \ 298227569Sphilip MC_CMD_ ## _field2, _value2, \ 299227569Sphilip MC_CMD_ ## _field3, _value3, \ 300227569Sphilip MC_CMD_ ## _field4, _value4, \ 301227569Sphilip MC_CMD_ ## _field5, _value5, \ 302227569Sphilip MC_CMD_ ## _field6, _value6) 303227569Sphilip 304227569Sphilip#define MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1, \ 305227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 306227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7) \ 307283514Sarybchik EFX_POPULATE_DWORD_7(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 308227569Sphilip MC_CMD_ ## _field1, _value1, \ 309227569Sphilip MC_CMD_ ## _field2, _value2, \ 310227569Sphilip MC_CMD_ ## _field3, _value3, \ 311227569Sphilip MC_CMD_ ## _field4, _value4, \ 312227569Sphilip MC_CMD_ ## _field5, _value5, \ 313227569Sphilip MC_CMD_ ## _field6, _value6, \ 314227569Sphilip MC_CMD_ ## _field7, _value7) 315227569Sphilip 316227569Sphilip#define MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1, \ 317227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 318227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 319227569Sphilip _field8, _value8) \ 320227569Sphilip EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 321227569Sphilip MC_CMD_ ## _field1, _value1, \ 322227569Sphilip MC_CMD_ ## _field2, _value2, \ 323227569Sphilip MC_CMD_ ## _field3, _value3, \ 324227569Sphilip MC_CMD_ ## _field4, _value4, \ 325227569Sphilip MC_CMD_ ## _field5, _value5, \ 326227569Sphilip MC_CMD_ ## _field6, _value6, \ 327227569Sphilip MC_CMD_ ## _field7, _value7, \ 328227569Sphilip MC_CMD_ ## _field8, _value8) 329227569Sphilip 330227569Sphilip#define MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1, \ 331227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 332227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 333227569Sphilip _field8, _value8, _field9, _value9) \ 334227569Sphilip EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 335227569Sphilip MC_CMD_ ## _field1, _value1, \ 336227569Sphilip MC_CMD_ ## _field2, _value2, \ 337227569Sphilip MC_CMD_ ## _field3, _value3, \ 338227569Sphilip MC_CMD_ ## _field4, _value4, \ 339227569Sphilip MC_CMD_ ## _field5, _value5, \ 340227569Sphilip MC_CMD_ ## _field6, _value6, \ 341227569Sphilip MC_CMD_ ## _field7, _value7, \ 342227569Sphilip MC_CMD_ ## _field8, _value8, \ 343227569Sphilip MC_CMD_ ## _field9, _value9) 344227569Sphilip 345227569Sphilip#define MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1, \ 346227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 347227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 348227569Sphilip _field8, _value8, _field9, _value9, _field10, _value10) \ 349227569Sphilip EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 350227569Sphilip MC_CMD_ ## _field1, _value1, \ 351227569Sphilip MC_CMD_ ## _field2, _value2, \ 352227569Sphilip MC_CMD_ ## _field3, _value3, \ 353227569Sphilip MC_CMD_ ## _field4, _value4, \ 354227569Sphilip MC_CMD_ ## _field5, _value5, \ 355227569Sphilip MC_CMD_ ## _field6, _value6, \ 356227569Sphilip MC_CMD_ ## _field7, _value7, \ 357227569Sphilip MC_CMD_ ## _field8, _value8, \ 358227569Sphilip MC_CMD_ ## _field9, _value9, \ 359227569Sphilip MC_CMD_ ## _field10, _value10) 360227569Sphilip 361227569Sphilip#define MCDI_OUT(_emr, _type, _ofst) \ 362227569Sphilip ((_type *)((_emr).emr_out_buf + (_ofst))) 363227569Sphilip 364227569Sphilip#define MCDI_OUT2(_emr, _type, _ofst) \ 365227569Sphilip MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 366227569Sphilip 367227569Sphilip#define MCDI_OUT_BYTE(_emr, _ofst) \ 368227569Sphilip EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst), \ 369227569Sphilip EFX_BYTE_0) 370227569Sphilip 371227569Sphilip#define MCDI_OUT_WORD(_emr, _ofst) \ 372227569Sphilip EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst), \ 373227569Sphilip EFX_WORD_0) 374227569Sphilip 375227569Sphilip#define MCDI_OUT_DWORD(_emr, _ofst) \ 376227569Sphilip EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 377227569Sphilip EFX_DWORD_0) 378227569Sphilip 379227569Sphilip#define MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field) \ 380227569Sphilip EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 381227569Sphilip MC_CMD_ ## _field) 382227569Sphilip 383227569Sphilip#define MCDI_EV_FIELD(_eqp, _field) \ 384278942Sarybchik EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field) 385227569Sphilip 386283514Sarybchik#define MCDI_CMD_DWORD_FIELD(_edp, _field) \ 387279048Sarybchik EFX_DWORD_FIELD(*_edp, MC_CMD_ ## _field) 388279048Sarybchik 389227569Sphilip#ifdef __cplusplus 390227569Sphilip} 391227569Sphilip#endif 392227569Sphilip 393227569Sphilip#endif /* _SYS_EFX_MCDI_H */ 394