ef10_mac.c revision 283514
1283514Sarybchik/*- 2283514Sarybchik * Copyright (c) 2012-2015 Solarflare Communications Inc. 3283514Sarybchik * All rights reserved. 4283514Sarybchik * 5283514Sarybchik * Redistribution and use in source and binary forms, with or without 6283514Sarybchik * modification, are permitted provided that the following conditions are met: 7283514Sarybchik * 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. 13283514Sarybchik * 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 */ 30283514Sarybchik 31283514Sarybchik#include <sys/cdefs.h> 32283514Sarybchik__FBSDID("$FreeBSD: head/sys/dev/sfxge/common/hunt_mac.c 283514 2015-05-25 08:34:55Z arybchik $"); 33283514Sarybchik 34283514Sarybchik#include "efsys.h" 35283514Sarybchik#include "efx.h" 36283514Sarybchik#include "efx_impl.h" 37283514Sarybchik 38283514Sarybchik 39283514Sarybchik#if EFSYS_OPT_HUNTINGTON 40283514Sarybchik 41283514Sarybchik __checkReturn int 42283514Sarybchikhunt_mac_poll( 43283514Sarybchik __in efx_nic_t *enp, 44283514Sarybchik __out efx_link_mode_t *link_modep) 45283514Sarybchik{ 46283514Sarybchik /* 47283514Sarybchik * TBD: Consider a common Siena/Huntington function. The code is 48283514Sarybchik * essentially identical. 49283514Sarybchik */ 50283514Sarybchik 51283514Sarybchik efx_port_t *epp = &(enp->en_port); 52283514Sarybchik hunt_link_state_t hls; 53283514Sarybchik int rc; 54283514Sarybchik 55283514Sarybchik if ((rc = hunt_phy_get_link(enp, &hls)) != 0) 56283514Sarybchik goto fail1; 57283514Sarybchik 58283514Sarybchik epp->ep_adv_cap_mask = hls.hls_adv_cap_mask; 59283514Sarybchik epp->ep_fcntl = hls.hls_fcntl; 60283514Sarybchik 61283514Sarybchik *link_modep = hls.hls_link_mode; 62283514Sarybchik 63283514Sarybchik return (0); 64283514Sarybchik 65283514Sarybchikfail1: 66283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 67283514Sarybchik 68283514Sarybchik *link_modep = EFX_LINK_UNKNOWN; 69283514Sarybchik 70283514Sarybchik return (rc); 71283514Sarybchik} 72283514Sarybchik 73283514Sarybchik __checkReturn int 74283514Sarybchikhunt_mac_up( 75283514Sarybchik __in efx_nic_t *enp, 76283514Sarybchik __out boolean_t *mac_upp) 77283514Sarybchik{ 78283514Sarybchik /* 79283514Sarybchik * TBD: Consider a common Siena/Huntington function. The code is 80283514Sarybchik * essentially identical. 81283514Sarybchik */ 82283514Sarybchik 83283514Sarybchik hunt_link_state_t hls; 84283514Sarybchik int rc; 85283514Sarybchik 86283514Sarybchik /* 87283514Sarybchik * Because Huntington doesn't *require* polling, we can't rely on 88283514Sarybchik * hunt_mac_poll() being executed to populate epp->ep_mac_up. 89283514Sarybchik */ 90283514Sarybchik if ((rc = hunt_phy_get_link(enp, &hls)) != 0) 91283514Sarybchik goto fail1; 92283514Sarybchik 93283514Sarybchik *mac_upp = hls.hls_mac_up; 94283514Sarybchik 95283514Sarybchik return (0); 96283514Sarybchik 97283514Sarybchikfail1: 98283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 99283514Sarybchik 100283514Sarybchik return (rc); 101283514Sarybchik} 102283514Sarybchik 103283514Sarybchik/* 104283514Sarybchik * Huntington uses MC_CMD_VADAPTOR_SET_MAC to set the 105283514Sarybchik * MAC address; the address field in MC_CMD_SET_MAC has no 106283514Sarybchik * effect. 107283514Sarybchik * MC_CMD_VADAPTOR_SET_MAC requires mac-spoofing privilege and 108283514Sarybchik * the port to have no filters or queues active. 109283514Sarybchik */ 110283514Sarybchikstatic __checkReturn int 111283514Sarybchikefx_mcdi_vadapter_set_mac( 112283514Sarybchik __in efx_nic_t *enp) 113283514Sarybchik{ 114283514Sarybchik efx_port_t *epp = &(enp->en_port); 115283514Sarybchik efx_mcdi_req_t req; 116283514Sarybchik uint8_t payload[MAX(MC_CMD_VADAPTOR_SET_MAC_IN_LEN, 117283514Sarybchik MC_CMD_VADAPTOR_SET_MAC_OUT_LEN)]; 118283514Sarybchik int rc; 119283514Sarybchik 120283514Sarybchik (void) memset(payload, 0, sizeof (payload)); 121283514Sarybchik req.emr_cmd = MC_CMD_VADAPTOR_SET_MAC; 122283514Sarybchik req.emr_in_buf = payload; 123283514Sarybchik req.emr_in_length = MC_CMD_VADAPTOR_SET_MAC_IN_LEN; 124283514Sarybchik req.emr_out_buf = payload; 125283514Sarybchik req.emr_out_length = MC_CMD_VADAPTOR_SET_MAC_OUT_LEN; 126283514Sarybchik 127283514Sarybchik MCDI_IN_SET_DWORD(req, VADAPTOR_SET_MAC_IN_UPSTREAM_PORT_ID, 128283514Sarybchik enp->en_vport_id); 129283514Sarybchik EFX_MAC_ADDR_COPY(MCDI_IN2(req, uint8_t, VADAPTOR_SET_MAC_IN_MACADDR), 130283514Sarybchik epp->ep_mac_addr); 131283514Sarybchik 132283514Sarybchik efx_mcdi_execute(enp, &req); 133283514Sarybchik 134283514Sarybchik if (req.emr_rc != 0) { 135283514Sarybchik rc = req.emr_rc; 136283514Sarybchik goto fail1; 137283514Sarybchik } 138283514Sarybchik 139283514Sarybchik return (0); 140283514Sarybchik 141283514Sarybchikfail1: 142283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 143283514Sarybchik 144283514Sarybchik return (rc); 145283514Sarybchik} 146283514Sarybchik 147283514Sarybchik __checkReturn int 148283514Sarybchikhunt_mac_addr_set( 149283514Sarybchik __in efx_nic_t *enp) 150283514Sarybchik{ 151283514Sarybchik int rc; 152283514Sarybchik 153283514Sarybchik if ((rc = efx_mcdi_vadapter_set_mac(enp)) != 0) 154283514Sarybchik goto fail1; 155283514Sarybchik 156283514Sarybchikfail1: 157283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 158283514Sarybchik 159283514Sarybchik return (rc); 160283514Sarybchik} 161283514Sarybchik 162283514Sarybchik__checkReturn int 163283514Sarybchikhunt_mac_reconfigure( 164283514Sarybchik __in efx_nic_t *enp) 165283514Sarybchik{ 166283514Sarybchik efx_port_t *epp = &(enp->en_port); 167283514Sarybchik efx_mcdi_req_t req; 168283514Sarybchik uint8_t payload[MAX(MC_CMD_SET_MAC_IN_LEN, 169283514Sarybchik MC_CMD_SET_MAC_OUT_LEN)]; 170283514Sarybchik int rc; 171283514Sarybchik 172283514Sarybchik (void) memset(payload, 0, sizeof (payload)); 173283514Sarybchik req.emr_cmd = MC_CMD_SET_MAC; 174283514Sarybchik req.emr_in_buf = payload; 175283514Sarybchik req.emr_in_length = MC_CMD_SET_MAC_IN_LEN; 176283514Sarybchik req.emr_out_buf = payload; 177283514Sarybchik req.emr_out_length = MC_CMD_SET_MAC_OUT_LEN; 178283514Sarybchik 179283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_MTU, epp->ep_mac_pdu); 180283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_DRAIN, epp->ep_mac_drain ? 1 : 0); 181283514Sarybchik EFX_MAC_ADDR_COPY(MCDI_IN2(req, uint8_t, SET_MAC_IN_ADDR), 182283514Sarybchik epp->ep_mac_addr); 183283514Sarybchik 184283514Sarybchik /* 185283514Sarybchik * Note: The Huntington MAC does not support REJECT_BRDCST. 186283514Sarybchik * The REJECT_UNCST flag will also prevent multicast traffic 187283514Sarybchik * from reaching the filters. As Huntington filters drop any 188283514Sarybchik * traffic that does not match a filter it is ok to leave the 189283514Sarybchik * MAC running in promiscuous mode. See bug41141. 190283514Sarybchik */ 191283514Sarybchik MCDI_IN_POPULATE_DWORD_2(req, SET_MAC_IN_REJECT, 192283514Sarybchik SET_MAC_IN_REJECT_UNCST, 0, 193283514Sarybchik SET_MAC_IN_REJECT_BRDCST, 0); 194283514Sarybchik 195283514Sarybchik /* 196283514Sarybchik * Flow control, whether it is auto-negotiated or not, 197283514Sarybchik * is set via the PHY advertised capabilities. When set to 198283514Sarybchik * automatic the MAC will use the PHY settings to determine 199283514Sarybchik * the flow control settings. 200283514Sarybchik */ 201283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_FCNTL, MC_CMD_FCNTL_AUTO); 202283514Sarybchik 203283514Sarybchik /* Do not include the Ethernet frame checksum in RX packets */ 204283514Sarybchik MCDI_IN_POPULATE_DWORD_1(req, SET_MAC_IN_FLAGS, 205283514Sarybchik SET_MAC_IN_FLAG_INCLUDE_FCS, 0); 206283514Sarybchik 207283514Sarybchik efx_mcdi_execute_quiet(enp, &req); 208283514Sarybchik 209283514Sarybchik if (req.emr_rc != 0) { 210283514Sarybchik /* 211283514Sarybchik * Unprivileged functions cannot control link state, 212283514Sarybchik * but still need to configure filters. 213283514Sarybchik */ 214283514Sarybchik if (req.emr_rc != EACCES) { 215283514Sarybchik rc = req.emr_rc; 216283514Sarybchik goto fail1; 217283514Sarybchik } 218283514Sarybchik } 219283514Sarybchik 220283514Sarybchik /* 221283514Sarybchik * Apply the filters for the MAC configuration. 222283514Sarybchik * If the NIC isn't ready to accept filters this may 223283514Sarybchik * return success without setting anything. 224283514Sarybchik */ 225283514Sarybchik rc = efx_filter_reconfigure(enp, epp->ep_mac_addr, 226283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 227283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 228283514Sarybchik epp->ep_mulcst_addr_list, 229283514Sarybchik epp->ep_mulcst_addr_count); 230283514Sarybchik 231283514Sarybchik return (0); 232283514Sarybchik 233283514Sarybchikfail1: 234283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 235283514Sarybchik 236283514Sarybchik return (rc); 237283514Sarybchik} 238283514Sarybchik 239283514Sarybchik __checkReturn int 240283514Sarybchikhunt_mac_multicast_list_set( 241283514Sarybchik __in efx_nic_t *enp) 242283514Sarybchik{ 243283514Sarybchik efx_port_t *epp = &(enp->en_port); 244283514Sarybchik efx_mac_ops_t *emop = epp->ep_emop; 245283514Sarybchik int rc; 246283514Sarybchik 247283514Sarybchik EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON); 248283514Sarybchik 249283514Sarybchik /* FIXME: Insert filters for multicast list */ 250283514Sarybchik 251283514Sarybchik if ((rc = emop->emo_reconfigure(enp)) != 0) 252283514Sarybchik goto fail1; 253283514Sarybchik 254283514Sarybchik return (0); 255283514Sarybchik 256283514Sarybchikfail1: 257283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 258283514Sarybchik 259283514Sarybchik return (rc); 260283514Sarybchik} 261283514Sarybchik 262283514Sarybchik __checkReturn int 263283514Sarybchikhunt_mac_filter_default_rxq_set( 264283514Sarybchik __in efx_nic_t *enp, 265283514Sarybchik __in efx_rxq_t *erp, 266283514Sarybchik __in boolean_t using_rss) 267283514Sarybchik{ 268283514Sarybchik efx_port_t *epp = &(enp->en_port); 269283514Sarybchik efx_rxq_t *old_rxq; 270283514Sarybchik boolean_t old_using_rss; 271283514Sarybchik int rc; 272283514Sarybchik 273283514Sarybchik hunt_filter_get_default_rxq(enp, &old_rxq, &old_using_rss); 274283514Sarybchik 275283514Sarybchik hunt_filter_default_rxq_set(enp, erp, using_rss); 276283514Sarybchik 277283514Sarybchik rc = efx_filter_reconfigure(enp, epp->ep_mac_addr, 278283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 279283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 280283514Sarybchik epp->ep_mulcst_addr_list, 281283514Sarybchik epp->ep_mulcst_addr_count); 282283514Sarybchik 283283514Sarybchik if (rc != 0) 284283514Sarybchik goto fail1; 285283514Sarybchik 286283514Sarybchik return (0); 287283514Sarybchik 288283514Sarybchikfail1: 289283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 290283514Sarybchik 291283514Sarybchik hunt_filter_default_rxq_set(enp, old_rxq, old_using_rss); 292283514Sarybchik 293283514Sarybchik return (rc); 294283514Sarybchik} 295283514Sarybchik 296283514Sarybchik void 297283514Sarybchikhunt_mac_filter_default_rxq_clear( 298283514Sarybchik __in efx_nic_t *enp) 299283514Sarybchik{ 300283514Sarybchik efx_port_t *epp = &(enp->en_port); 301283514Sarybchik 302283514Sarybchik hunt_filter_default_rxq_clear(enp); 303283514Sarybchik 304283514Sarybchik efx_filter_reconfigure(enp, epp->ep_mac_addr, 305283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 306283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 307283514Sarybchik epp->ep_mulcst_addr_list, 308283514Sarybchik epp->ep_mulcst_addr_count); 309283514Sarybchik} 310283514Sarybchik 311283514Sarybchik 312283514Sarybchik#if EFSYS_OPT_LOOPBACK 313283514Sarybchik 314283514Sarybchik __checkReturn int 315283514Sarybchikhunt_mac_loopback_set( 316283514Sarybchik __in efx_nic_t *enp, 317283514Sarybchik __in efx_link_mode_t link_mode, 318283514Sarybchik __in efx_loopback_type_t loopback_type) 319283514Sarybchik{ 320283514Sarybchik /* 321283514Sarybchik * TBD: Consider a common Siena/Huntington function. The code is 322283514Sarybchik * essentially identical. 323283514Sarybchik */ 324283514Sarybchik 325283514Sarybchik efx_port_t *epp = &(enp->en_port); 326283514Sarybchik efx_phy_ops_t *epop = epp->ep_epop; 327283514Sarybchik efx_loopback_type_t old_loopback_type; 328283514Sarybchik efx_link_mode_t old_loopback_link_mode; 329283514Sarybchik int rc; 330283514Sarybchik 331283514Sarybchik /* The PHY object handles this on Huntington */ 332283514Sarybchik old_loopback_type = epp->ep_loopback_type; 333283514Sarybchik old_loopback_link_mode = epp->ep_loopback_link_mode; 334283514Sarybchik epp->ep_loopback_type = loopback_type; 335283514Sarybchik epp->ep_loopback_link_mode = link_mode; 336283514Sarybchik 337283514Sarybchik if ((rc = epop->epo_reconfigure(enp)) != 0) 338283514Sarybchik goto fail1; 339283514Sarybchik 340283514Sarybchik return (0); 341283514Sarybchik 342283514Sarybchikfail1: 343283514Sarybchik EFSYS_PROBE(fail2); 344283514Sarybchik 345283514Sarybchik epp->ep_loopback_type = old_loopback_type; 346283514Sarybchik epp->ep_loopback_link_mode = old_loopback_link_mode; 347283514Sarybchik 348283514Sarybchik return (rc); 349283514Sarybchik} 350283514Sarybchik 351283514Sarybchik#endif /* EFSYS_OPT_LOOPBACK */ 352283514Sarybchik 353283514Sarybchik#if EFSYS_OPT_MAC_STATS 354283514Sarybchik 355283514Sarybchik#define HUNT_MAC_STAT_READ(_esmp, _field, _eqp) \ 356283514Sarybchik EFSYS_MEM_READQ((_esmp), (_field) * sizeof (efx_qword_t), _eqp) 357283514Sarybchik 358283514Sarybchik 359283514Sarybchik __checkReturn int 360283514Sarybchikhunt_mac_stats_update( 361283514Sarybchik __in efx_nic_t *enp, 362283514Sarybchik __in efsys_mem_t *esmp, 363283514Sarybchik __out_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat, 364283514Sarybchik __out_opt uint32_t *generationp) 365283514Sarybchik{ 366283514Sarybchik efx_qword_t value; 367283514Sarybchik efx_qword_t generation_start; 368283514Sarybchik efx_qword_t generation_end; 369283514Sarybchik 370283514Sarybchik _NOTE(ARGUNUSED(enp)) 371283514Sarybchik 372283514Sarybchik /* Read END first so we don't race with the MC */ 373283514Sarybchik EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFX_MAC_STATS_SIZE); 374283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_GENERATION_END, 375283514Sarybchik &generation_end); 376283514Sarybchik EFSYS_MEM_READ_BARRIER(); 377283514Sarybchik 378283514Sarybchik /* TX */ 379283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_PKTS, &value); 380283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_PKTS]), &value); 381283514Sarybchik 382283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_CONTROL_PKTS, &value); 383283514Sarybchik EFSYS_STAT_SUBR_QWORD(&(stat[EFX_MAC_TX_PKTS]), &value); 384283514Sarybchik 385283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_PAUSE_PKTS, &value); 386283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_PAUSE_PKTS]), &value); 387283514Sarybchik 388283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_UNICAST_PKTS, &value); 389283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_UNICST_PKTS]), &value); 390283514Sarybchik 391283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_MULTICAST_PKTS, &value); 392283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_MULTICST_PKTS]), &value); 393283514Sarybchik 394283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BROADCAST_PKTS, &value); 395283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_BRDCST_PKTS]), &value); 396283514Sarybchik 397283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BYTES, &value); 398283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_OCTETS]), &value); 399283514Sarybchik 400283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_LT64_PKTS, &value); 401283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_LE_64_PKTS]), &value); 402283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_64_PKTS, &value); 403283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_LE_64_PKTS]), &value); 404283514Sarybchik 405283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_65_TO_127_PKTS, &value); 406283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_65_TO_127_PKTS]), &value); 407283514Sarybchik 408283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_128_TO_255_PKTS, &value); 409283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_128_TO_255_PKTS]), &value); 410283514Sarybchik 411283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_256_TO_511_PKTS, &value); 412283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_256_TO_511_PKTS]), &value); 413283514Sarybchik 414283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_512_TO_1023_PKTS, &value); 415283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_512_TO_1023_PKTS]), &value); 416283514Sarybchik 417283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_1024_TO_15XX_PKTS, &value); 418283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_1024_TO_15XX_PKTS]), &value); 419283514Sarybchik 420283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_15XX_TO_JUMBO_PKTS, &value); 421283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_GE_15XX_PKTS]), &value); 422283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_GTJUMBO_PKTS, &value); 423283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_TX_GE_15XX_PKTS]), &value); 424283514Sarybchik 425283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BAD_FCS_PKTS, &value); 426283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_ERRORS]), &value); 427283514Sarybchik 428283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_SINGLE_COLLISION_PKTS, &value); 429283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_SGL_COL_PKTS]), &value); 430283514Sarybchik 431283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_MULTIPLE_COLLISION_PKTS, 432283514Sarybchik &value); 433283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_MULT_COL_PKTS]), &value); 434283514Sarybchik 435283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_EXCESSIVE_COLLISION_PKTS, 436283514Sarybchik &value); 437283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_EX_COL_PKTS]), &value); 438283514Sarybchik 439283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_LATE_COLLISION_PKTS, &value); 440283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_LATE_COL_PKTS]), &value); 441283514Sarybchik 442283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_DEFERRED_PKTS, &value); 443283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_DEF_PKTS]), &value); 444283514Sarybchik 445283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_EXCESSIVE_DEFERRED_PKTS, 446283514Sarybchik &value); 447283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_EX_DEF_PKTS]), &value); 448283514Sarybchik 449283514Sarybchik /* RX */ 450283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BYTES, &value); 451283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_OCTETS]), &value); 452283514Sarybchik 453283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_PKTS, &value); 454283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_PKTS]), &value); 455283514Sarybchik 456283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_UNICAST_PKTS, &value); 457283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_UNICST_PKTS]), &value); 458283514Sarybchik 459283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_MULTICAST_PKTS, &value); 460283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_MULTICST_PKTS]), &value); 461283514Sarybchik 462283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BROADCAST_PKTS, &value); 463283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_BRDCST_PKTS]), &value); 464283514Sarybchik 465283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_PAUSE_PKTS, &value); 466283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_PAUSE_PKTS]), &value); 467283514Sarybchik 468283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_UNDERSIZE_PKTS, &value); 469283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_LE_64_PKTS]), &value); 470283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_64_PKTS, &value); 471283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_RX_LE_64_PKTS]), &value); 472283514Sarybchik 473283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_65_TO_127_PKTS, &value); 474283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_65_TO_127_PKTS]), &value); 475283514Sarybchik 476283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_128_TO_255_PKTS, &value); 477283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_128_TO_255_PKTS]), &value); 478283514Sarybchik 479283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_256_TO_511_PKTS, &value); 480283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_256_TO_511_PKTS]), &value); 481283514Sarybchik 482283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_512_TO_1023_PKTS, &value); 483283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_512_TO_1023_PKTS]), &value); 484283514Sarybchik 485283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_1024_TO_15XX_PKTS, &value); 486283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_1024_TO_15XX_PKTS]), &value); 487283514Sarybchik 488283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_15XX_TO_JUMBO_PKTS, &value); 489283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_GE_15XX_PKTS]), &value); 490283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_GTJUMBO_PKTS, &value); 491283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_RX_GE_15XX_PKTS]), &value); 492283514Sarybchik 493283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BAD_FCS_PKTS, &value); 494283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_FCS_ERRORS]), &value); 495283514Sarybchik 496283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_OVERFLOW_PKTS, &value); 497283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_DROP_EVENTS]), &value); 498283514Sarybchik 499283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_FALSE_CARRIER_PKTS, &value); 500283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_FALSE_CARRIER_ERRORS]), &value); 501283514Sarybchik 502283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_SYMBOL_ERROR_PKTS, &value); 503283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_SYMBOL_ERRORS]), &value); 504283514Sarybchik 505283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_ALIGN_ERROR_PKTS, &value); 506283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_ALIGN_ERRORS]), &value); 507283514Sarybchik 508283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_INTERNAL_ERROR_PKTS, &value); 509283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_INTERNAL_ERRORS]), &value); 510283514Sarybchik 511283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_JABBER_PKTS, &value); 512283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_JABBER_PKTS]), &value); 513283514Sarybchik 514283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES01_CHAR_ERR, &value); 515283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE0_CHAR_ERR]), 516283514Sarybchik &(value.eq_dword[0])); 517283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE1_CHAR_ERR]), 518283514Sarybchik &(value.eq_dword[1])); 519283514Sarybchik 520283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES23_CHAR_ERR, &value); 521283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE2_CHAR_ERR]), 522283514Sarybchik &(value.eq_dword[0])); 523283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE3_CHAR_ERR]), 524283514Sarybchik &(value.eq_dword[1])); 525283514Sarybchik 526283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES01_DISP_ERR, &value); 527283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE0_DISP_ERR]), 528283514Sarybchik &(value.eq_dword[0])); 529283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE1_DISP_ERR]), 530283514Sarybchik &(value.eq_dword[1])); 531283514Sarybchik 532283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES23_DISP_ERR, &value); 533283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE2_DISP_ERR]), 534283514Sarybchik &(value.eq_dword[0])); 535283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE3_DISP_ERR]), 536283514Sarybchik &(value.eq_dword[1])); 537283514Sarybchik 538283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_MATCH_FAULT, &value); 539283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_MATCH_FAULT]), &value); 540283514Sarybchik 541283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_NODESC_DROPS, &value); 542283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_NODESC_DROP_CNT]), &value); 543283514Sarybchik 544283514Sarybchik /* Packet memory (EF10 only) */ 545283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_BB_OVERFLOW, &value); 546283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_BB_OVERFLOW]), &value); 547283514Sarybchik 548283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_BB_OVERFLOW, &value); 549283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_BB_OVERFLOW]), &value); 550283514Sarybchik 551283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_VFIFO_FULL, &value); 552283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_VFIFO_FULL]), &value); 553283514Sarybchik 554283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_VFIFO_FULL, &value); 555283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_VFIFO_FULL]), &value); 556283514Sarybchik 557283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_QBB, &value); 558283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_QBB]), &value); 559283514Sarybchik 560283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_QBB, &value); 561283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_QBB]), &value); 562283514Sarybchik 563283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_MAPPING, &value); 564283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_MAPPING]), &value); 565283514Sarybchik 566283514Sarybchik /* RX datapath */ 567283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_Q_DISABLED_PKTS, &value); 568283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_Q_DISABLED_PKTS]), &value); 569283514Sarybchik 570283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_DI_DROPPED_PKTS, &value); 571283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_DI_DROPPED_PKTS]), &value); 572283514Sarybchik 573283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_STREAMING_PKTS, &value); 574283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_STREAMING_PKTS]), &value); 575283514Sarybchik 576283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_HLB_FETCH_CONDITIONS, &value); 577283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_HLB_FETCH]), &value); 578283514Sarybchik 579283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_HLB_WAIT_CONDITIONS, &value); 580283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_HLB_WAIT]), &value); 581283514Sarybchik 582283514Sarybchik 583283514Sarybchik /* VADAPTER RX */ 584283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_UNICAST_PACKETS, 585283514Sarybchik &value); 586283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_UNICAST_PACKETS]), 587283514Sarybchik &value); 588283514Sarybchik 589283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_UNICAST_BYTES, 590283514Sarybchik &value); 591283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_UNICAST_BYTES]), 592283514Sarybchik &value); 593283514Sarybchik 594283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_MULTICAST_PACKETS, 595283514Sarybchik &value); 596283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_MULTICAST_PACKETS]), 597283514Sarybchik &value); 598283514Sarybchik 599283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_MULTICAST_BYTES, 600283514Sarybchik &value); 601283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_MULTICAST_BYTES]), 602283514Sarybchik &value); 603283514Sarybchik 604283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BROADCAST_PACKETS, 605283514Sarybchik &value); 606283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BROADCAST_PACKETS]), 607283514Sarybchik &value); 608283514Sarybchik 609283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BROADCAST_BYTES, 610283514Sarybchik &value); 611283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BROADCAST_BYTES]), 612283514Sarybchik &value); 613283514Sarybchik 614283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BAD_PACKETS, 615283514Sarybchik &value); 616283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BAD_PACKETS]), 617283514Sarybchik &value); 618283514Sarybchik 619283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BAD_BYTES, &value); 620283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BAD_BYTES]), &value); 621283514Sarybchik 622283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_OVERFLOW, &value); 623283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_OVERFLOW]), &value); 624283514Sarybchik 625283514Sarybchik /* VADAPTER TX */ 626283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_UNICAST_PACKETS, 627283514Sarybchik &value); 628283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_UNICAST_PACKETS]), 629283514Sarybchik &value); 630283514Sarybchik 631283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_UNICAST_BYTES, 632283514Sarybchik &value); 633283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_UNICAST_BYTES]), 634283514Sarybchik &value); 635283514Sarybchik 636283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_MULTICAST_PACKETS, 637283514Sarybchik &value); 638283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_MULTICAST_PACKETS]), 639283514Sarybchik &value); 640283514Sarybchik 641283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_MULTICAST_BYTES, 642283514Sarybchik &value); 643283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_MULTICAST_BYTES]), 644283514Sarybchik &value); 645283514Sarybchik 646283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BROADCAST_PACKETS, 647283514Sarybchik &value); 648283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BROADCAST_PACKETS]), 649283514Sarybchik &value); 650283514Sarybchik 651283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BROADCAST_BYTES, 652283514Sarybchik &value); 653283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BROADCAST_BYTES]), 654283514Sarybchik &value); 655283514Sarybchik 656283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BAD_PACKETS, &value); 657283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BAD_PACKETS]), &value); 658283514Sarybchik 659283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BAD_BYTES, &value); 660283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BAD_BYTES]), &value); 661283514Sarybchik 662283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_OVERFLOW, &value); 663283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_OVERFLOW]), &value); 664283514Sarybchik 665283514Sarybchik 666283514Sarybchik EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFX_MAC_STATS_SIZE); 667283514Sarybchik EFSYS_MEM_READ_BARRIER(); 668283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_GENERATION_START, 669283514Sarybchik &generation_start); 670283514Sarybchik 671283514Sarybchik /* Check that we didn't read the stats in the middle of a DMA */ 672283514Sarybchik /* Not a good enough check ? */ 673283514Sarybchik if (memcmp(&generation_start, &generation_end, 674283514Sarybchik sizeof (generation_start))) 675283514Sarybchik return (EAGAIN); 676283514Sarybchik 677283514Sarybchik if (generationp) 678283514Sarybchik *generationp = EFX_QWORD_FIELD(generation_start, EFX_DWORD_0); 679283514Sarybchik 680283514Sarybchik return (0); 681283514Sarybchik} 682283514Sarybchik 683283514Sarybchik#endif /* EFSYS_OPT_MAC_STATS */ 684283514Sarybchik 685283514Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 686