1283514Sarybchik/*- 2301388Sarybchik * Copyright (c) 2012-2016 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: stable/10/sys/dev/sfxge/common/ef10_mac.c 342519 2018-12-26 10:26:58Z arybchik $"); 33283514Sarybchik 34283514Sarybchik#include "efx.h" 35283514Sarybchik#include "efx_impl.h" 36283514Sarybchik 37283514Sarybchik 38299599Sarybchik#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD 39283514Sarybchik 40291436Sarybchik __checkReturn efx_rc_t 41294092Sarybchikef10_mac_poll( 42283514Sarybchik __in efx_nic_t *enp, 43283514Sarybchik __out efx_link_mode_t *link_modep) 44283514Sarybchik{ 45283514Sarybchik efx_port_t *epp = &(enp->en_port); 46294075Sarybchik ef10_link_state_t els; 47291436Sarybchik efx_rc_t rc; 48283514Sarybchik 49294091Sarybchik if ((rc = ef10_phy_get_link(enp, &els)) != 0) 50283514Sarybchik goto fail1; 51283514Sarybchik 52294075Sarybchik epp->ep_adv_cap_mask = els.els_adv_cap_mask; 53294075Sarybchik epp->ep_fcntl = els.els_fcntl; 54283514Sarybchik 55294075Sarybchik *link_modep = els.els_link_mode; 56283514Sarybchik 57283514Sarybchik return (0); 58283514Sarybchik 59283514Sarybchikfail1: 60291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 61283514Sarybchik 62283514Sarybchik *link_modep = EFX_LINK_UNKNOWN; 63283514Sarybchik 64283514Sarybchik return (rc); 65283514Sarybchik} 66283514Sarybchik 67291436Sarybchik __checkReturn efx_rc_t 68294092Sarybchikef10_mac_up( 69283514Sarybchik __in efx_nic_t *enp, 70283514Sarybchik __out boolean_t *mac_upp) 71283514Sarybchik{ 72294075Sarybchik ef10_link_state_t els; 73291436Sarybchik efx_rc_t rc; 74283514Sarybchik 75283514Sarybchik /* 76294092Sarybchik * Because EF10 doesn't *require* polling, we can't rely on 77294092Sarybchik * ef10_mac_poll() being executed to populate epp->ep_mac_up. 78283514Sarybchik */ 79294091Sarybchik if ((rc = ef10_phy_get_link(enp, &els)) != 0) 80283514Sarybchik goto fail1; 81283514Sarybchik 82294075Sarybchik *mac_upp = els.els_mac_up; 83283514Sarybchik 84283514Sarybchik return (0); 85283514Sarybchik 86283514Sarybchikfail1: 87291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 88283514Sarybchik 89283514Sarybchik return (rc); 90283514Sarybchik} 91283514Sarybchik 92283514Sarybchik/* 93294092Sarybchik * EF10 adapters use MC_CMD_VADAPTOR_SET_MAC to set the 94283514Sarybchik * MAC address; the address field in MC_CMD_SET_MAC has no 95283514Sarybchik * effect. 96283514Sarybchik * MC_CMD_VADAPTOR_SET_MAC requires mac-spoofing privilege and 97283514Sarybchik * the port to have no filters or queues active. 98283514Sarybchik */ 99291436Sarybchikstatic __checkReturn efx_rc_t 100283514Sarybchikefx_mcdi_vadapter_set_mac( 101283514Sarybchik __in efx_nic_t *enp) 102283514Sarybchik{ 103283514Sarybchik efx_port_t *epp = &(enp->en_port); 104283514Sarybchik efx_mcdi_req_t req; 105342516Sarybchik EFX_MCDI_DECLARE_BUF(payload, MC_CMD_VADAPTOR_SET_MAC_IN_LEN, 106342516Sarybchik MC_CMD_VADAPTOR_SET_MAC_OUT_LEN); 107291436Sarybchik efx_rc_t rc; 108283514Sarybchik 109283514Sarybchik req.emr_cmd = MC_CMD_VADAPTOR_SET_MAC; 110283514Sarybchik req.emr_in_buf = payload; 111283514Sarybchik req.emr_in_length = MC_CMD_VADAPTOR_SET_MAC_IN_LEN; 112283514Sarybchik req.emr_out_buf = payload; 113283514Sarybchik req.emr_out_length = MC_CMD_VADAPTOR_SET_MAC_OUT_LEN; 114283514Sarybchik 115283514Sarybchik MCDI_IN_SET_DWORD(req, VADAPTOR_SET_MAC_IN_UPSTREAM_PORT_ID, 116283514Sarybchik enp->en_vport_id); 117283514Sarybchik EFX_MAC_ADDR_COPY(MCDI_IN2(req, uint8_t, VADAPTOR_SET_MAC_IN_MACADDR), 118283514Sarybchik epp->ep_mac_addr); 119283514Sarybchik 120283514Sarybchik efx_mcdi_execute(enp, &req); 121283514Sarybchik 122283514Sarybchik if (req.emr_rc != 0) { 123283514Sarybchik rc = req.emr_rc; 124283514Sarybchik goto fail1; 125283514Sarybchik } 126283514Sarybchik 127283514Sarybchik return (0); 128283514Sarybchik 129283514Sarybchikfail1: 130291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 131283514Sarybchik 132283514Sarybchik return (rc); 133283514Sarybchik} 134283514Sarybchik 135291436Sarybchik __checkReturn efx_rc_t 136294092Sarybchikef10_mac_addr_set( 137283514Sarybchik __in efx_nic_t *enp) 138283514Sarybchik{ 139291436Sarybchik efx_rc_t rc; 140283514Sarybchik 141285798Sarybchik if ((rc = efx_mcdi_vadapter_set_mac(enp)) != 0) { 142285798Sarybchik if (rc != ENOTSUP) 143285798Sarybchik goto fail1; 144283514Sarybchik 145294092Sarybchik /* 146294092Sarybchik * Fallback for older Huntington firmware without Vadapter 147294092Sarybchik * support. 148294092Sarybchik */ 149294092Sarybchik if ((rc = ef10_mac_reconfigure(enp)) != 0) 150285798Sarybchik goto fail2; 151285798Sarybchik } 152285798Sarybchik 153285798Sarybchik return (0); 154285798Sarybchik 155285798Sarybchikfail2: 156285798Sarybchik EFSYS_PROBE(fail2); 157285798Sarybchik 158283514Sarybchikfail1: 159291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 160283514Sarybchik 161283514Sarybchik return (rc); 162283514Sarybchik} 163283514Sarybchik 164294253Sarybchikstatic __checkReturn efx_rc_t 165294253Sarybchikefx_mcdi_mtu_set( 166294253Sarybchik __in efx_nic_t *enp, 167294253Sarybchik __in uint32_t mtu) 168294253Sarybchik{ 169294253Sarybchik efx_mcdi_req_t req; 170342516Sarybchik EFX_MCDI_DECLARE_BUF(payload, MC_CMD_SET_MAC_EXT_IN_LEN, 171342516Sarybchik MC_CMD_SET_MAC_OUT_LEN); 172294253Sarybchik efx_rc_t rc; 173294253Sarybchik 174294253Sarybchik req.emr_cmd = MC_CMD_SET_MAC; 175294253Sarybchik req.emr_in_buf = payload; 176294253Sarybchik req.emr_in_length = MC_CMD_SET_MAC_EXT_IN_LEN; 177294253Sarybchik req.emr_out_buf = payload; 178294253Sarybchik req.emr_out_length = MC_CMD_SET_MAC_OUT_LEN; 179294253Sarybchik 180294253Sarybchik /* Only configure the MTU in this call to MC_CMD_SET_MAC */ 181294253Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_EXT_IN_MTU, mtu); 182294253Sarybchik MCDI_IN_POPULATE_DWORD_1(req, SET_MAC_EXT_IN_CONTROL, 183294253Sarybchik SET_MAC_EXT_IN_CFG_MTU, 1); 184294253Sarybchik 185294253Sarybchik efx_mcdi_execute(enp, &req); 186294253Sarybchik 187294253Sarybchik if (req.emr_rc != 0) { 188294253Sarybchik rc = req.emr_rc; 189294253Sarybchik goto fail1; 190294253Sarybchik } 191294253Sarybchik 192294253Sarybchik return (0); 193294253Sarybchik 194294253Sarybchikfail1: 195294253Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 196294253Sarybchik 197294253Sarybchik return (rc); 198294253Sarybchik} 199294253Sarybchik 200301380Sarybchikstatic __checkReturn efx_rc_t 201301380Sarybchikefx_mcdi_mtu_get( 202301380Sarybchik __in efx_nic_t *enp, 203301380Sarybchik __out size_t *mtu) 204301380Sarybchik{ 205301380Sarybchik efx_mcdi_req_t req; 206342516Sarybchik EFX_MCDI_DECLARE_BUF(payload, MC_CMD_SET_MAC_EXT_IN_LEN, 207342516Sarybchik MC_CMD_SET_MAC_V2_OUT_LEN); 208301380Sarybchik efx_rc_t rc; 209301380Sarybchik 210301380Sarybchik req.emr_cmd = MC_CMD_SET_MAC; 211301380Sarybchik req.emr_in_buf = payload; 212301380Sarybchik req.emr_in_length = MC_CMD_SET_MAC_EXT_IN_LEN; 213301380Sarybchik req.emr_out_buf = payload; 214301380Sarybchik req.emr_out_length = MC_CMD_SET_MAC_V2_OUT_LEN; 215301380Sarybchik 216301380Sarybchik /* 217301380Sarybchik * With MC_CMD_SET_MAC_EXT_IN_CONTROL set to 0, this just queries the 218301380Sarybchik * MTU. This should always be supported on Medford, but it is not 219301380Sarybchik * supported on older Huntington firmware. 220301380Sarybchik */ 221301380Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_EXT_IN_CONTROL, 0); 222301380Sarybchik 223301380Sarybchik efx_mcdi_execute(enp, &req); 224301380Sarybchik 225301380Sarybchik if (req.emr_rc != 0) { 226301380Sarybchik rc = req.emr_rc; 227301380Sarybchik goto fail1; 228301380Sarybchik } 229301380Sarybchik if (req.emr_out_length_used < MC_CMD_SET_MAC_V2_OUT_MTU_OFST + 4) { 230301380Sarybchik rc = EMSGSIZE; 231301380Sarybchik goto fail2; 232301380Sarybchik } 233301380Sarybchik 234301380Sarybchik *mtu = MCDI_OUT_DWORD(req, SET_MAC_V2_OUT_MTU); 235301380Sarybchik 236301380Sarybchik return (0); 237301380Sarybchik 238301380Sarybchikfail2: 239301380Sarybchik EFSYS_PROBE(fail2); 240301380Sarybchikfail1: 241301380Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 242301380Sarybchik 243301380Sarybchik return (rc); 244301380Sarybchik} 245301380Sarybchik 246294253Sarybchik __checkReturn efx_rc_t 247294253Sarybchikef10_mac_pdu_set( 248294253Sarybchik __in efx_nic_t *enp) 249294253Sarybchik{ 250294253Sarybchik efx_port_t *epp = &(enp->en_port); 251294253Sarybchik efx_nic_cfg_t *encp = &(enp->en_nic_cfg); 252294253Sarybchik efx_rc_t rc; 253294253Sarybchik 254294253Sarybchik if (encp->enc_enhanced_set_mac_supported) { 255294253Sarybchik if ((rc = efx_mcdi_mtu_set(enp, epp->ep_mac_pdu)) != 0) 256294253Sarybchik goto fail1; 257294253Sarybchik } else { 258294253Sarybchik /* 259294253Sarybchik * Fallback for older Huntington firmware, which always 260294253Sarybchik * configure all of the parameters to MC_CMD_SET_MAC. This isn't 261294253Sarybchik * suitable for setting the MTU on unpriviliged functions. 262294253Sarybchik */ 263294253Sarybchik if ((rc = ef10_mac_reconfigure(enp)) != 0) 264294253Sarybchik goto fail2; 265294253Sarybchik } 266294253Sarybchik 267294253Sarybchik return (0); 268294253Sarybchik 269294253Sarybchikfail2: 270294253Sarybchik EFSYS_PROBE(fail2); 271294253Sarybchikfail1: 272294253Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 273294253Sarybchik 274294253Sarybchik return (rc); 275294253Sarybchik} 276294253Sarybchik 277301380Sarybchik __checkReturn efx_rc_t 278301380Sarybchikef10_mac_pdu_get( 279301380Sarybchik __in efx_nic_t *enp, 280301380Sarybchik __out size_t *pdu) 281301380Sarybchik{ 282301380Sarybchik efx_rc_t rc; 283301380Sarybchik 284301380Sarybchik if ((rc = efx_mcdi_mtu_get(enp, pdu)) != 0) 285301380Sarybchik goto fail1; 286301380Sarybchik 287301380Sarybchik return (0); 288301380Sarybchik 289301380Sarybchikfail1: 290301380Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 291301380Sarybchik 292301380Sarybchik return (rc); 293301380Sarybchik} 294301380Sarybchik 295291436Sarybchik__checkReturn efx_rc_t 296294092Sarybchikef10_mac_reconfigure( 297283514Sarybchik __in efx_nic_t *enp) 298283514Sarybchik{ 299283514Sarybchik efx_port_t *epp = &(enp->en_port); 300283514Sarybchik efx_mcdi_req_t req; 301342516Sarybchik EFX_MCDI_DECLARE_BUF(payload, MC_CMD_SET_MAC_IN_LEN, 302342516Sarybchik MC_CMD_SET_MAC_OUT_LEN); 303291436Sarybchik efx_rc_t rc; 304283514Sarybchik 305283514Sarybchik req.emr_cmd = MC_CMD_SET_MAC; 306283514Sarybchik req.emr_in_buf = payload; 307283514Sarybchik req.emr_in_length = MC_CMD_SET_MAC_IN_LEN; 308283514Sarybchik req.emr_out_buf = payload; 309283514Sarybchik req.emr_out_length = MC_CMD_SET_MAC_OUT_LEN; 310283514Sarybchik 311283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_MTU, epp->ep_mac_pdu); 312283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_DRAIN, epp->ep_mac_drain ? 1 : 0); 313283514Sarybchik EFX_MAC_ADDR_COPY(MCDI_IN2(req, uint8_t, SET_MAC_IN_ADDR), 314283514Sarybchik epp->ep_mac_addr); 315283514Sarybchik 316283514Sarybchik /* 317283514Sarybchik * Note: The Huntington MAC does not support REJECT_BRDCST. 318283514Sarybchik * The REJECT_UNCST flag will also prevent multicast traffic 319283514Sarybchik * from reaching the filters. As Huntington filters drop any 320283514Sarybchik * traffic that does not match a filter it is ok to leave the 321283514Sarybchik * MAC running in promiscuous mode. See bug41141. 322294092Sarybchik * 323294092Sarybchik * FIXME: Does REJECT_UNCST behave the same way on Medford? 324283514Sarybchik */ 325283514Sarybchik MCDI_IN_POPULATE_DWORD_2(req, SET_MAC_IN_REJECT, 326283514Sarybchik SET_MAC_IN_REJECT_UNCST, 0, 327283514Sarybchik SET_MAC_IN_REJECT_BRDCST, 0); 328283514Sarybchik 329283514Sarybchik /* 330283514Sarybchik * Flow control, whether it is auto-negotiated or not, 331283514Sarybchik * is set via the PHY advertised capabilities. When set to 332283514Sarybchik * automatic the MAC will use the PHY settings to determine 333283514Sarybchik * the flow control settings. 334283514Sarybchik */ 335283514Sarybchik MCDI_IN_SET_DWORD(req, SET_MAC_IN_FCNTL, MC_CMD_FCNTL_AUTO); 336283514Sarybchik 337283514Sarybchik /* Do not include the Ethernet frame checksum in RX packets */ 338283514Sarybchik MCDI_IN_POPULATE_DWORD_1(req, SET_MAC_IN_FLAGS, 339283514Sarybchik SET_MAC_IN_FLAG_INCLUDE_FCS, 0); 340283514Sarybchik 341283514Sarybchik efx_mcdi_execute_quiet(enp, &req); 342283514Sarybchik 343283514Sarybchik if (req.emr_rc != 0) { 344283514Sarybchik /* 345283514Sarybchik * Unprivileged functions cannot control link state, 346283514Sarybchik * but still need to configure filters. 347283514Sarybchik */ 348283514Sarybchik if (req.emr_rc != EACCES) { 349283514Sarybchik rc = req.emr_rc; 350283514Sarybchik goto fail1; 351283514Sarybchik } 352283514Sarybchik } 353283514Sarybchik 354283514Sarybchik /* 355283514Sarybchik * Apply the filters for the MAC configuration. 356283514Sarybchik * If the NIC isn't ready to accept filters this may 357283514Sarybchik * return success without setting anything. 358283514Sarybchik */ 359283514Sarybchik rc = efx_filter_reconfigure(enp, epp->ep_mac_addr, 360283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 361283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 362283514Sarybchik epp->ep_mulcst_addr_list, 363283514Sarybchik epp->ep_mulcst_addr_count); 364283514Sarybchik 365283514Sarybchik return (0); 366283514Sarybchik 367283514Sarybchikfail1: 368291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 369283514Sarybchik 370283514Sarybchik return (rc); 371283514Sarybchik} 372283514Sarybchik 373291436Sarybchik __checkReturn efx_rc_t 374294092Sarybchikef10_mac_multicast_list_set( 375283514Sarybchik __in efx_nic_t *enp) 376283514Sarybchik{ 377283514Sarybchik efx_port_t *epp = &(enp->en_port); 378299517Sarybchik const efx_mac_ops_t *emop = epp->ep_emop; 379291436Sarybchik efx_rc_t rc; 380283514Sarybchik 381294092Sarybchik EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON || 382294092Sarybchik enp->en_family == EFX_FAMILY_MEDFORD); 383283514Sarybchik 384283514Sarybchik if ((rc = emop->emo_reconfigure(enp)) != 0) 385283514Sarybchik goto fail1; 386283514Sarybchik 387283514Sarybchik return (0); 388283514Sarybchik 389283514Sarybchikfail1: 390291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 391283514Sarybchik 392283514Sarybchik return (rc); 393283514Sarybchik} 394283514Sarybchik 395291436Sarybchik __checkReturn efx_rc_t 396294092Sarybchikef10_mac_filter_default_rxq_set( 397283514Sarybchik __in efx_nic_t *enp, 398283514Sarybchik __in efx_rxq_t *erp, 399283514Sarybchik __in boolean_t using_rss) 400283514Sarybchik{ 401283514Sarybchik efx_port_t *epp = &(enp->en_port); 402283514Sarybchik efx_rxq_t *old_rxq; 403283514Sarybchik boolean_t old_using_rss; 404291436Sarybchik efx_rc_t rc; 405283514Sarybchik 406293764Sarybchik ef10_filter_get_default_rxq(enp, &old_rxq, &old_using_rss); 407283514Sarybchik 408293764Sarybchik ef10_filter_default_rxq_set(enp, erp, using_rss); 409283514Sarybchik 410283514Sarybchik rc = efx_filter_reconfigure(enp, epp->ep_mac_addr, 411283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 412283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 413283514Sarybchik epp->ep_mulcst_addr_list, 414283514Sarybchik epp->ep_mulcst_addr_count); 415283514Sarybchik 416283514Sarybchik if (rc != 0) 417283514Sarybchik goto fail1; 418283514Sarybchik 419283514Sarybchik return (0); 420283514Sarybchik 421283514Sarybchikfail1: 422291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 423283514Sarybchik 424293764Sarybchik ef10_filter_default_rxq_set(enp, old_rxq, old_using_rss); 425283514Sarybchik 426283514Sarybchik return (rc); 427283514Sarybchik} 428283514Sarybchik 429283514Sarybchik void 430294092Sarybchikef10_mac_filter_default_rxq_clear( 431283514Sarybchik __in efx_nic_t *enp) 432283514Sarybchik{ 433283514Sarybchik efx_port_t *epp = &(enp->en_port); 434283514Sarybchik 435293764Sarybchik ef10_filter_default_rxq_clear(enp); 436283514Sarybchik 437342511Sarybchik (void) efx_filter_reconfigure(enp, epp->ep_mac_addr, 438283514Sarybchik epp->ep_all_unicst, epp->ep_mulcst, 439283514Sarybchik epp->ep_all_mulcst, epp->ep_brdcst, 440283514Sarybchik epp->ep_mulcst_addr_list, 441283514Sarybchik epp->ep_mulcst_addr_count); 442283514Sarybchik} 443283514Sarybchik 444283514Sarybchik 445283514Sarybchik#if EFSYS_OPT_LOOPBACK 446283514Sarybchik 447291436Sarybchik __checkReturn efx_rc_t 448294092Sarybchikef10_mac_loopback_set( 449283514Sarybchik __in efx_nic_t *enp, 450283514Sarybchik __in efx_link_mode_t link_mode, 451283514Sarybchik __in efx_loopback_type_t loopback_type) 452283514Sarybchik{ 453283514Sarybchik efx_port_t *epp = &(enp->en_port); 454299517Sarybchik const efx_phy_ops_t *epop = epp->ep_epop; 455283514Sarybchik efx_loopback_type_t old_loopback_type; 456283514Sarybchik efx_link_mode_t old_loopback_link_mode; 457291436Sarybchik efx_rc_t rc; 458283514Sarybchik 459294092Sarybchik /* The PHY object handles this on EF10 */ 460283514Sarybchik old_loopback_type = epp->ep_loopback_type; 461283514Sarybchik old_loopback_link_mode = epp->ep_loopback_link_mode; 462283514Sarybchik epp->ep_loopback_type = loopback_type; 463283514Sarybchik epp->ep_loopback_link_mode = link_mode; 464283514Sarybchik 465283514Sarybchik if ((rc = epop->epo_reconfigure(enp)) != 0) 466283514Sarybchik goto fail1; 467283514Sarybchik 468283514Sarybchik return (0); 469283514Sarybchik 470283514Sarybchikfail1: 471291436Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 472283514Sarybchik 473283514Sarybchik epp->ep_loopback_type = old_loopback_type; 474283514Sarybchik epp->ep_loopback_link_mode = old_loopback_link_mode; 475283514Sarybchik 476283514Sarybchik return (rc); 477283514Sarybchik} 478283514Sarybchik 479283514Sarybchik#endif /* EFSYS_OPT_LOOPBACK */ 480283514Sarybchik 481283514Sarybchik#if EFSYS_OPT_MAC_STATS 482283514Sarybchik 483311080Sarybchik __checkReturn efx_rc_t 484311080Sarybchikef10_mac_stats_get_mask( 485311080Sarybchik __in efx_nic_t *enp, 486311080Sarybchik __inout_bcount(mask_size) uint32_t *maskp, 487311080Sarybchik __in size_t mask_size) 488311080Sarybchik{ 489311080Sarybchik const struct efx_mac_stats_range ef10_common[] = { 490311080Sarybchik { EFX_MAC_RX_OCTETS, EFX_MAC_RX_GE_15XX_PKTS }, 491311080Sarybchik { EFX_MAC_RX_FCS_ERRORS, EFX_MAC_RX_DROP_EVENTS }, 492311080Sarybchik { EFX_MAC_RX_JABBER_PKTS, EFX_MAC_RX_JABBER_PKTS }, 493311080Sarybchik { EFX_MAC_RX_NODESC_DROP_CNT, EFX_MAC_TX_PAUSE_PKTS }, 494311080Sarybchik }; 495311080Sarybchik const struct efx_mac_stats_range ef10_tx_size_bins[] = { 496311080Sarybchik { EFX_MAC_TX_LE_64_PKTS, EFX_MAC_TX_GE_15XX_PKTS }, 497311080Sarybchik }; 498311080Sarybchik efx_nic_cfg_t *encp = &(enp->en_nic_cfg); 499311080Sarybchik efx_port_t *epp = &(enp->en_port); 500311080Sarybchik efx_rc_t rc; 501311080Sarybchik 502311080Sarybchik if ((rc = efx_mac_stats_mask_add_ranges(maskp, mask_size, 503311080Sarybchik ef10_common, EFX_ARRAY_SIZE(ef10_common))) != 0) 504311080Sarybchik goto fail1; 505311080Sarybchik 506311080Sarybchik if (epp->ep_phy_cap_mask & (1 << MC_CMD_PHY_CAP_40000FDX_LBN)) { 507311080Sarybchik const struct efx_mac_stats_range ef10_40g_extra[] = { 508311080Sarybchik { EFX_MAC_RX_ALIGN_ERRORS, EFX_MAC_RX_ALIGN_ERRORS }, 509311080Sarybchik }; 510311080Sarybchik 511311080Sarybchik if ((rc = efx_mac_stats_mask_add_ranges(maskp, mask_size, 512311080Sarybchik ef10_40g_extra, EFX_ARRAY_SIZE(ef10_40g_extra))) != 0) 513311080Sarybchik goto fail2; 514311080Sarybchik 515311080Sarybchik if (encp->enc_mac_stats_40g_tx_size_bins) { 516311080Sarybchik if ((rc = efx_mac_stats_mask_add_ranges(maskp, 517311080Sarybchik mask_size, ef10_tx_size_bins, 518311080Sarybchik EFX_ARRAY_SIZE(ef10_tx_size_bins))) != 0) 519311080Sarybchik goto fail3; 520311080Sarybchik } 521311080Sarybchik } else { 522311080Sarybchik if ((rc = efx_mac_stats_mask_add_ranges(maskp, mask_size, 523311080Sarybchik ef10_tx_size_bins, EFX_ARRAY_SIZE(ef10_tx_size_bins))) != 0) 524311080Sarybchik goto fail4; 525311080Sarybchik } 526311080Sarybchik 527311080Sarybchik if (encp->enc_pm_and_rxdp_counters) { 528311080Sarybchik const struct efx_mac_stats_range ef10_pm_and_rxdp[] = { 529311080Sarybchik { EFX_MAC_PM_TRUNC_BB_OVERFLOW, EFX_MAC_RXDP_HLB_WAIT }, 530311080Sarybchik }; 531311080Sarybchik 532311080Sarybchik if ((rc = efx_mac_stats_mask_add_ranges(maskp, mask_size, 533311080Sarybchik ef10_pm_and_rxdp, EFX_ARRAY_SIZE(ef10_pm_and_rxdp))) != 0) 534311080Sarybchik goto fail5; 535311080Sarybchik } 536311080Sarybchik 537311080Sarybchik if (encp->enc_datapath_cap_evb) { 538311080Sarybchik const struct efx_mac_stats_range ef10_vadaptor[] = { 539311080Sarybchik { EFX_MAC_VADAPTER_RX_UNICAST_PACKETS, 540311080Sarybchik EFX_MAC_VADAPTER_TX_OVERFLOW }, 541311080Sarybchik }; 542311080Sarybchik 543311080Sarybchik if ((rc = efx_mac_stats_mask_add_ranges(maskp, mask_size, 544311080Sarybchik ef10_vadaptor, EFX_ARRAY_SIZE(ef10_vadaptor))) != 0) 545311080Sarybchik goto fail6; 546311080Sarybchik } 547311080Sarybchik 548311080Sarybchik return (0); 549311080Sarybchik 550311080Sarybchikfail6: 551311080Sarybchik EFSYS_PROBE(fail6); 552311080Sarybchikfail5: 553311080Sarybchik EFSYS_PROBE(fail5); 554311080Sarybchikfail4: 555311080Sarybchik EFSYS_PROBE(fail4); 556311080Sarybchikfail3: 557311080Sarybchik EFSYS_PROBE(fail3); 558311080Sarybchikfail2: 559311080Sarybchik EFSYS_PROBE(fail2); 560311080Sarybchikfail1: 561311080Sarybchik EFSYS_PROBE1(fail1, efx_rc_t, rc); 562311080Sarybchik 563311080Sarybchik return (rc); 564311080Sarybchik} 565311080Sarybchik 566294092Sarybchik#define EF10_MAC_STAT_READ(_esmp, _field, _eqp) \ 567283514Sarybchik EFSYS_MEM_READQ((_esmp), (_field) * sizeof (efx_qword_t), _eqp) 568283514Sarybchik 569283514Sarybchik 570291436Sarybchik __checkReturn efx_rc_t 571294092Sarybchikef10_mac_stats_update( 572283514Sarybchik __in efx_nic_t *enp, 573283514Sarybchik __in efsys_mem_t *esmp, 574291395Sarybchik __inout_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat, 575291397Sarybchik __inout_opt uint32_t *generationp) 576283514Sarybchik{ 577283514Sarybchik efx_qword_t value; 578283514Sarybchik efx_qword_t generation_start; 579283514Sarybchik efx_qword_t generation_end; 580283514Sarybchik 581283514Sarybchik _NOTE(ARGUNUSED(enp)) 582283514Sarybchik 583283514Sarybchik /* Read END first so we don't race with the MC */ 584283514Sarybchik EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFX_MAC_STATS_SIZE); 585294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_GENERATION_END, 586283514Sarybchik &generation_end); 587283514Sarybchik EFSYS_MEM_READ_BARRIER(); 588283514Sarybchik 589283514Sarybchik /* TX */ 590294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_PKTS, &value); 591283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_PKTS]), &value); 592283514Sarybchik 593294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_CONTROL_PKTS, &value); 594283514Sarybchik EFSYS_STAT_SUBR_QWORD(&(stat[EFX_MAC_TX_PKTS]), &value); 595283514Sarybchik 596294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_PAUSE_PKTS, &value); 597283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_PAUSE_PKTS]), &value); 598283514Sarybchik 599294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_UNICAST_PKTS, &value); 600283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_UNICST_PKTS]), &value); 601283514Sarybchik 602294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_MULTICAST_PKTS, &value); 603283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_MULTICST_PKTS]), &value); 604283514Sarybchik 605294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BROADCAST_PKTS, &value); 606283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_BRDCST_PKTS]), &value); 607283514Sarybchik 608294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BYTES, &value); 609283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_OCTETS]), &value); 610283514Sarybchik 611294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_LT64_PKTS, &value); 612283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_LE_64_PKTS]), &value); 613294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_64_PKTS, &value); 614342519Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_TX_LE_64_PKTS]), &value); 615283514Sarybchik 616294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_65_TO_127_PKTS, &value); 617283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_65_TO_127_PKTS]), &value); 618283514Sarybchik 619294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_128_TO_255_PKTS, &value); 620283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_128_TO_255_PKTS]), &value); 621283514Sarybchik 622294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_256_TO_511_PKTS, &value); 623283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_256_TO_511_PKTS]), &value); 624283514Sarybchik 625294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_512_TO_1023_PKTS, &value); 626283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_512_TO_1023_PKTS]), &value); 627283514Sarybchik 628294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_1024_TO_15XX_PKTS, &value); 629283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_1024_TO_15XX_PKTS]), &value); 630283514Sarybchik 631294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_15XX_TO_JUMBO_PKTS, &value); 632283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_GE_15XX_PKTS]), &value); 633294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_GTJUMBO_PKTS, &value); 634283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_TX_GE_15XX_PKTS]), &value); 635283514Sarybchik 636294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_BAD_FCS_PKTS, &value); 637283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_ERRORS]), &value); 638283514Sarybchik 639294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_SINGLE_COLLISION_PKTS, &value); 640283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_SGL_COL_PKTS]), &value); 641283514Sarybchik 642294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_MULTIPLE_COLLISION_PKTS, 643283514Sarybchik &value); 644283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_MULT_COL_PKTS]), &value); 645283514Sarybchik 646294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_EXCESSIVE_COLLISION_PKTS, 647283514Sarybchik &value); 648283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_EX_COL_PKTS]), &value); 649283514Sarybchik 650294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_LATE_COLLISION_PKTS, &value); 651283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_LATE_COL_PKTS]), &value); 652283514Sarybchik 653294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_DEFERRED_PKTS, &value); 654283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_DEF_PKTS]), &value); 655283514Sarybchik 656294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_TX_EXCESSIVE_DEFERRED_PKTS, 657283514Sarybchik &value); 658283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_TX_EX_DEF_PKTS]), &value); 659283514Sarybchik 660283514Sarybchik /* RX */ 661294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BYTES, &value); 662283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_OCTETS]), &value); 663283514Sarybchik 664294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_PKTS, &value); 665283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_PKTS]), &value); 666283514Sarybchik 667294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_UNICAST_PKTS, &value); 668283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_UNICST_PKTS]), &value); 669283514Sarybchik 670294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_MULTICAST_PKTS, &value); 671283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_MULTICST_PKTS]), &value); 672283514Sarybchik 673294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BROADCAST_PKTS, &value); 674283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_BRDCST_PKTS]), &value); 675283514Sarybchik 676294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_PAUSE_PKTS, &value); 677283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_PAUSE_PKTS]), &value); 678283514Sarybchik 679294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_UNDERSIZE_PKTS, &value); 680283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_LE_64_PKTS]), &value); 681294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_64_PKTS, &value); 682283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_RX_LE_64_PKTS]), &value); 683283514Sarybchik 684294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_65_TO_127_PKTS, &value); 685283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_65_TO_127_PKTS]), &value); 686283514Sarybchik 687294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_128_TO_255_PKTS, &value); 688283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_128_TO_255_PKTS]), &value); 689283514Sarybchik 690294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_256_TO_511_PKTS, &value); 691283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_256_TO_511_PKTS]), &value); 692283514Sarybchik 693294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_512_TO_1023_PKTS, &value); 694283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_512_TO_1023_PKTS]), &value); 695283514Sarybchik 696294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_1024_TO_15XX_PKTS, &value); 697283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_1024_TO_15XX_PKTS]), &value); 698283514Sarybchik 699294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_15XX_TO_JUMBO_PKTS, &value); 700283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_GE_15XX_PKTS]), &value); 701294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_GTJUMBO_PKTS, &value); 702283514Sarybchik EFSYS_STAT_INCR_QWORD(&(stat[EFX_MAC_RX_GE_15XX_PKTS]), &value); 703283514Sarybchik 704294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_BAD_FCS_PKTS, &value); 705283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_FCS_ERRORS]), &value); 706283514Sarybchik 707294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_OVERFLOW_PKTS, &value); 708283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_DROP_EVENTS]), &value); 709283514Sarybchik 710294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_FALSE_CARRIER_PKTS, &value); 711283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_FALSE_CARRIER_ERRORS]), &value); 712283514Sarybchik 713294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_SYMBOL_ERROR_PKTS, &value); 714283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_SYMBOL_ERRORS]), &value); 715283514Sarybchik 716294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_ALIGN_ERROR_PKTS, &value); 717283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_ALIGN_ERRORS]), &value); 718283514Sarybchik 719294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_INTERNAL_ERROR_PKTS, &value); 720283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_INTERNAL_ERRORS]), &value); 721283514Sarybchik 722294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_JABBER_PKTS, &value); 723283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_JABBER_PKTS]), &value); 724283514Sarybchik 725294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES01_CHAR_ERR, &value); 726283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE0_CHAR_ERR]), 727283514Sarybchik &(value.eq_dword[0])); 728283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE1_CHAR_ERR]), 729283514Sarybchik &(value.eq_dword[1])); 730283514Sarybchik 731294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES23_CHAR_ERR, &value); 732283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE2_CHAR_ERR]), 733283514Sarybchik &(value.eq_dword[0])); 734283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE3_CHAR_ERR]), 735283514Sarybchik &(value.eq_dword[1])); 736283514Sarybchik 737294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES01_DISP_ERR, &value); 738283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE0_DISP_ERR]), 739283514Sarybchik &(value.eq_dword[0])); 740283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE1_DISP_ERR]), 741283514Sarybchik &(value.eq_dword[1])); 742283514Sarybchik 743294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_LANES23_DISP_ERR, &value); 744283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE2_DISP_ERR]), 745283514Sarybchik &(value.eq_dword[0])); 746283514Sarybchik EFSYS_STAT_SET_DWORD(&(stat[EFX_MAC_RX_LANE3_DISP_ERR]), 747283514Sarybchik &(value.eq_dword[1])); 748283514Sarybchik 749294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_MATCH_FAULT, &value); 750283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_MATCH_FAULT]), &value); 751283514Sarybchik 752294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RX_NODESC_DROPS, &value); 753283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RX_NODESC_DROP_CNT]), &value); 754283514Sarybchik 755283514Sarybchik /* Packet memory (EF10 only) */ 756294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_BB_OVERFLOW, &value); 757283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_BB_OVERFLOW]), &value); 758283514Sarybchik 759294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_BB_OVERFLOW, &value); 760283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_BB_OVERFLOW]), &value); 761283514Sarybchik 762294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_VFIFO_FULL, &value); 763283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_VFIFO_FULL]), &value); 764283514Sarybchik 765294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_VFIFO_FULL, &value); 766283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_VFIFO_FULL]), &value); 767283514Sarybchik 768294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_TRUNC_QBB, &value); 769283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_TRUNC_QBB]), &value); 770283514Sarybchik 771294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_QBB, &value); 772283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_QBB]), &value); 773283514Sarybchik 774294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_PM_DISCARD_MAPPING, &value); 775283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_PM_DISCARD_MAPPING]), &value); 776283514Sarybchik 777283514Sarybchik /* RX datapath */ 778294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_Q_DISABLED_PKTS, &value); 779283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_Q_DISABLED_PKTS]), &value); 780283514Sarybchik 781294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_DI_DROPPED_PKTS, &value); 782283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_DI_DROPPED_PKTS]), &value); 783283514Sarybchik 784294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_STREAMING_PKTS, &value); 785283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_STREAMING_PKTS]), &value); 786283514Sarybchik 787294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_HLB_FETCH_CONDITIONS, &value); 788283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_HLB_FETCH]), &value); 789283514Sarybchik 790294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_RXDP_HLB_WAIT_CONDITIONS, &value); 791283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_RXDP_HLB_WAIT]), &value); 792283514Sarybchik 793283514Sarybchik 794283514Sarybchik /* VADAPTER RX */ 795294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_UNICAST_PACKETS, 796283514Sarybchik &value); 797283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_UNICAST_PACKETS]), 798283514Sarybchik &value); 799283514Sarybchik 800294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_UNICAST_BYTES, 801283514Sarybchik &value); 802283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_UNICAST_BYTES]), 803283514Sarybchik &value); 804283514Sarybchik 805294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_MULTICAST_PACKETS, 806283514Sarybchik &value); 807283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_MULTICAST_PACKETS]), 808283514Sarybchik &value); 809283514Sarybchik 810294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_MULTICAST_BYTES, 811283514Sarybchik &value); 812283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_MULTICAST_BYTES]), 813283514Sarybchik &value); 814283514Sarybchik 815294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BROADCAST_PACKETS, 816283514Sarybchik &value); 817283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BROADCAST_PACKETS]), 818283514Sarybchik &value); 819283514Sarybchik 820294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BROADCAST_BYTES, 821283514Sarybchik &value); 822283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BROADCAST_BYTES]), 823283514Sarybchik &value); 824283514Sarybchik 825294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BAD_PACKETS, 826283514Sarybchik &value); 827283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BAD_PACKETS]), 828283514Sarybchik &value); 829283514Sarybchik 830294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_BAD_BYTES, &value); 831283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_BAD_BYTES]), &value); 832283514Sarybchik 833294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_RX_OVERFLOW, &value); 834283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_RX_OVERFLOW]), &value); 835283514Sarybchik 836283514Sarybchik /* VADAPTER TX */ 837294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_UNICAST_PACKETS, 838283514Sarybchik &value); 839283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_UNICAST_PACKETS]), 840283514Sarybchik &value); 841283514Sarybchik 842294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_UNICAST_BYTES, 843283514Sarybchik &value); 844283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_UNICAST_BYTES]), 845283514Sarybchik &value); 846283514Sarybchik 847294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_MULTICAST_PACKETS, 848283514Sarybchik &value); 849283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_MULTICAST_PACKETS]), 850283514Sarybchik &value); 851283514Sarybchik 852294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_MULTICAST_BYTES, 853283514Sarybchik &value); 854283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_MULTICAST_BYTES]), 855283514Sarybchik &value); 856283514Sarybchik 857294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BROADCAST_PACKETS, 858283514Sarybchik &value); 859283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BROADCAST_PACKETS]), 860283514Sarybchik &value); 861283514Sarybchik 862294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BROADCAST_BYTES, 863283514Sarybchik &value); 864283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BROADCAST_BYTES]), 865283514Sarybchik &value); 866283514Sarybchik 867294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BAD_PACKETS, &value); 868283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BAD_PACKETS]), &value); 869283514Sarybchik 870294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_BAD_BYTES, &value); 871283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_BAD_BYTES]), &value); 872283514Sarybchik 873294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_VADAPTER_TX_OVERFLOW, &value); 874283514Sarybchik EFSYS_STAT_SET_QWORD(&(stat[EFX_MAC_VADAPTER_TX_OVERFLOW]), &value); 875283514Sarybchik 876283514Sarybchik 877283514Sarybchik EFSYS_DMA_SYNC_FOR_KERNEL(esmp, 0, EFX_MAC_STATS_SIZE); 878283514Sarybchik EFSYS_MEM_READ_BARRIER(); 879294092Sarybchik EF10_MAC_STAT_READ(esmp, MC_CMD_MAC_GENERATION_START, 880283514Sarybchik &generation_start); 881283514Sarybchik 882283514Sarybchik /* Check that we didn't read the stats in the middle of a DMA */ 883283514Sarybchik /* Not a good enough check ? */ 884283514Sarybchik if (memcmp(&generation_start, &generation_end, 885283514Sarybchik sizeof (generation_start))) 886283514Sarybchik return (EAGAIN); 887283514Sarybchik 888283514Sarybchik if (generationp) 889283514Sarybchik *generationp = EFX_QWORD_FIELD(generation_start, EFX_DWORD_0); 890283514Sarybchik 891283514Sarybchik return (0); 892283514Sarybchik} 893283514Sarybchik 894283514Sarybchik#endif /* EFSYS_OPT_MAC_STATS */ 895283514Sarybchik 896299599Sarybchik#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */ 897