ef10_mac.c revision 291390
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 291390 2015-11-27 15:50:17Z 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 153285798Sarybchik if ((rc = efx_mcdi_vadapter_set_mac(enp)) != 0) { 154285798Sarybchik if (rc != ENOTSUP) 155285798Sarybchik goto fail1; 156283514Sarybchik 157285798Sarybchik /* Fallback for older firmware without Vadapter support */ 158285798Sarybchik if ((rc = hunt_mac_reconfigure(enp)) != 0) 159285798Sarybchik goto fail2; 160285798Sarybchik } 161285798Sarybchik 162285798Sarybchik return (0); 163285798Sarybchik 164285798Sarybchikfail2: 165285798Sarybchik EFSYS_PROBE(fail2); 166285798Sarybchik 167283514Sarybchikfail1: 168283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 169283514Sarybchik 170283514Sarybchik return (rc); 171283514Sarybchik} 172283514Sarybchik 173283514Sarybchik__checkReturn int 174283514Sarybchikhunt_mac_reconfigure( 175283514Sarybchik __in efx_nic_t *enp) 176283514Sarybchik{ 177283514Sarybchik efx_port_t *epp = &(enp->en_port); 178283514Sarybchik efx_mcdi_req_t req; 179283514Sarybchik uint8_t payload[MAX(MC_CMD_SET_MAC_IN_LEN, 180283514Sarybchik MC_CMD_SET_MAC_OUT_LEN)]; 181283514Sarybchik int rc; 182283514Sarybchik 183283514Sarybchik (void) memset(payload, 0, sizeof (payload)); 184283514Sarybchik req.emr_cmd = MC_CMD_SET_MAC; 185283514Sarybchik req.emr_in_buf = payload; 186283514Sarybchik req.emr_in_length = MC_CMD_SET_MAC_IN_LEN; 187283514Sarybchik req.emr_out_buf = payload; 188283514Sarybchik req.emr_out_length = MC_CMD_SET_MAC_OUT_LEN; 189283514Sarybchik 190283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_MTU, epp->ep_mac_pdu); 191283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_DRAIN, epp->ep_mac_drain ? 1 : 0); 192283514Sarybchik EFX_MAC_ADDR_COPY(MCDI_IN2(req, uint8_t, SET_MAC_IN_ADDR), 193283514Sarybchik epp->ep_mac_addr); 194283514Sarybchik 195283514Sarybchik /* 196283514Sarybchik * Note: The Huntington MAC does not support REJECT_BRDCST. 197283514Sarybchik * The REJECT_UNCST flag will also prevent multicast traffic 198283514Sarybchik * from reaching the filters. As Huntington filters drop any 199283514Sarybchik * traffic that does not match a filter it is ok to leave the 200283514Sarybchik * MAC running in promiscuous mode. See bug41141. 201283514Sarybchik */ 202283514Sarybchik MCDI_IN_POPULATE_DWORD_2(req, SET_MAC_IN_REJECT, 203283514Sarybchik SET_MAC_IN_REJECT_UNCST, 0, 204283514Sarybchik SET_MAC_IN_REJECT_BRDCST, 0); 205283514Sarybchik 206283514Sarybchik /* 207283514Sarybchik * Flow control, whether it is auto-negotiated or not, 208283514Sarybchik * is set via the PHY advertised capabilities. When set to 209283514Sarybchik * automatic the MAC will use the PHY settings to determine 210283514Sarybchik * the flow control settings. 211283514Sarybchik */ 212283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_FCNTL, MC_CMD_FCNTL_AUTO); 213283514Sarybchik 214283514Sarybchik /* Do not include the Ethernet frame checksum in RX packets */ 215283514Sarybchik MCDI_IN_POPULATE_DWORD_1(req, SET_MAC_IN_FLAGS, 216283514Sarybchik SET_MAC_IN_FLAG_INCLUDE_FCS, 0); 217283514Sarybchik 218283514Sarybchik efx_mcdi_execute_quiet(enp, &req); 219283514Sarybchik 220283514Sarybchik if (req.emr_rc != 0) { 221283514Sarybchik /* 222283514Sarybchik * Unprivileged functions cannot control link state, 223283514Sarybchik * but still need to configure filters. 224283514Sarybchik */ 225283514Sarybchik if (req.emr_rc != EACCES) { 226283514Sarybchik rc = req.emr_rc; 227283514Sarybchik goto fail1; 228283514Sarybchik } 229283514Sarybchik } 230283514Sarybchik 231283514Sarybchik /* 232283514Sarybchik * Apply the filters for the MAC configuration. 233283514Sarybchik * If the NIC isn't ready to accept filters this may 234283514Sarybchik * return success without setting anything. 235283514Sarybchik */ 236283514Sarybchik rc = efx_filter_reconfigure(enp, epp->ep_mac_addr, 237283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 238283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 239283514Sarybchik epp->ep_mulcst_addr_list, 240283514Sarybchik epp->ep_mulcst_addr_count); 241283514Sarybchik 242283514Sarybchik return (0); 243283514Sarybchik 244283514Sarybchikfail1: 245283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 246283514Sarybchik 247283514Sarybchik return (rc); 248283514Sarybchik} 249283514Sarybchik 250283514Sarybchik __checkReturn int 251283514Sarybchikhunt_mac_multicast_list_set( 252283514Sarybchik __in efx_nic_t *enp) 253283514Sarybchik{ 254283514Sarybchik efx_port_t *epp = &(enp->en_port); 255283514Sarybchik efx_mac_ops_t *emop = epp->ep_emop; 256283514Sarybchik int rc; 257283514Sarybchik 258283514Sarybchik EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON); 259283514Sarybchik 260283514Sarybchik /* FIXME: Insert filters for multicast list */ 261283514Sarybchik 262283514Sarybchik if ((rc = emop->emo_reconfigure(enp)) != 0) 263283514Sarybchik goto fail1; 264283514Sarybchik 265283514Sarybchik return (0); 266283514Sarybchik 267283514Sarybchikfail1: 268283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 269283514Sarybchik 270283514Sarybchik return (rc); 271283514Sarybchik} 272283514Sarybchik 273283514Sarybchik __checkReturn int 274283514Sarybchikhunt_mac_filter_default_rxq_set( 275283514Sarybchik __in efx_nic_t *enp, 276283514Sarybchik __in efx_rxq_t *erp, 277283514Sarybchik __in boolean_t using_rss) 278283514Sarybchik{ 279283514Sarybchik efx_port_t *epp = &(enp->en_port); 280283514Sarybchik efx_rxq_t *old_rxq; 281283514Sarybchik boolean_t old_using_rss; 282283514Sarybchik int rc; 283283514Sarybchik 284283514Sarybchik hunt_filter_get_default_rxq(enp, &old_rxq, &old_using_rss); 285283514Sarybchik 286283514Sarybchik hunt_filter_default_rxq_set(enp, erp, using_rss); 287283514Sarybchik 288283514Sarybchik rc = efx_filter_reconfigure(enp, epp->ep_mac_addr, 289283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 290283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 291283514Sarybchik epp->ep_mulcst_addr_list, 292283514Sarybchik epp->ep_mulcst_addr_count); 293283514Sarybchik 294283514Sarybchik if (rc != 0) 295283514Sarybchik goto fail1; 296283514Sarybchik 297283514Sarybchik return (0); 298283514Sarybchik 299283514Sarybchikfail1: 300283514Sarybchik EFSYS_PROBE1(fail1, int, rc); 301283514Sarybchik 302283514Sarybchik hunt_filter_default_rxq_set(enp, old_rxq, old_using_rss); 303283514Sarybchik 304283514Sarybchik return (rc); 305283514Sarybchik} 306283514Sarybchik 307283514Sarybchik void 308283514Sarybchikhunt_mac_filter_default_rxq_clear( 309283514Sarybchik __in efx_nic_t *enp) 310283514Sarybchik{ 311283514Sarybchik efx_port_t *epp = &(enp->en_port); 312283514Sarybchik 313283514Sarybchik hunt_filter_default_rxq_clear(enp); 314283514Sarybchik 315283514Sarybchik efx_filter_reconfigure(enp, epp->ep_mac_addr, 316283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 317283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 318283514Sarybchik epp->ep_mulcst_addr_list, 319283514Sarybchik epp->ep_mulcst_addr_count); 320283514Sarybchik} 321283514Sarybchik 322283514Sarybchik 323283514Sarybchik#if EFSYS_OPT_LOOPBACK 324283514Sarybchik 325283514Sarybchik __checkReturn int 326283514Sarybchikhunt_mac_loopback_set( 327283514Sarybchik __in efx_nic_t *enp, 328283514Sarybchik __in efx_link_mode_t link_mode, 329283514Sarybchik __in efx_loopback_type_t loopback_type) 330283514Sarybchik{ 331283514Sarybchik /* 332283514Sarybchik * TBD: Consider a common Siena/Huntington function. The code is 333283514Sarybchik * essentially identical. 334283514Sarybchik */ 335283514Sarybchik 336283514Sarybchik efx_port_t *epp = &(enp->en_port); 337283514Sarybchik efx_phy_ops_t *epop = epp->ep_epop; 338283514Sarybchik efx_loopback_type_t old_loopback_type; 339283514Sarybchik efx_link_mode_t old_loopback_link_mode; 340283514Sarybchik int rc; 341283514Sarybchik 342283514Sarybchik /* The PHY object handles this on Huntington */ 343283514Sarybchik old_loopback_type = epp->ep_loopback_type; 344283514Sarybchik old_loopback_link_mode = epp->ep_loopback_link_mode; 345283514Sarybchik epp->ep_loopback_type = loopback_type; 346283514Sarybchik epp->ep_loopback_link_mode = link_mode; 347283514Sarybchik 348283514Sarybchik if ((rc = epop->epo_reconfigure(enp)) != 0) 349283514Sarybchik goto fail1; 350283514Sarybchik 351283514Sarybchik return (0); 352283514Sarybchik 353283514Sarybchikfail1: 354291390Sarybchik EFSYS_PROBE1(fail1, int, rc); 355283514Sarybchik 356283514Sarybchik epp->ep_loopback_type = old_loopback_type; 357283514Sarybchik epp->ep_loopback_link_mode = old_loopback_link_mode; 358283514Sarybchik 359283514Sarybchik return (rc); 360283514Sarybchik} 361283514Sarybchik 362283514Sarybchik#endif /* EFSYS_OPT_LOOPBACK */ 363283514Sarybchik 364283514Sarybchik#if EFSYS_OPT_MAC_STATS 365283514Sarybchik 366283514Sarybchik#define HUNT_MAC_STAT_READ(_esmp, _field, _eqp) \ 367283514Sarybchik EFSYS_MEM_READQ((_esmp), (_field) * sizeof (efx_qword_t), _eqp) 368283514Sarybchik 369283514Sarybchik 370283514Sarybchik __checkReturn int 371283514Sarybchikhunt_mac_stats_update( 372283514Sarybchik __in efx_nic_t *enp, 373283514Sarybchik __in efsys_mem_t *esmp, 374283514Sarybchik __out_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat, 375283514Sarybchik __out_opt uint32_t *generationp) 376283514Sarybchik{ 377283514Sarybchik efx_qword_t value; 378283514Sarybchik efx_qword_t generation_start; 379283514Sarybchik efx_qword_t generation_end; 380283514Sarybchik 381283514Sarybchik _NOTE(ARGUNUSED(enp)) 382283514Sarybchik 383283514Sarybchik /* Read END first so we don't race with the MC */ 384283514Sarybchik EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFX_MAC_STATS_SIZE); 385283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_GENERATION_END, 386283514Sarybchik &generation_end); 387283514Sarybchik EFSYS_MEM_READ_BARRIER(); 388283514Sarybchik 389283514Sarybchik /* TX */ 390283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_PKTS, &value); 391283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_PKTS]), &value); 392283514Sarybchik 393283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_CONTROL_PKTS, &value); 394283514Sarybchik EFSYS_STAT_SUBR_QWORD(&(stat[EFX_MAC_TX_PKTS]), &value); 395283514Sarybchik 396283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_PAUSE_PKTS, &value); 397283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_PAUSE_PKTS]), &value); 398283514Sarybchik 399283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_UNICAST_PKTS, &value); 400283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_UNICST_PKTS]), &value); 401283514Sarybchik 402283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_MULTICAST_PKTS, &value); 403283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_MULTICST_PKTS]), &value); 404283514Sarybchik 405283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BROADCAST_PKTS, &value); 406283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_BRDCST_PKTS]), &value); 407283514Sarybchik 408283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BYTES, &value); 409283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_OCTETS]), &value); 410283514Sarybchik 411283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_LT64_PKTS, &value); 412283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_LE_64_PKTS]), &value); 413283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_64_PKTS, &value); 414283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_LE_64_PKTS]), &value); 415283514Sarybchik 416283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_65_TO_127_PKTS, &value); 417283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_65_TO_127_PKTS]), &value); 418283514Sarybchik 419283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_128_TO_255_PKTS, &value); 420283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_128_TO_255_PKTS]), &value); 421283514Sarybchik 422283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_256_TO_511_PKTS, &value); 423283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_256_TO_511_PKTS]), &value); 424283514Sarybchik 425283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_512_TO_1023_PKTS, &value); 426283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_512_TO_1023_PKTS]), &value); 427283514Sarybchik 428283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_1024_TO_15XX_PKTS, &value); 429283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_1024_TO_15XX_PKTS]), &value); 430283514Sarybchik 431283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_15XX_TO_JUMBO_PKTS, &value); 432283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_GE_15XX_PKTS]), &value); 433283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_GTJUMBO_PKTS, &value); 434283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_TX_GE_15XX_PKTS]), &value); 435283514Sarybchik 436283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BAD_FCS_PKTS, &value); 437283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_ERRORS]), &value); 438283514Sarybchik 439283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_SINGLE_COLLISION_PKTS, &value); 440283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_SGL_COL_PKTS]), &value); 441283514Sarybchik 442283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_MULTIPLE_COLLISION_PKTS, 443283514Sarybchik &value); 444283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_MULT_COL_PKTS]), &value); 445283514Sarybchik 446283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_EXCESSIVE_COLLISION_PKTS, 447283514Sarybchik &value); 448283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_EX_COL_PKTS]), &value); 449283514Sarybchik 450283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_LATE_COLLISION_PKTS, &value); 451283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_LATE_COL_PKTS]), &value); 452283514Sarybchik 453283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_DEFERRED_PKTS, &value); 454283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_DEF_PKTS]), &value); 455283514Sarybchik 456283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_EXCESSIVE_DEFERRED_PKTS, 457283514Sarybchik &value); 458283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_EX_DEF_PKTS]), &value); 459283514Sarybchik 460283514Sarybchik /* RX */ 461283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BYTES, &value); 462283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_OCTETS]), &value); 463283514Sarybchik 464283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_PKTS, &value); 465283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_PKTS]), &value); 466283514Sarybchik 467283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_UNICAST_PKTS, &value); 468283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_UNICST_PKTS]), &value); 469283514Sarybchik 470283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_MULTICAST_PKTS, &value); 471283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_MULTICST_PKTS]), &value); 472283514Sarybchik 473283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BROADCAST_PKTS, &value); 474283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_BRDCST_PKTS]), &value); 475283514Sarybchik 476283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_PAUSE_PKTS, &value); 477283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_PAUSE_PKTS]), &value); 478283514Sarybchik 479283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_UNDERSIZE_PKTS, &value); 480283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_LE_64_PKTS]), &value); 481283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_64_PKTS, &value); 482283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_RX_LE_64_PKTS]), &value); 483283514Sarybchik 484283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_65_TO_127_PKTS, &value); 485283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_65_TO_127_PKTS]), &value); 486283514Sarybchik 487283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_128_TO_255_PKTS, &value); 488283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_128_TO_255_PKTS]), &value); 489283514Sarybchik 490283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_256_TO_511_PKTS, &value); 491283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_256_TO_511_PKTS]), &value); 492283514Sarybchik 493283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_512_TO_1023_PKTS, &value); 494283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_512_TO_1023_PKTS]), &value); 495283514Sarybchik 496283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_1024_TO_15XX_PKTS, &value); 497283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_1024_TO_15XX_PKTS]), &value); 498283514Sarybchik 499283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_15XX_TO_JUMBO_PKTS, &value); 500283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_GE_15XX_PKTS]), &value); 501283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_GTJUMBO_PKTS, &value); 502283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_RX_GE_15XX_PKTS]), &value); 503283514Sarybchik 504283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BAD_FCS_PKTS, &value); 505283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_FCS_ERRORS]), &value); 506283514Sarybchik 507283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_OVERFLOW_PKTS, &value); 508283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_DROP_EVENTS]), &value); 509283514Sarybchik 510283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_FALSE_CARRIER_PKTS, &value); 511283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_FALSE_CARRIER_ERRORS]), &value); 512283514Sarybchik 513283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_SYMBOL_ERROR_PKTS, &value); 514283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_SYMBOL_ERRORS]), &value); 515283514Sarybchik 516283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_ALIGN_ERROR_PKTS, &value); 517283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_ALIGN_ERRORS]), &value); 518283514Sarybchik 519283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_INTERNAL_ERROR_PKTS, &value); 520283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_INTERNAL_ERRORS]), &value); 521283514Sarybchik 522283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_JABBER_PKTS, &value); 523283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_JABBER_PKTS]), &value); 524283514Sarybchik 525283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES01_CHAR_ERR, &value); 526283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE0_CHAR_ERR]), 527283514Sarybchik &(value.eq_dword[0])); 528283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE1_CHAR_ERR]), 529283514Sarybchik &(value.eq_dword[1])); 530283514Sarybchik 531283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES23_CHAR_ERR, &value); 532283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE2_CHAR_ERR]), 533283514Sarybchik &(value.eq_dword[0])); 534283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE3_CHAR_ERR]), 535283514Sarybchik &(value.eq_dword[1])); 536283514Sarybchik 537283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES01_DISP_ERR, &value); 538283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE0_DISP_ERR]), 539283514Sarybchik &(value.eq_dword[0])); 540283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE1_DISP_ERR]), 541283514Sarybchik &(value.eq_dword[1])); 542283514Sarybchik 543283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES23_DISP_ERR, &value); 544283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE2_DISP_ERR]), 545283514Sarybchik &(value.eq_dword[0])); 546283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE3_DISP_ERR]), 547283514Sarybchik &(value.eq_dword[1])); 548283514Sarybchik 549283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_MATCH_FAULT, &value); 550283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_MATCH_FAULT]), &value); 551283514Sarybchik 552283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_NODESC_DROPS, &value); 553283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_NODESC_DROP_CNT]), &value); 554283514Sarybchik 555283514Sarybchik /* Packet memory (EF10 only) */ 556283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_BB_OVERFLOW, &value); 557283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_BB_OVERFLOW]), &value); 558283514Sarybchik 559283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_BB_OVERFLOW, &value); 560283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_BB_OVERFLOW]), &value); 561283514Sarybchik 562283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_VFIFO_FULL, &value); 563283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_VFIFO_FULL]), &value); 564283514Sarybchik 565283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_VFIFO_FULL, &value); 566283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_VFIFO_FULL]), &value); 567283514Sarybchik 568283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_QBB, &value); 569283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_QBB]), &value); 570283514Sarybchik 571283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_QBB, &value); 572283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_QBB]), &value); 573283514Sarybchik 574283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_MAPPING, &value); 575283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_MAPPING]), &value); 576283514Sarybchik 577283514Sarybchik /* RX datapath */ 578283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_Q_DISABLED_PKTS, &value); 579283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_Q_DISABLED_PKTS]), &value); 580283514Sarybchik 581283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_DI_DROPPED_PKTS, &value); 582283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_DI_DROPPED_PKTS]), &value); 583283514Sarybchik 584283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_STREAMING_PKTS, &value); 585283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_STREAMING_PKTS]), &value); 586283514Sarybchik 587283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_HLB_FETCH_CONDITIONS, &value); 588283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_HLB_FETCH]), &value); 589283514Sarybchik 590283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_HLB_WAIT_CONDITIONS, &value); 591283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_HLB_WAIT]), &value); 592283514Sarybchik 593283514Sarybchik 594283514Sarybchik /* VADAPTER RX */ 595283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_UNICAST_PACKETS, 596283514Sarybchik &value); 597283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_UNICAST_PACKETS]), 598283514Sarybchik &value); 599283514Sarybchik 600283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_UNICAST_BYTES, 601283514Sarybchik &value); 602283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_UNICAST_BYTES]), 603283514Sarybchik &value); 604283514Sarybchik 605283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_MULTICAST_PACKETS, 606283514Sarybchik &value); 607283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_MULTICAST_PACKETS]), 608283514Sarybchik &value); 609283514Sarybchik 610283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_MULTICAST_BYTES, 611283514Sarybchik &value); 612283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_MULTICAST_BYTES]), 613283514Sarybchik &value); 614283514Sarybchik 615283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BROADCAST_PACKETS, 616283514Sarybchik &value); 617283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BROADCAST_PACKETS]), 618283514Sarybchik &value); 619283514Sarybchik 620283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BROADCAST_BYTES, 621283514Sarybchik &value); 622283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BROADCAST_BYTES]), 623283514Sarybchik &value); 624283514Sarybchik 625283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BAD_PACKETS, 626283514Sarybchik &value); 627283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BAD_PACKETS]), 628283514Sarybchik &value); 629283514Sarybchik 630283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BAD_BYTES, &value); 631283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BAD_BYTES]), &value); 632283514Sarybchik 633283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_OVERFLOW, &value); 634283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_OVERFLOW]), &value); 635283514Sarybchik 636283514Sarybchik /* VADAPTER TX */ 637283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_UNICAST_PACKETS, 638283514Sarybchik &value); 639283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_UNICAST_PACKETS]), 640283514Sarybchik &value); 641283514Sarybchik 642283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_UNICAST_BYTES, 643283514Sarybchik &value); 644283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_UNICAST_BYTES]), 645283514Sarybchik &value); 646283514Sarybchik 647283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_MULTICAST_PACKETS, 648283514Sarybchik &value); 649283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_MULTICAST_PACKETS]), 650283514Sarybchik &value); 651283514Sarybchik 652283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_MULTICAST_BYTES, 653283514Sarybchik &value); 654283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_MULTICAST_BYTES]), 655283514Sarybchik &value); 656283514Sarybchik 657283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BROADCAST_PACKETS, 658283514Sarybchik &value); 659283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BROADCAST_PACKETS]), 660283514Sarybchik &value); 661283514Sarybchik 662283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BROADCAST_BYTES, 663283514Sarybchik &value); 664283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BROADCAST_BYTES]), 665283514Sarybchik &value); 666283514Sarybchik 667283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BAD_PACKETS, &value); 668283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BAD_PACKETS]), &value); 669283514Sarybchik 670283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BAD_BYTES, &value); 671283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BAD_BYTES]), &value); 672283514Sarybchik 673283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_OVERFLOW, &value); 674283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_OVERFLOW]), &value); 675283514Sarybchik 676283514Sarybchik 677283514Sarybchik EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFX_MAC_STATS_SIZE); 678283514Sarybchik EFSYS_MEM_READ_BARRIER(); 679283514Sarybchik HUNT_MAC_STAT_READ(esmp, MC_CMD_MAC_GENERATION_START, 680283514Sarybchik &generation_start); 681283514Sarybchik 682283514Sarybchik /* Check that we didn't read the stats in the middle of a DMA */ 683283514Sarybchik /* Not a good enough check ? */ 684283514Sarybchik if (memcmp(&generation_start, &generation_end, 685283514Sarybchik sizeof (generation_start))) 686283514Sarybchik return (EAGAIN); 687283514Sarybchik 688283514Sarybchik if (generationp) 689283514Sarybchik *generationp = EFX_QWORD_FIELD(generation_start, EFX_DWORD_0); 690283514Sarybchik 691283514Sarybchik return (0); 692283514Sarybchik} 693283514Sarybchik 694283514Sarybchik#endif /* EFSYS_OPT_MAC_STATS */ 695283514Sarybchik 696283514Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 697