1227569Sphilip/*- 2284555Sarybchik * Copyright (c) 2006-2015 Solarflare Communications Inc. 3284555Sarybchik * All rights reserved. 4227569Sphilip * 5227569Sphilip * Redistribution and use in source and binary forms, with or without 6284555Sarybchik * modification, are permitted provided that the following conditions are met: 7227569Sphilip * 8284555Sarybchik * 1. Redistributions of source code must retain the above copyright notice, 9284555Sarybchik * this list of conditions and the following disclaimer. 10284555Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice, 11284555Sarybchik * this list of conditions and the following disclaimer in the documentation 12284555Sarybchik * and/or other materials provided with the distribution. 13228078Sphilip * 14284555Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15284555Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 16284555Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17284555Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 18284555Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19284555Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20284555Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21284555Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22284555Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23284555Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 24284555Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25284555Sarybchik * 26284555Sarybchik * The views and conclusions contained in the software and documentation are 27284555Sarybchik * those of the authors and should not be interpreted as representing official 28284555Sarybchik * policies, either expressed or implied, of the FreeBSD Project. 29284555Sarybchik * 30228078Sphilip * $FreeBSD: releng/10.3/sys/dev/sfxge/common/efx.h 295526 2016-02-11 16:39:30Z arybchik $ 31227569Sphilip */ 32227569Sphilip 33227569Sphilip#ifndef _SYS_EFX_H 34227569Sphilip#define _SYS_EFX_H 35227569Sphilip 36227569Sphilip#include "efsys.h" 37284555Sarybchik#include "efx_phy_ids.h" 38227569Sphilip 39227569Sphilip#ifdef __cplusplus 40227569Sphilipextern "C" { 41227569Sphilip#endif 42227569Sphilip 43293927Sarybchik#define EFX_STATIC_ASSERT(_cond) \ 44293927Sarybchik ((void)sizeof(char[(_cond) ? 1 : -1])) 45227569Sphilip 46293927Sarybchik#define EFX_ARRAY_SIZE(_array) \ 47293927Sarybchik (sizeof(_array) / sizeof((_array)[0])) 48227569Sphilip 49293927Sarybchik#define EFX_FIELD_OFFSET(_type, _field) \ 50293927Sarybchik ((size_t) &(((_type *)0)->_field)) 51227569Sphilip 52293927Sarybchik/* Return codes */ 53293927Sarybchik 54293927Sarybchiktypedef __success(return == 0) int efx_rc_t; 55293927Sarybchik 56293927Sarybchik 57293927Sarybchik/* Chip families */ 58293927Sarybchik 59227569Sphiliptypedef enum efx_family_e { 60227569Sphilip EFX_FAMILY_INVALID, 61227569Sphilip EFX_FAMILY_FALCON, 62227569Sphilip EFX_FAMILY_SIENA, 63284555Sarybchik EFX_FAMILY_HUNTINGTON, 64293975Sarybchik EFX_FAMILY_MEDFORD, 65227569Sphilip EFX_FAMILY_NTYPES 66227569Sphilip} efx_family_t; 67227569Sphilip 68293927Sarybchikextern __checkReturn efx_rc_t 69227569Sphilipefx_family( 70227569Sphilip __in uint16_t venid, 71227569Sphilip __in uint16_t devid, 72227569Sphilip __out efx_family_t *efp); 73227569Sphilip 74293927Sarybchikextern __checkReturn efx_rc_t 75227569Sphilipefx_infer_family( 76227569Sphilip __in efsys_bar_t *esbp, 77227569Sphilip __out efx_family_t *efp); 78227569Sphilip 79284555Sarybchik#define EFX_PCI_VENID_SFC 0x1924 80227569Sphilip 81284555Sarybchik#define EFX_PCI_DEVID_FALCON 0x0710 /* SFC4000 */ 82284555Sarybchik 83284555Sarybchik#define EFX_PCI_DEVID_BETHPAGE 0x0803 /* SFC9020 */ 84284555Sarybchik#define EFX_PCI_DEVID_SIENA 0x0813 /* SFL9021 */ 85284555Sarybchik#define EFX_PCI_DEVID_SIENA_F1_UNINIT 0x0810 86284555Sarybchik 87284555Sarybchik#define EFX_PCI_DEVID_HUNTINGTON_PF_UNINIT 0x0901 88284555Sarybchik#define EFX_PCI_DEVID_FARMINGDALE 0x0903 /* SFC9120 PF */ 89284555Sarybchik#define EFX_PCI_DEVID_GREENPORT 0x0923 /* SFC9140 PF */ 90284555Sarybchik 91284555Sarybchik#define EFX_PCI_DEVID_FARMINGDALE_VF 0x1903 /* SFC9120 VF */ 92284555Sarybchik#define EFX_PCI_DEVID_GREENPORT_VF 0x1923 /* SFC9140 VF */ 93284555Sarybchik 94293975Sarybchik#define EFX_PCI_DEVID_MEDFORD_PF_UNINIT 0x0913 95293975Sarybchik#define EFX_PCI_DEVID_MEDFORD 0x0A03 /* SFC9240 PF */ 96293975Sarybchik#define EFX_PCI_DEVID_MEDFORD_VF 0x1A03 /* SFC9240 VF */ 97284555Sarybchik 98227569Sphilip#define EFX_MEM_BAR 2 99227569Sphilip 100227569Sphilip/* Error codes */ 101227569Sphilip 102227569Sphilipenum { 103227569Sphilip EFX_ERR_INVALID, 104227569Sphilip EFX_ERR_SRAM_OOB, 105227569Sphilip EFX_ERR_BUFID_DC_OOB, 106227569Sphilip EFX_ERR_MEM_PERR, 107227569Sphilip EFX_ERR_RBUF_OWN, 108227569Sphilip EFX_ERR_TBUF_OWN, 109227569Sphilip EFX_ERR_RDESQ_OWN, 110227569Sphilip EFX_ERR_TDESQ_OWN, 111227569Sphilip EFX_ERR_EVQ_OWN, 112227569Sphilip EFX_ERR_EVFF_OFLO, 113227569Sphilip EFX_ERR_ILL_ADDR, 114227569Sphilip EFX_ERR_SRAM_PERR, 115227569Sphilip EFX_ERR_NCODES 116227569Sphilip}; 117227569Sphilip 118284555Sarybchik/* Calculate the IEEE 802.3 CRC32 of a MAC addr */ 119284555Sarybchikextern __checkReturn uint32_t 120284555Sarybchikefx_crc32_calculate( 121284555Sarybchik __in uint32_t crc_init, 122284555Sarybchik __in_ecount(length) uint8_t const *input, 123284555Sarybchik __in int length); 124284555Sarybchik 125284555Sarybchik 126284555Sarybchik/* Type prototypes */ 127284555Sarybchik 128284555Sarybchiktypedef struct efx_rxq_s efx_rxq_t; 129284555Sarybchik 130227569Sphilip/* NIC */ 131227569Sphilip 132227569Sphiliptypedef struct efx_nic_s efx_nic_t; 133227569Sphilip 134284555Sarybchik#define EFX_NIC_FUNC_PRIMARY 0x00000001 135284555Sarybchik#define EFX_NIC_FUNC_LINKCTRL 0x00000002 136284555Sarybchik#define EFX_NIC_FUNC_TRUSTED 0x00000004 137284555Sarybchik 138284555Sarybchik 139293927Sarybchikextern __checkReturn efx_rc_t 140227569Sphilipefx_nic_create( 141227569Sphilip __in efx_family_t family, 142227569Sphilip __in efsys_identifier_t *esip, 143227569Sphilip __in efsys_bar_t *esbp, 144227569Sphilip __in efsys_lock_t *eslp, 145227569Sphilip __deref_out efx_nic_t **enpp); 146227569Sphilip 147293927Sarybchikextern __checkReturn efx_rc_t 148227569Sphilipefx_nic_probe( 149227569Sphilip __in efx_nic_t *enp); 150227569Sphilip 151227569Sphilip#if EFSYS_OPT_PCIE_TUNE 152227569Sphilip 153293927Sarybchikextern __checkReturn efx_rc_t 154227569Sphilipefx_nic_pcie_tune( 155227569Sphilip __in efx_nic_t *enp, 156227569Sphilip unsigned int nlanes); 157227569Sphilip 158293927Sarybchikextern __checkReturn efx_rc_t 159227569Sphilipefx_nic_pcie_extended_sync( 160227569Sphilip __in efx_nic_t *enp); 161227569Sphilip 162227569Sphilip#endif /* EFSYS_OPT_PCIE_TUNE */ 163227569Sphilip 164293927Sarybchikextern __checkReturn efx_rc_t 165227569Sphilipefx_nic_init( 166227569Sphilip __in efx_nic_t *enp); 167227569Sphilip 168293927Sarybchikextern __checkReturn efx_rc_t 169227569Sphilipefx_nic_reset( 170227569Sphilip __in efx_nic_t *enp); 171227569Sphilip 172227569Sphilip#if EFSYS_OPT_DIAG 173227569Sphilip 174293927Sarybchikextern __checkReturn efx_rc_t 175227569Sphilipefx_nic_register_test( 176227569Sphilip __in efx_nic_t *enp); 177227569Sphilip 178227569Sphilip#endif /* EFSYS_OPT_DIAG */ 179227569Sphilip 180227569Sphilipextern void 181227569Sphilipefx_nic_fini( 182227569Sphilip __in efx_nic_t *enp); 183227569Sphilip 184227569Sphilipextern void 185227569Sphilipefx_nic_unprobe( 186227569Sphilip __in efx_nic_t *enp); 187227569Sphilip 188227569Sphilipextern void 189227569Sphilipefx_nic_destroy( 190227569Sphilip __in efx_nic_t *enp); 191227569Sphilip 192227569Sphilip#if EFSYS_OPT_MCDI 193227569Sphilip 194293976Sarybchik#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD 195293976Sarybchik/* Huntington and Medford require MCDIv2 commands */ 196284555Sarybchik#define WITH_MCDI_V2 1 197284555Sarybchik#endif 198284555Sarybchik 199227569Sphiliptypedef struct efx_mcdi_req_s efx_mcdi_req_t; 200227569Sphilip 201227569Sphiliptypedef enum efx_mcdi_exception_e { 202227569Sphilip EFX_MCDI_EXCEPTION_MC_REBOOT, 203227569Sphilip EFX_MCDI_EXCEPTION_MC_BADASSERT, 204227569Sphilip} efx_mcdi_exception_t; 205227569Sphilip 206293939Sarybchik#if EFSYS_OPT_MCDI_LOGGING 207293939Sarybchiktypedef enum efx_log_msg_e 208293939Sarybchik{ 209293939Sarybchik EFX_LOG_INVALID, 210293939Sarybchik EFX_LOG_MCDI_REQUEST, 211293939Sarybchik EFX_LOG_MCDI_RESPONSE, 212293939Sarybchik} efx_log_msg_t; 213293939Sarybchik#endif /* EFSYS_OPT_MCDI_LOGGING */ 214293939Sarybchik 215227569Sphiliptypedef struct efx_mcdi_transport_s { 216227569Sphilip void *emt_context; 217284555Sarybchik efsys_mem_t *emt_dma_mem; 218227569Sphilip void (*emt_execute)(void *, efx_mcdi_req_t *); 219227569Sphilip void (*emt_ev_cpl)(void *); 220227569Sphilip void (*emt_exception)(void *, efx_mcdi_exception_t); 221293939Sarybchik#if EFSYS_OPT_MCDI_LOGGING 222293939Sarybchik void (*emt_logger)(void *, efx_log_msg_t, 223293939Sarybchik void *, size_t, void *, size_t); 224293939Sarybchik#endif /* EFSYS_OPT_MCDI_LOGGING */ 225293963Sarybchik#if EFSYS_OPT_MCDI_PROXY_AUTH 226293963Sarybchik void (*emt_ev_proxy_response)(void *, uint32_t, efx_rc_t); 227293963Sarybchik#endif /* EFSYS_OPT_MCDI_PROXY_AUTH */ 228227569Sphilip} efx_mcdi_transport_t; 229227569Sphilip 230293927Sarybchikextern __checkReturn efx_rc_t 231227569Sphilipefx_mcdi_init( 232227569Sphilip __in efx_nic_t *enp, 233227569Sphilip __in const efx_mcdi_transport_t *mtp); 234227569Sphilip 235293927Sarybchikextern __checkReturn efx_rc_t 236227569Sphilipefx_mcdi_reboot( 237227569Sphilip __in efx_nic_t *enp); 238227569Sphilip 239284555Sarybchik void 240284555Sarybchikefx_mcdi_new_epoch( 241284555Sarybchik __in efx_nic_t *enp); 242284555Sarybchik 243227569Sphilipextern void 244227569Sphilipefx_mcdi_request_start( 245227569Sphilip __in efx_nic_t *enp, 246227569Sphilip __in efx_mcdi_req_t *emrp, 247227569Sphilip __in boolean_t ev_cpl); 248227569Sphilip 249227569Sphilipextern __checkReturn boolean_t 250227569Sphilipefx_mcdi_request_poll( 251227569Sphilip __in efx_nic_t *enp); 252227569Sphilip 253227569Sphilipextern __checkReturn boolean_t 254227569Sphilipefx_mcdi_request_abort( 255227569Sphilip __in efx_nic_t *enp); 256227569Sphilip 257227569Sphilipextern void 258227569Sphilipefx_mcdi_fini( 259227569Sphilip __in efx_nic_t *enp); 260227569Sphilip 261227569Sphilip#endif /* EFSYS_OPT_MCDI */ 262227569Sphilip 263227569Sphilip/* INTR */ 264227569Sphilip 265227569Sphilip#define EFX_NINTR_FALCON 64 266227569Sphilip#define EFX_NINTR_SIENA 1024 267227569Sphilip 268227569Sphiliptypedef enum efx_intr_type_e { 269227569Sphilip EFX_INTR_INVALID = 0, 270227569Sphilip EFX_INTR_LINE, 271227569Sphilip EFX_INTR_MESSAGE, 272227569Sphilip EFX_INTR_NTYPES 273227569Sphilip} efx_intr_type_t; 274227569Sphilip 275227569Sphilip#define EFX_INTR_SIZE (sizeof (efx_oword_t)) 276227569Sphilip 277293927Sarybchikextern __checkReturn efx_rc_t 278227569Sphilipefx_intr_init( 279227569Sphilip __in efx_nic_t *enp, 280227569Sphilip __in efx_intr_type_t type, 281227569Sphilip __in efsys_mem_t *esmp); 282227569Sphilip 283227569Sphilipextern void 284227569Sphilipefx_intr_enable( 285227569Sphilip __in efx_nic_t *enp); 286227569Sphilip 287227569Sphilipextern void 288227569Sphilipefx_intr_disable( 289227569Sphilip __in efx_nic_t *enp); 290227569Sphilip 291227569Sphilipextern void 292227569Sphilipefx_intr_disable_unlocked( 293227569Sphilip __in efx_nic_t *enp); 294227569Sphilip 295227569Sphilip#define EFX_INTR_NEVQS 32 296227569Sphilip 297293927Sarybchikextern __checkReturn efx_rc_t 298227569Sphilipefx_intr_trigger( 299227569Sphilip __in efx_nic_t *enp, 300227569Sphilip __in unsigned int level); 301227569Sphilip 302227569Sphilipextern void 303227569Sphilipefx_intr_status_line( 304227569Sphilip __in efx_nic_t *enp, 305227569Sphilip __out boolean_t *fatalp, 306227569Sphilip __out uint32_t *maskp); 307227569Sphilip 308227569Sphilipextern void 309227569Sphilipefx_intr_status_message( 310227569Sphilip __in efx_nic_t *enp, 311227569Sphilip __in unsigned int message, 312227569Sphilip __out boolean_t *fatalp); 313227569Sphilip 314227569Sphilipextern void 315227569Sphilipefx_intr_fatal( 316227569Sphilip __in efx_nic_t *enp); 317227569Sphilip 318227569Sphilipextern void 319227569Sphilipefx_intr_fini( 320227569Sphilip __in efx_nic_t *enp); 321227569Sphilip 322227569Sphilip/* MAC */ 323227569Sphilip 324227569Sphilip#if EFSYS_OPT_MAC_STATS 325227569Sphilip 326284555Sarybchik/* START MKCONFIG GENERATED EfxHeaderMacBlock e323546097fd7c65 */ 327227569Sphiliptypedef enum efx_mac_stat_e { 328227569Sphilip EFX_MAC_RX_OCTETS, 329227569Sphilip EFX_MAC_RX_PKTS, 330227569Sphilip EFX_MAC_RX_UNICST_PKTS, 331227569Sphilip EFX_MAC_RX_MULTICST_PKTS, 332227569Sphilip EFX_MAC_RX_BRDCST_PKTS, 333227569Sphilip EFX_MAC_RX_PAUSE_PKTS, 334227569Sphilip EFX_MAC_RX_LE_64_PKTS, 335227569Sphilip EFX_MAC_RX_65_TO_127_PKTS, 336227569Sphilip EFX_MAC_RX_128_TO_255_PKTS, 337227569Sphilip EFX_MAC_RX_256_TO_511_PKTS, 338227569Sphilip EFX_MAC_RX_512_TO_1023_PKTS, 339227569Sphilip EFX_MAC_RX_1024_TO_15XX_PKTS, 340227569Sphilip EFX_MAC_RX_GE_15XX_PKTS, 341227569Sphilip EFX_MAC_RX_ERRORS, 342227569Sphilip EFX_MAC_RX_FCS_ERRORS, 343227569Sphilip EFX_MAC_RX_DROP_EVENTS, 344227569Sphilip EFX_MAC_RX_FALSE_CARRIER_ERRORS, 345227569Sphilip EFX_MAC_RX_SYMBOL_ERRORS, 346227569Sphilip EFX_MAC_RX_ALIGN_ERRORS, 347227569Sphilip EFX_MAC_RX_INTERNAL_ERRORS, 348227569Sphilip EFX_MAC_RX_JABBER_PKTS, 349227569Sphilip EFX_MAC_RX_LANE0_CHAR_ERR, 350227569Sphilip EFX_MAC_RX_LANE1_CHAR_ERR, 351227569Sphilip EFX_MAC_RX_LANE2_CHAR_ERR, 352227569Sphilip EFX_MAC_RX_LANE3_CHAR_ERR, 353227569Sphilip EFX_MAC_RX_LANE0_DISP_ERR, 354227569Sphilip EFX_MAC_RX_LANE1_DISP_ERR, 355227569Sphilip EFX_MAC_RX_LANE2_DISP_ERR, 356227569Sphilip EFX_MAC_RX_LANE3_DISP_ERR, 357227569Sphilip EFX_MAC_RX_MATCH_FAULT, 358227569Sphilip EFX_MAC_RX_NODESC_DROP_CNT, 359227569Sphilip EFX_MAC_TX_OCTETS, 360227569Sphilip EFX_MAC_TX_PKTS, 361227569Sphilip EFX_MAC_TX_UNICST_PKTS, 362227569Sphilip EFX_MAC_TX_MULTICST_PKTS, 363227569Sphilip EFX_MAC_TX_BRDCST_PKTS, 364227569Sphilip EFX_MAC_TX_PAUSE_PKTS, 365227569Sphilip EFX_MAC_TX_LE_64_PKTS, 366227569Sphilip EFX_MAC_TX_65_TO_127_PKTS, 367227569Sphilip EFX_MAC_TX_128_TO_255_PKTS, 368227569Sphilip EFX_MAC_TX_256_TO_511_PKTS, 369227569Sphilip EFX_MAC_TX_512_TO_1023_PKTS, 370227569Sphilip EFX_MAC_TX_1024_TO_15XX_PKTS, 371227569Sphilip EFX_MAC_TX_GE_15XX_PKTS, 372227569Sphilip EFX_MAC_TX_ERRORS, 373227569Sphilip EFX_MAC_TX_SGL_COL_PKTS, 374227569Sphilip EFX_MAC_TX_MULT_COL_PKTS, 375227569Sphilip EFX_MAC_TX_EX_COL_PKTS, 376227569Sphilip EFX_MAC_TX_LATE_COL_PKTS, 377227569Sphilip EFX_MAC_TX_DEF_PKTS, 378227569Sphilip EFX_MAC_TX_EX_DEF_PKTS, 379284555Sarybchik EFX_MAC_PM_TRUNC_BB_OVERFLOW, 380284555Sarybchik EFX_MAC_PM_DISCARD_BB_OVERFLOW, 381284555Sarybchik EFX_MAC_PM_TRUNC_VFIFO_FULL, 382284555Sarybchik EFX_MAC_PM_DISCARD_VFIFO_FULL, 383284555Sarybchik EFX_MAC_PM_TRUNC_QBB, 384284555Sarybchik EFX_MAC_PM_DISCARD_QBB, 385284555Sarybchik EFX_MAC_PM_DISCARD_MAPPING, 386284555Sarybchik EFX_MAC_RXDP_Q_DISABLED_PKTS, 387284555Sarybchik EFX_MAC_RXDP_DI_DROPPED_PKTS, 388284555Sarybchik EFX_MAC_RXDP_STREAMING_PKTS, 389284555Sarybchik EFX_MAC_RXDP_HLB_FETCH, 390284555Sarybchik EFX_MAC_RXDP_HLB_WAIT, 391284555Sarybchik EFX_MAC_VADAPTER_RX_UNICAST_PACKETS, 392284555Sarybchik EFX_MAC_VADAPTER_RX_UNICAST_BYTES, 393284555Sarybchik EFX_MAC_VADAPTER_RX_MULTICAST_PACKETS, 394284555Sarybchik EFX_MAC_VADAPTER_RX_MULTICAST_BYTES, 395284555Sarybchik EFX_MAC_VADAPTER_RX_BROADCAST_PACKETS, 396284555Sarybchik EFX_MAC_VADAPTER_RX_BROADCAST_BYTES, 397284555Sarybchik EFX_MAC_VADAPTER_RX_BAD_PACKETS, 398284555Sarybchik EFX_MAC_VADAPTER_RX_BAD_BYTES, 399284555Sarybchik EFX_MAC_VADAPTER_RX_OVERFLOW, 400284555Sarybchik EFX_MAC_VADAPTER_TX_UNICAST_PACKETS, 401284555Sarybchik EFX_MAC_VADAPTER_TX_UNICAST_BYTES, 402284555Sarybchik EFX_MAC_VADAPTER_TX_MULTICAST_PACKETS, 403284555Sarybchik EFX_MAC_VADAPTER_TX_MULTICAST_BYTES, 404284555Sarybchik EFX_MAC_VADAPTER_TX_BROADCAST_PACKETS, 405284555Sarybchik EFX_MAC_VADAPTER_TX_BROADCAST_BYTES, 406284555Sarybchik EFX_MAC_VADAPTER_TX_BAD_PACKETS, 407284555Sarybchik EFX_MAC_VADAPTER_TX_BAD_BYTES, 408284555Sarybchik EFX_MAC_VADAPTER_TX_OVERFLOW, 409227569Sphilip EFX_MAC_NSTATS 410227569Sphilip} efx_mac_stat_t; 411227569Sphilip 412227569Sphilip/* END MKCONFIG GENERATED EfxHeaderMacBlock */ 413227569Sphilip 414227569Sphilip#endif /* EFSYS_OPT_MAC_STATS */ 415227569Sphilip 416227569Sphiliptypedef enum efx_link_mode_e { 417227569Sphilip EFX_LINK_UNKNOWN = 0, 418227569Sphilip EFX_LINK_DOWN, 419227569Sphilip EFX_LINK_10HDX, 420227569Sphilip EFX_LINK_10FDX, 421227569Sphilip EFX_LINK_100HDX, 422227569Sphilip EFX_LINK_100FDX, 423227569Sphilip EFX_LINK_1000HDX, 424227569Sphilip EFX_LINK_1000FDX, 425227569Sphilip EFX_LINK_10000FDX, 426284555Sarybchik EFX_LINK_40000FDX, 427227569Sphilip EFX_LINK_NMODES 428227569Sphilip} efx_link_mode_t; 429227569Sphilip 430284555Sarybchik#define EFX_MAC_ADDR_LEN 6 431284555Sarybchik 432284555Sarybchik#define EFX_MAC_ADDR_IS_MULTICAST(_address) (((uint8_t*)_address)[0] & 0x01) 433284555Sarybchik 434284555Sarybchik#define EFX_MAC_MULTICAST_LIST_MAX 256 435284555Sarybchik 436227569Sphilip#define EFX_MAC_SDU_MAX 9202 437227569Sphilip 438227569Sphilip#define EFX_MAC_PDU(_sdu) \ 439227569Sphilip P2ROUNDUP(((_sdu) \ 440227569Sphilip + /* EtherII */ 14 \ 441227569Sphilip + /* VLAN */ 4 \ 442227569Sphilip + /* CRC */ 4 \ 443227569Sphilip + /* bug16011 */ 16), \ 444227569Sphilip (1 << 3)) 445227569Sphilip 446227569Sphilip#define EFX_MAC_PDU_MIN 60 447227569Sphilip#define EFX_MAC_PDU_MAX EFX_MAC_PDU(EFX_MAC_SDU_MAX) 448227569Sphilip 449293927Sarybchikextern __checkReturn efx_rc_t 450227569Sphilipefx_mac_pdu_set( 451227569Sphilip __in efx_nic_t *enp, 452227569Sphilip __in size_t pdu); 453227569Sphilip 454293927Sarybchikextern __checkReturn efx_rc_t 455227569Sphilipefx_mac_addr_set( 456227569Sphilip __in efx_nic_t *enp, 457227569Sphilip __in uint8_t *addr); 458227569Sphilip 459293927Sarybchikextern __checkReturn efx_rc_t 460284555Sarybchikefx_mac_filter_set( 461284555Sarybchik __in efx_nic_t *enp, 462284555Sarybchik __in boolean_t all_unicst, 463284555Sarybchik __in boolean_t mulcst, 464284555Sarybchik __in boolean_t all_mulcst, 465284555Sarybchik __in boolean_t brdcst); 466284555Sarybchik 467293927Sarybchikextern __checkReturn efx_rc_t 468284555Sarybchikefx_mac_multicast_list_set( 469284555Sarybchik __in efx_nic_t *enp, 470284555Sarybchik __in_ecount(6*count) uint8_t const *addrs, 471284555Sarybchik __in int count); 472284555Sarybchik 473293927Sarybchikextern __checkReturn efx_rc_t 474284555Sarybchikefx_mac_filter_default_rxq_set( 475227569Sphilip __in efx_nic_t *enp, 476284555Sarybchik __in efx_rxq_t *erp, 477284555Sarybchik __in boolean_t using_rss); 478227569Sphilip 479284555Sarybchikextern void 480284555Sarybchikefx_mac_filter_default_rxq_clear( 481284555Sarybchik __in efx_nic_t *enp); 482284555Sarybchik 483293927Sarybchikextern __checkReturn efx_rc_t 484227569Sphilipefx_mac_drain( 485227569Sphilip __in efx_nic_t *enp, 486227569Sphilip __in boolean_t enabled); 487227569Sphilip 488293927Sarybchikextern __checkReturn efx_rc_t 489227569Sphilipefx_mac_up( 490227569Sphilip __in efx_nic_t *enp, 491227569Sphilip __out boolean_t *mac_upp); 492227569Sphilip 493227569Sphilip#define EFX_FCNTL_RESPOND 0x00000001 494227569Sphilip#define EFX_FCNTL_GENERATE 0x00000002 495227569Sphilip 496293927Sarybchikextern __checkReturn efx_rc_t 497227569Sphilipefx_mac_fcntl_set( 498227569Sphilip __in efx_nic_t *enp, 499227569Sphilip __in unsigned int fcntl, 500227569Sphilip __in boolean_t autoneg); 501227569Sphilip 502227569Sphilipextern void 503227569Sphilipefx_mac_fcntl_get( 504227569Sphilip __in efx_nic_t *enp, 505227569Sphilip __out unsigned int *fcntl_wantedp, 506227569Sphilip __out unsigned int *fcntl_linkp); 507227569Sphilip 508227569Sphilip 509227569Sphilip#if EFSYS_OPT_MAC_STATS 510227569Sphilip 511227569Sphilip#if EFSYS_OPT_NAMES 512227569Sphilip 513284555Sarybchikextern __checkReturn const char * 514227569Sphilipefx_mac_stat_name( 515227569Sphilip __in efx_nic_t *enp, 516227569Sphilip __in unsigned int id); 517227569Sphilip 518227569Sphilip#endif /* EFSYS_OPT_NAMES */ 519227569Sphilip 520227569Sphilip#define EFX_MAC_STATS_SIZE 0x400 521227569Sphilip 522227569Sphilip/* 523227569Sphilip * Upload mac statistics supported by the hardware into the given buffer. 524227569Sphilip * 525227569Sphilip * The reference buffer must be at least %EFX_MAC_STATS_SIZE bytes, 526227569Sphilip * and page aligned. 527227569Sphilip * 528227569Sphilip * The hardware will only DMA statistics that it understands (of course). 529227569Sphilip * Drivers should not make any assumptions about which statistics are 530227569Sphilip * supported, especially when the statistics are generated by firmware. 531227569Sphilip * 532227569Sphilip * Thus, drivers should zero this buffer before use, so that not-understood 533227569Sphilip * statistics read back as zero. 534227569Sphilip */ 535293927Sarybchikextern __checkReturn efx_rc_t 536227569Sphilipefx_mac_stats_upload( 537227569Sphilip __in efx_nic_t *enp, 538227569Sphilip __in efsys_mem_t *esmp); 539227569Sphilip 540293927Sarybchikextern __checkReturn efx_rc_t 541227569Sphilipefx_mac_stats_periodic( 542227569Sphilip __in efx_nic_t *enp, 543227569Sphilip __in efsys_mem_t *esmp, 544227569Sphilip __in uint16_t period_ms, 545227569Sphilip __in boolean_t events); 546227569Sphilip 547293927Sarybchikextern __checkReturn efx_rc_t 548227569Sphilipefx_mac_stats_update( 549227569Sphilip __in efx_nic_t *enp, 550227569Sphilip __in efsys_mem_t *esmp, 551227569Sphilip __inout_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat, 552293923Sarybchik __inout_opt uint32_t *generationp); 553227569Sphilip 554227569Sphilip#endif /* EFSYS_OPT_MAC_STATS */ 555227569Sphilip 556227569Sphilip/* MON */ 557227569Sphilip 558227569Sphiliptypedef enum efx_mon_type_e { 559227569Sphilip EFX_MON_INVALID = 0, 560227569Sphilip EFX_MON_NULL, 561227569Sphilip EFX_MON_LM87, 562227569Sphilip EFX_MON_MAX6647, 563227569Sphilip EFX_MON_SFC90X0, 564284555Sarybchik EFX_MON_SFC91X0, 565293978Sarybchik EFX_MON_SFC92X0, 566227569Sphilip EFX_MON_NTYPES 567227569Sphilip} efx_mon_type_t; 568227569Sphilip 569227569Sphilip#if EFSYS_OPT_NAMES 570227569Sphilip 571284555Sarybchikextern const char * 572227569Sphilipefx_mon_name( 573227569Sphilip __in efx_nic_t *enp); 574227569Sphilip 575227569Sphilip#endif /* EFSYS_OPT_NAMES */ 576227569Sphilip 577293927Sarybchikextern __checkReturn efx_rc_t 578227569Sphilipefx_mon_init( 579227569Sphilip __in efx_nic_t *enp); 580227569Sphilip 581227569Sphilip#if EFSYS_OPT_MON_STATS 582227569Sphilip 583284555Sarybchik#define EFX_MON_STATS_PAGE_SIZE 0x100 584284555Sarybchik#define EFX_MON_MASK_ELEMENT_SIZE 32 585227569Sphilip 586293981Sarybchik/* START MKCONFIG GENERATED MonitorHeaderStatsBlock c09b13f732431f23 */ 587227569Sphiliptypedef enum efx_mon_stat_e { 588227569Sphilip EFX_MON_STAT_2_5V, 589227569Sphilip EFX_MON_STAT_VCCP1, 590227569Sphilip EFX_MON_STAT_VCC, 591227569Sphilip EFX_MON_STAT_5V, 592227569Sphilip EFX_MON_STAT_12V, 593227569Sphilip EFX_MON_STAT_VCCP2, 594227569Sphilip EFX_MON_STAT_EXT_TEMP, 595227569Sphilip EFX_MON_STAT_INT_TEMP, 596227569Sphilip EFX_MON_STAT_AIN1, 597227569Sphilip EFX_MON_STAT_AIN2, 598227569Sphilip EFX_MON_STAT_INT_COOLING, 599227569Sphilip EFX_MON_STAT_EXT_COOLING, 600227569Sphilip EFX_MON_STAT_1V, 601227569Sphilip EFX_MON_STAT_1_2V, 602227569Sphilip EFX_MON_STAT_1_8V, 603227569Sphilip EFX_MON_STAT_3_3V, 604280551Sarybchik EFX_MON_STAT_1_2VA, 605280551Sarybchik EFX_MON_STAT_VREF, 606280551Sarybchik EFX_MON_STAT_VAOE, 607280551Sarybchik EFX_MON_STAT_AOE_TEMP, 608280551Sarybchik EFX_MON_STAT_PSU_AOE_TEMP, 609280551Sarybchik EFX_MON_STAT_PSU_TEMP, 610280551Sarybchik EFX_MON_STAT_FAN0, 611280551Sarybchik EFX_MON_STAT_FAN1, 612280551Sarybchik EFX_MON_STAT_FAN2, 613280551Sarybchik EFX_MON_STAT_FAN3, 614280551Sarybchik EFX_MON_STAT_FAN4, 615280551Sarybchik EFX_MON_STAT_VAOE_IN, 616280551Sarybchik EFX_MON_STAT_IAOE, 617280551Sarybchik EFX_MON_STAT_IAOE_IN, 618284555Sarybchik EFX_MON_STAT_NIC_POWER, 619284555Sarybchik EFX_MON_STAT_0_9V, 620284555Sarybchik EFX_MON_STAT_I0_9V, 621284555Sarybchik EFX_MON_STAT_I1_2V, 622284555Sarybchik EFX_MON_STAT_0_9V_ADC, 623284555Sarybchik EFX_MON_STAT_INT_TEMP2, 624284555Sarybchik EFX_MON_STAT_VREG_TEMP, 625284555Sarybchik EFX_MON_STAT_VREG_0_9V_TEMP, 626284555Sarybchik EFX_MON_STAT_VREG_1_2V_TEMP, 627284555Sarybchik EFX_MON_STAT_INT_VPTAT, 628284555Sarybchik EFX_MON_STAT_INT_ADC_TEMP, 629284555Sarybchik EFX_MON_STAT_EXT_VPTAT, 630284555Sarybchik EFX_MON_STAT_EXT_ADC_TEMP, 631284555Sarybchik EFX_MON_STAT_AMBIENT_TEMP, 632284555Sarybchik EFX_MON_STAT_AIRFLOW, 633284555Sarybchik EFX_MON_STAT_VDD08D_VSS08D_CSR, 634284555Sarybchik EFX_MON_STAT_VDD08D_VSS08D_CSR_EXTADC, 635284555Sarybchik EFX_MON_STAT_HOTPOINT_TEMP, 636284555Sarybchik EFX_MON_STAT_PHY_POWER_SWITCH_PORT0, 637284555Sarybchik EFX_MON_STAT_PHY_POWER_SWITCH_PORT1, 638284555Sarybchik EFX_MON_STAT_MUM_VCC, 639284555Sarybchik EFX_MON_STAT_0V9_A, 640284555Sarybchik EFX_MON_STAT_I0V9_A, 641284555Sarybchik EFX_MON_STAT_0V9_A_TEMP, 642284555Sarybchik EFX_MON_STAT_0V9_B, 643284555Sarybchik EFX_MON_STAT_I0V9_B, 644284555Sarybchik EFX_MON_STAT_0V9_B_TEMP, 645284555Sarybchik EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY, 646284555Sarybchik EFX_MON_STAT_CCOM_AVREG_1V2_SUPPLY_EXT_ADC, 647284555Sarybchik EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY, 648284555Sarybchik EFX_MON_STAT_CCOM_AVREG_1V8_SUPPLY_EXT_ADC, 649284555Sarybchik EFX_MON_STAT_CONTROLLER_MASTER_VPTAT, 650284555Sarybchik EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP, 651284555Sarybchik EFX_MON_STAT_CONTROLLER_MASTER_VPTAT_EXT_ADC, 652284555Sarybchik EFX_MON_STAT_CONTROLLER_MASTER_INTERNAL_TEMP_EXT_ADC, 653284555Sarybchik EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT, 654284555Sarybchik EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP, 655284555Sarybchik EFX_MON_STAT_CONTROLLER_SLAVE_VPTAT_EXT_ADC, 656284555Sarybchik EFX_MON_STAT_CONTROLLER_SLAVE_INTERNAL_TEMP_EXT_ADC, 657293981Sarybchik EFX_MON_STAT_SODIMM_VOUT, 658293981Sarybchik EFX_MON_STAT_SODIMM_0_TEMP, 659293981Sarybchik EFX_MON_STAT_SODIMM_1_TEMP, 660293981Sarybchik EFX_MON_STAT_PHY0_VCC, 661293981Sarybchik EFX_MON_STAT_PHY1_VCC, 662293981Sarybchik EFX_MON_STAT_CONTROLLER_TDIODE_TEMP, 663227569Sphilip EFX_MON_NSTATS 664227569Sphilip} efx_mon_stat_t; 665227569Sphilip 666227569Sphilip/* END MKCONFIG GENERATED MonitorHeaderStatsBlock */ 667227569Sphilip 668227569Sphiliptypedef enum efx_mon_stat_state_e { 669227569Sphilip EFX_MON_STAT_STATE_OK = 0, 670227569Sphilip EFX_MON_STAT_STATE_WARNING = 1, 671227569Sphilip EFX_MON_STAT_STATE_FATAL = 2, 672227569Sphilip EFX_MON_STAT_STATE_BROKEN = 3, 673284555Sarybchik EFX_MON_STAT_STATE_NO_READING = 4, 674227569Sphilip} efx_mon_stat_state_t; 675227569Sphilip 676284555Sarybchiktypedef struct efx_mon_stat_value_s { 677227569Sphilip uint16_t emsv_value; 678227569Sphilip uint16_t emsv_state; 679227569Sphilip} efx_mon_stat_value_t; 680227569Sphilip 681227569Sphilip#if EFSYS_OPT_NAMES 682227569Sphilip 683284555Sarybchikextern const char * 684227569Sphilipefx_mon_stat_name( 685227569Sphilip __in efx_nic_t *enp, 686227569Sphilip __in efx_mon_stat_t id); 687227569Sphilip 688227569Sphilip#endif /* EFSYS_OPT_NAMES */ 689227569Sphilip 690293927Sarybchikextern __checkReturn efx_rc_t 691227569Sphilipefx_mon_stats_update( 692227569Sphilip __in efx_nic_t *enp, 693227569Sphilip __in efsys_mem_t *esmp, 694293921Sarybchik __inout_ecount(EFX_MON_NSTATS) efx_mon_stat_value_t *values); 695227569Sphilip 696227569Sphilip#endif /* EFSYS_OPT_MON_STATS */ 697227569Sphilip 698227569Sphilipextern void 699227569Sphilipefx_mon_fini( 700227569Sphilip __in efx_nic_t *enp); 701227569Sphilip 702227569Sphilip/* PHY */ 703227569Sphilip 704227569Sphilip#define PMA_PMD_MMD 1 705227569Sphilip#define PCS_MMD 3 706227569Sphilip#define PHY_XS_MMD 4 707227569Sphilip#define DTE_XS_MMD 5 708227569Sphilip#define AN_MMD 7 709227569Sphilip#define CL22EXT_MMD 29 710227569Sphilip 711227569Sphilip#define MAXMMD ((1 << 5) - 1) 712227569Sphilip 713293927Sarybchikextern __checkReturn efx_rc_t 714227569Sphilipefx_phy_verify( 715227569Sphilip __in efx_nic_t *enp); 716227569Sphilip 717227569Sphilip#if EFSYS_OPT_PHY_LED_CONTROL 718227569Sphilip 719227569Sphiliptypedef enum efx_phy_led_mode_e { 720227569Sphilip EFX_PHY_LED_DEFAULT = 0, 721227569Sphilip EFX_PHY_LED_OFF, 722227569Sphilip EFX_PHY_LED_ON, 723227569Sphilip EFX_PHY_LED_FLASH, 724227569Sphilip EFX_PHY_LED_NMODES 725227569Sphilip} efx_phy_led_mode_t; 726227569Sphilip 727293927Sarybchikextern __checkReturn efx_rc_t 728227569Sphilipefx_phy_led_set( 729227569Sphilip __in efx_nic_t *enp, 730227569Sphilip __in efx_phy_led_mode_t mode); 731227569Sphilip 732227569Sphilip#endif /* EFSYS_OPT_PHY_LED_CONTROL */ 733227569Sphilip 734293927Sarybchikextern __checkReturn efx_rc_t 735227569Sphilipefx_port_init( 736227569Sphilip __in efx_nic_t *enp); 737227569Sphilip 738227569Sphilip#if EFSYS_OPT_LOOPBACK 739227569Sphilip 740227569Sphiliptypedef enum efx_loopback_type_e { 741227569Sphilip EFX_LOOPBACK_OFF = 0, 742227569Sphilip EFX_LOOPBACK_DATA = 1, 743227569Sphilip EFX_LOOPBACK_GMAC = 2, 744227569Sphilip EFX_LOOPBACK_XGMII = 3, 745227569Sphilip EFX_LOOPBACK_XGXS = 4, 746227569Sphilip EFX_LOOPBACK_XAUI = 5, 747227569Sphilip EFX_LOOPBACK_GMII = 6, 748227569Sphilip EFX_LOOPBACK_SGMII = 7, 749227569Sphilip EFX_LOOPBACK_XGBR = 8, 750227569Sphilip EFX_LOOPBACK_XFI = 9, 751227569Sphilip EFX_LOOPBACK_XAUI_FAR = 10, 752227569Sphilip EFX_LOOPBACK_GMII_FAR = 11, 753227569Sphilip EFX_LOOPBACK_SGMII_FAR = 12, 754227569Sphilip EFX_LOOPBACK_XFI_FAR = 13, 755227569Sphilip EFX_LOOPBACK_GPHY = 14, 756227569Sphilip EFX_LOOPBACK_PHY_XS = 15, 757227569Sphilip EFX_LOOPBACK_PCS = 16, 758227569Sphilip EFX_LOOPBACK_PMA_PMD = 17, 759284555Sarybchik EFX_LOOPBACK_XPORT = 18, 760284555Sarybchik EFX_LOOPBACK_XGMII_WS = 19, 761284555Sarybchik EFX_LOOPBACK_XAUI_WS = 20, 762284555Sarybchik EFX_LOOPBACK_XAUI_WS_FAR = 21, 763284555Sarybchik EFX_LOOPBACK_XAUI_WS_NEAR = 22, 764284555Sarybchik EFX_LOOPBACK_GMII_WS = 23, 765284555Sarybchik EFX_LOOPBACK_XFI_WS = 24, 766284555Sarybchik EFX_LOOPBACK_XFI_WS_FAR = 25, 767284555Sarybchik EFX_LOOPBACK_PHYXS_WS = 26, 768284555Sarybchik EFX_LOOPBACK_PMA_INT = 27, 769284555Sarybchik EFX_LOOPBACK_SD_NEAR = 28, 770284555Sarybchik EFX_LOOPBACK_SD_FAR = 29, 771284555Sarybchik EFX_LOOPBACK_PMA_INT_WS = 30, 772284555Sarybchik EFX_LOOPBACK_SD_FEP2_WS = 31, 773284555Sarybchik EFX_LOOPBACK_SD_FEP1_5_WS = 32, 774284555Sarybchik EFX_LOOPBACK_SD_FEP_WS = 33, 775284555Sarybchik EFX_LOOPBACK_SD_FES_WS = 34, 776227569Sphilip EFX_LOOPBACK_NTYPES 777227569Sphilip} efx_loopback_type_t; 778227569Sphilip 779284555Sarybchiktypedef enum efx_loopback_kind_e { 780284555Sarybchik EFX_LOOPBACK_KIND_OFF = 0, 781284555Sarybchik EFX_LOOPBACK_KIND_ALL, 782284555Sarybchik EFX_LOOPBACK_KIND_MAC, 783284555Sarybchik EFX_LOOPBACK_KIND_PHY, 784284555Sarybchik EFX_LOOPBACK_NKINDS 785284555Sarybchik} efx_loopback_kind_t; 786227569Sphilip 787284555Sarybchikextern void 788284555Sarybchikefx_loopback_mask( 789284555Sarybchik __in efx_loopback_kind_t loopback_kind, 790284555Sarybchik __out efx_qword_t *maskp); 791227569Sphilip 792293927Sarybchikextern __checkReturn efx_rc_t 793227569Sphilipefx_port_loopback_set( 794227569Sphilip __in efx_nic_t *enp, 795227569Sphilip __in efx_link_mode_t link_mode, 796227569Sphilip __in efx_loopback_type_t type); 797227569Sphilip 798227569Sphilip#if EFSYS_OPT_NAMES 799227569Sphilip 800284555Sarybchikextern __checkReturn const char * 801227569Sphilipefx_loopback_type_name( 802227569Sphilip __in efx_nic_t *enp, 803227569Sphilip __in efx_loopback_type_t type); 804227569Sphilip 805227569Sphilip#endif /* EFSYS_OPT_NAMES */ 806227569Sphilip 807227569Sphilip#endif /* EFSYS_OPT_LOOPBACK */ 808227569Sphilip 809293927Sarybchikextern __checkReturn efx_rc_t 810227569Sphilipefx_port_poll( 811227569Sphilip __in efx_nic_t *enp, 812284555Sarybchik __out_opt efx_link_mode_t *link_modep); 813227569Sphilip 814227569Sphilipextern void 815227569Sphilipefx_port_fini( 816227569Sphilip __in efx_nic_t *enp); 817227569Sphilip 818227569Sphiliptypedef enum efx_phy_cap_type_e { 819227569Sphilip EFX_PHY_CAP_INVALID = 0, 820227569Sphilip EFX_PHY_CAP_10HDX, 821227569Sphilip EFX_PHY_CAP_10FDX, 822227569Sphilip EFX_PHY_CAP_100HDX, 823227569Sphilip EFX_PHY_CAP_100FDX, 824227569Sphilip EFX_PHY_CAP_1000HDX, 825227569Sphilip EFX_PHY_CAP_1000FDX, 826227569Sphilip EFX_PHY_CAP_10000FDX, 827227569Sphilip EFX_PHY_CAP_PAUSE, 828227569Sphilip EFX_PHY_CAP_ASYM, 829227569Sphilip EFX_PHY_CAP_AN, 830284555Sarybchik EFX_PHY_CAP_40000FDX, 831227569Sphilip EFX_PHY_CAP_NTYPES 832227569Sphilip} efx_phy_cap_type_t; 833227569Sphilip 834227569Sphilip 835227569Sphilip#define EFX_PHY_CAP_CURRENT 0x00000000 836227569Sphilip#define EFX_PHY_CAP_DEFAULT 0x00000001 837227569Sphilip#define EFX_PHY_CAP_PERM 0x00000002 838227569Sphilip 839227569Sphilipextern void 840227569Sphilipefx_phy_adv_cap_get( 841227569Sphilip __in efx_nic_t *enp, 842227569Sphilip __in uint32_t flag, 843227569Sphilip __out uint32_t *maskp); 844227569Sphilip 845293927Sarybchikextern __checkReturn efx_rc_t 846227569Sphilipefx_phy_adv_cap_set( 847227569Sphilip __in efx_nic_t *enp, 848227569Sphilip __in uint32_t mask); 849227569Sphilip 850227569Sphilipextern void 851227569Sphilipefx_phy_lp_cap_get( 852227569Sphilip __in efx_nic_t *enp, 853227569Sphilip __out uint32_t *maskp); 854227569Sphilip 855293927Sarybchikextern __checkReturn efx_rc_t 856227569Sphilipefx_phy_oui_get( 857227569Sphilip __in efx_nic_t *enp, 858227569Sphilip __out uint32_t *ouip); 859227569Sphilip 860227569Sphiliptypedef enum efx_phy_media_type_e { 861227569Sphilip EFX_PHY_MEDIA_INVALID = 0, 862227569Sphilip EFX_PHY_MEDIA_XAUI, 863227569Sphilip EFX_PHY_MEDIA_CX4, 864227569Sphilip EFX_PHY_MEDIA_KX4, 865227569Sphilip EFX_PHY_MEDIA_XFP, 866227569Sphilip EFX_PHY_MEDIA_SFP_PLUS, 867227569Sphilip EFX_PHY_MEDIA_BASE_T, 868284555Sarybchik EFX_PHY_MEDIA_QSFP_PLUS, 869227569Sphilip EFX_PHY_MEDIA_NTYPES 870227569Sphilip} efx_phy_media_type_t; 871227569Sphilip 872227569Sphilip/* Get the type of medium currently used. If the board has ports for 873227569Sphilip * modules, a module is present, and we recognise the media type of 874227569Sphilip * the module, then this will be the media type of the module. 875227569Sphilip * Otherwise it will be the media type of the port. 876227569Sphilip */ 877227569Sphilipextern void 878227569Sphilipefx_phy_media_type_get( 879227569Sphilip __in efx_nic_t *enp, 880227569Sphilip __out efx_phy_media_type_t *typep); 881227569Sphilip 882295526Sarybchikextern efx_rc_t 883295526Sarybchikefx_phy_module_get_info( 884295526Sarybchik __in efx_nic_t *enp, 885295526Sarybchik __in uint8_t dev_addr, 886295526Sarybchik __in uint8_t offset, 887295526Sarybchik __in uint8_t len, 888295526Sarybchik __out_bcount(len) uint8_t *data); 889295526Sarybchik 890227569Sphilip#if EFSYS_OPT_PHY_STATS 891227569Sphilip 892227569Sphilip/* START MKCONFIG GENERATED PhyHeaderStatsBlock 30ed56ad501f8e36 */ 893227569Sphiliptypedef enum efx_phy_stat_e { 894227569Sphilip EFX_PHY_STAT_OUI, 895227569Sphilip EFX_PHY_STAT_PMA_PMD_LINK_UP, 896227569Sphilip EFX_PHY_STAT_PMA_PMD_RX_FAULT, 897227569Sphilip EFX_PHY_STAT_PMA_PMD_TX_FAULT, 898227569Sphilip EFX_PHY_STAT_PMA_PMD_REV_A, 899227569Sphilip EFX_PHY_STAT_PMA_PMD_REV_B, 900227569Sphilip EFX_PHY_STAT_PMA_PMD_REV_C, 901227569Sphilip EFX_PHY_STAT_PMA_PMD_REV_D, 902227569Sphilip EFX_PHY_STAT_PCS_LINK_UP, 903227569Sphilip EFX_PHY_STAT_PCS_RX_FAULT, 904227569Sphilip EFX_PHY_STAT_PCS_TX_FAULT, 905227569Sphilip EFX_PHY_STAT_PCS_BER, 906227569Sphilip EFX_PHY_STAT_PCS_BLOCK_ERRORS, 907227569Sphilip EFX_PHY_STAT_PHY_XS_LINK_UP, 908227569Sphilip EFX_PHY_STAT_PHY_XS_RX_FAULT, 909227569Sphilip EFX_PHY_STAT_PHY_XS_TX_FAULT, 910227569Sphilip EFX_PHY_STAT_PHY_XS_ALIGN, 911227569Sphilip EFX_PHY_STAT_PHY_XS_SYNC_A, 912227569Sphilip EFX_PHY_STAT_PHY_XS_SYNC_B, 913227569Sphilip EFX_PHY_STAT_PHY_XS_SYNC_C, 914227569Sphilip EFX_PHY_STAT_PHY_XS_SYNC_D, 915227569Sphilip EFX_PHY_STAT_AN_LINK_UP, 916227569Sphilip EFX_PHY_STAT_AN_MASTER, 917227569Sphilip EFX_PHY_STAT_AN_LOCAL_RX_OK, 918227569Sphilip EFX_PHY_STAT_AN_REMOTE_RX_OK, 919227569Sphilip EFX_PHY_STAT_CL22EXT_LINK_UP, 920227569Sphilip EFX_PHY_STAT_SNR_A, 921227569Sphilip EFX_PHY_STAT_SNR_B, 922227569Sphilip EFX_PHY_STAT_SNR_C, 923227569Sphilip EFX_PHY_STAT_SNR_D, 924227569Sphilip EFX_PHY_STAT_PMA_PMD_SIGNAL_A, 925227569Sphilip EFX_PHY_STAT_PMA_PMD_SIGNAL_B, 926227569Sphilip EFX_PHY_STAT_PMA_PMD_SIGNAL_C, 927227569Sphilip EFX_PHY_STAT_PMA_PMD_SIGNAL_D, 928227569Sphilip EFX_PHY_STAT_AN_COMPLETE, 929227569Sphilip EFX_PHY_STAT_PMA_PMD_REV_MAJOR, 930227569Sphilip EFX_PHY_STAT_PMA_PMD_REV_MINOR, 931227569Sphilip EFX_PHY_STAT_PMA_PMD_REV_MICRO, 932227569Sphilip EFX_PHY_STAT_PCS_FW_VERSION_0, 933227569Sphilip EFX_PHY_STAT_PCS_FW_VERSION_1, 934227569Sphilip EFX_PHY_STAT_PCS_FW_VERSION_2, 935227569Sphilip EFX_PHY_STAT_PCS_FW_VERSION_3, 936227569Sphilip EFX_PHY_STAT_PCS_FW_BUILD_YY, 937227569Sphilip EFX_PHY_STAT_PCS_FW_BUILD_MM, 938227569Sphilip EFX_PHY_STAT_PCS_FW_BUILD_DD, 939227569Sphilip EFX_PHY_STAT_PCS_OP_MODE, 940227569Sphilip EFX_PHY_NSTATS 941227569Sphilip} efx_phy_stat_t; 942227569Sphilip 943227569Sphilip/* END MKCONFIG GENERATED PhyHeaderStatsBlock */ 944227569Sphilip 945227569Sphilip#if EFSYS_OPT_NAMES 946227569Sphilip 947284555Sarybchikextern const char * 948227569Sphilipefx_phy_stat_name( 949227569Sphilip __in efx_nic_t *enp, 950227569Sphilip __in efx_phy_stat_t stat); 951227569Sphilip 952227569Sphilip#endif /* EFSYS_OPT_NAMES */ 953227569Sphilip 954227569Sphilip#define EFX_PHY_STATS_SIZE 0x100 955227569Sphilip 956293927Sarybchikextern __checkReturn efx_rc_t 957227569Sphilipefx_phy_stats_update( 958227569Sphilip __in efx_nic_t *enp, 959227569Sphilip __in efsys_mem_t *esmp, 960293921Sarybchik __inout_ecount(EFX_PHY_NSTATS) uint32_t *stat); 961227569Sphilip 962227569Sphilip#endif /* EFSYS_OPT_PHY_STATS */ 963227569Sphilip 964227569Sphilip#if EFSYS_OPT_PHY_PROPS 965227569Sphilip 966227569Sphilip#if EFSYS_OPT_NAMES 967227569Sphilip 968284555Sarybchikextern const char * 969227569Sphilipefx_phy_prop_name( 970227569Sphilip __in efx_nic_t *enp, 971227569Sphilip __in unsigned int id); 972227569Sphilip 973227569Sphilip#endif /* EFSYS_OPT_NAMES */ 974227569Sphilip 975227569Sphilip#define EFX_PHY_PROP_DEFAULT 0x00000001 976227569Sphilip 977293927Sarybchikextern __checkReturn efx_rc_t 978227569Sphilipefx_phy_prop_get( 979227569Sphilip __in efx_nic_t *enp, 980227569Sphilip __in unsigned int id, 981227569Sphilip __in uint32_t flags, 982227569Sphilip __out uint32_t *valp); 983227569Sphilip 984293927Sarybchikextern __checkReturn efx_rc_t 985227569Sphilipefx_phy_prop_set( 986227569Sphilip __in efx_nic_t *enp, 987227569Sphilip __in unsigned int id, 988227569Sphilip __in uint32_t val); 989227569Sphilip 990227569Sphilip#endif /* EFSYS_OPT_PHY_PROPS */ 991227569Sphilip 992284555Sarybchik#if EFSYS_OPT_BIST 993227569Sphilip 994284555Sarybchiktypedef enum efx_bist_type_e { 995284555Sarybchik EFX_BIST_TYPE_UNKNOWN, 996284555Sarybchik EFX_BIST_TYPE_PHY_NORMAL, 997284555Sarybchik EFX_BIST_TYPE_PHY_CABLE_SHORT, 998284555Sarybchik EFX_BIST_TYPE_PHY_CABLE_LONG, 999284555Sarybchik EFX_BIST_TYPE_MC_MEM, /* Test the MC DMEM and IMEM */ 1000284555Sarybchik EFX_BIST_TYPE_SAT_MEM, /* Test the DMEM and IMEM of satellite cpus*/ 1001284555Sarybchik EFX_BIST_TYPE_REG, /* Test the register memories */ 1002284555Sarybchik EFX_BIST_TYPE_NTYPES, 1003284555Sarybchik} efx_bist_type_t; 1004227569Sphilip 1005284555Sarybchiktypedef enum efx_bist_result_e { 1006284555Sarybchik EFX_BIST_RESULT_UNKNOWN, 1007284555Sarybchik EFX_BIST_RESULT_RUNNING, 1008284555Sarybchik EFX_BIST_RESULT_PASSED, 1009284555Sarybchik EFX_BIST_RESULT_FAILED, 1010284555Sarybchik} efx_bist_result_t; 1011227569Sphilip 1012227569Sphiliptypedef enum efx_phy_cable_status_e { 1013227569Sphilip EFX_PHY_CABLE_STATUS_OK, 1014227569Sphilip EFX_PHY_CABLE_STATUS_INVALID, 1015227569Sphilip EFX_PHY_CABLE_STATUS_OPEN, 1016227569Sphilip EFX_PHY_CABLE_STATUS_INTRAPAIRSHORT, 1017227569Sphilip EFX_PHY_CABLE_STATUS_INTERPAIRSHORT, 1018227569Sphilip EFX_PHY_CABLE_STATUS_BUSY, 1019227569Sphilip} efx_phy_cable_status_t; 1020227569Sphilip 1021284555Sarybchiktypedef enum efx_bist_value_e { 1022284555Sarybchik EFX_BIST_PHY_CABLE_LENGTH_A, 1023284555Sarybchik EFX_BIST_PHY_CABLE_LENGTH_B, 1024284555Sarybchik EFX_BIST_PHY_CABLE_LENGTH_C, 1025284555Sarybchik EFX_BIST_PHY_CABLE_LENGTH_D, 1026284555Sarybchik EFX_BIST_PHY_CABLE_STATUS_A, 1027284555Sarybchik EFX_BIST_PHY_CABLE_STATUS_B, 1028284555Sarybchik EFX_BIST_PHY_CABLE_STATUS_C, 1029284555Sarybchik EFX_BIST_PHY_CABLE_STATUS_D, 1030284555Sarybchik EFX_BIST_FAULT_CODE, 1031284555Sarybchik /* Memory BIST specific values. These match to the MC_CMD_BIST_POLL 1032284555Sarybchik * response. */ 1033284555Sarybchik EFX_BIST_MEM_TEST, 1034284555Sarybchik EFX_BIST_MEM_ADDR, 1035284555Sarybchik EFX_BIST_MEM_BUS, 1036284555Sarybchik EFX_BIST_MEM_EXPECT, 1037284555Sarybchik EFX_BIST_MEM_ACTUAL, 1038284555Sarybchik EFX_BIST_MEM_ECC, 1039284555Sarybchik EFX_BIST_MEM_ECC_PARITY, 1040284555Sarybchik EFX_BIST_MEM_ECC_FATAL, 1041284555Sarybchik EFX_BIST_NVALUES, 1042284555Sarybchik} efx_bist_value_t; 1043227569Sphilip 1044293927Sarybchikextern __checkReturn efx_rc_t 1045284555Sarybchikefx_bist_enable_offline( 1046284555Sarybchik __in efx_nic_t *enp); 1047284555Sarybchik 1048293927Sarybchikextern __checkReturn efx_rc_t 1049284555Sarybchikefx_bist_start( 1050227569Sphilip __in efx_nic_t *enp, 1051284555Sarybchik __in efx_bist_type_t type); 1052227569Sphilip 1053293927Sarybchikextern __checkReturn efx_rc_t 1054284555Sarybchikefx_bist_poll( 1055227569Sphilip __in efx_nic_t *enp, 1056284555Sarybchik __in efx_bist_type_t type, 1057284555Sarybchik __out efx_bist_result_t *resultp, 1058227569Sphilip __out_opt uint32_t *value_maskp, 1059227569Sphilip __out_ecount_opt(count) unsigned long *valuesp, 1060227569Sphilip __in size_t count); 1061227569Sphilip 1062227569Sphilipextern void 1063284555Sarybchikefx_bist_stop( 1064227569Sphilip __in efx_nic_t *enp, 1065284555Sarybchik __in efx_bist_type_t type); 1066227569Sphilip 1067284555Sarybchik#endif /* EFSYS_OPT_BIST */ 1068227569Sphilip 1069227569Sphilip#define EFX_FEATURE_IPV6 0x00000001 1070227569Sphilip#define EFX_FEATURE_LFSR_HASH_INSERT 0x00000002 1071227569Sphilip#define EFX_FEATURE_LINK_EVENTS 0x00000004 1072227569Sphilip#define EFX_FEATURE_PERIODIC_MAC_STATS 0x00000008 1073227569Sphilip#define EFX_FEATURE_WOL 0x00000010 1074227569Sphilip#define EFX_FEATURE_MCDI 0x00000020 1075227569Sphilip#define EFX_FEATURE_LOOKAHEAD_SPLIT 0x00000040 1076227569Sphilip#define EFX_FEATURE_MAC_HEADER_FILTERS 0x00000080 1077280550Sarybchik#define EFX_FEATURE_TURBO 0x00000100 1078284555Sarybchik#define EFX_FEATURE_MCDI_DMA 0x00000200 1079284555Sarybchik#define EFX_FEATURE_TX_SRC_FILTERS 0x00000400 1080284555Sarybchik#define EFX_FEATURE_PIO_BUFFERS 0x00000800 1081284555Sarybchik#define EFX_FEATURE_FW_ASSISTED_TSO 0x00001000 1082294381Sarybchik#define EFX_FEATURE_FW_ASSISTED_TSO_V2 0x00002000 1083227569Sphilip 1084227569Sphiliptypedef struct efx_nic_cfg_s { 1085227569Sphilip uint32_t enc_board_type; 1086227569Sphilip uint32_t enc_phy_type; 1087227569Sphilip#if EFSYS_OPT_NAMES 1088227569Sphilip char enc_phy_name[21]; 1089227569Sphilip#endif 1090227569Sphilip char enc_phy_revision[21]; 1091227569Sphilip efx_mon_type_t enc_mon_type; 1092227569Sphilip#if EFSYS_OPT_MON_STATS 1093284555Sarybchik uint32_t enc_mon_stat_dma_buf_size; 1094284555Sarybchik uint32_t enc_mon_stat_mask[(EFX_MON_NSTATS + 31) / 32]; 1095227569Sphilip#endif 1096227569Sphilip unsigned int enc_features; 1097227569Sphilip uint8_t enc_mac_addr[6]; 1098284555Sarybchik uint8_t enc_port; /* PHY port number */ 1099284555Sarybchik uint32_t enc_func_flags; 1100284555Sarybchik uint32_t enc_intr_vec_base; 1101284555Sarybchik uint32_t enc_intr_limit; 1102227569Sphilip uint32_t enc_evq_limit; 1103227569Sphilip uint32_t enc_txq_limit; 1104227569Sphilip uint32_t enc_rxq_limit; 1105227569Sphilip uint32_t enc_buftbl_limit; 1106284555Sarybchik uint32_t enc_piobuf_limit; 1107284555Sarybchik uint32_t enc_piobuf_size; 1108293983Sarybchik uint32_t enc_piobuf_min_alloc_size; 1109280588Sarybchik uint32_t enc_evq_timer_quantum_ns; 1110280588Sarybchik uint32_t enc_evq_timer_max_us; 1111280550Sarybchik uint32_t enc_clk_mult; 1112284555Sarybchik uint32_t enc_rx_prefix_size; 1113284555Sarybchik uint32_t enc_rx_buf_align_start; 1114284555Sarybchik uint32_t enc_rx_buf_align_end; 1115227569Sphilip#if EFSYS_OPT_LOOPBACK 1116284555Sarybchik efx_qword_t enc_loopback_types[EFX_LINK_NMODES]; 1117227569Sphilip#endif /* EFSYS_OPT_LOOPBACK */ 1118227569Sphilip#if EFSYS_OPT_PHY_FLAGS 1119227569Sphilip uint32_t enc_phy_flags_mask; 1120227569Sphilip#endif /* EFSYS_OPT_PHY_FLAGS */ 1121227569Sphilip#if EFSYS_OPT_PHY_LED_CONTROL 1122227569Sphilip uint32_t enc_led_mask; 1123227569Sphilip#endif /* EFSYS_OPT_PHY_LED_CONTROL */ 1124227569Sphilip#if EFSYS_OPT_PHY_STATS 1125227569Sphilip uint64_t enc_phy_stat_mask; 1126227569Sphilip#endif /* EFSYS_OPT_PHY_STATS */ 1127227569Sphilip#if EFSYS_OPT_PHY_PROPS 1128227569Sphilip unsigned int enc_phy_nprops; 1129227569Sphilip#endif /* EFSYS_OPT_PHY_PROPS */ 1130227569Sphilip#if EFSYS_OPT_SIENA 1131284555Sarybchik uint8_t enc_mcdi_mdio_channel; 1132227569Sphilip#if EFSYS_OPT_PHY_STATS 1133284555Sarybchik uint32_t enc_mcdi_phy_stat_mask; 1134227569Sphilip#endif /* EFSYS_OPT_PHY_STATS */ 1135284555Sarybchik#endif /* EFSYS_OPT_SIENA */ 1136293978Sarybchik#if (EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) 1137227569Sphilip#if EFSYS_OPT_MON_STATS 1138284555Sarybchik uint32_t *enc_mcdi_sensor_maskp; 1139284555Sarybchik uint32_t enc_mcdi_sensor_mask_size; 1140227569Sphilip#endif /* EFSYS_OPT_MON_STATS */ 1141293978Sarybchik#endif /* (EFSYS_OPT_SIENA || EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) */ 1142284555Sarybchik#if EFSYS_OPT_BIST 1143227569Sphilip uint32_t enc_bist_mask; 1144284555Sarybchik#endif /* EFSYS_OPT_BIST */ 1145293975Sarybchik#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD 1146284555Sarybchik uint32_t enc_pf; 1147284555Sarybchik uint32_t enc_vf; 1148284555Sarybchik uint32_t enc_privilege_mask; 1149293975Sarybchik#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */ 1150284555Sarybchik boolean_t enc_bug26807_workaround; 1151284555Sarybchik boolean_t enc_bug35388_workaround; 1152284555Sarybchik boolean_t enc_bug41750_workaround; 1153284555Sarybchik boolean_t enc_rx_batching_enabled; 1154284555Sarybchik /* Maximum number of descriptors completed in an rx event. */ 1155284555Sarybchik uint32_t enc_rx_batch_max; 1156284555Sarybchik /* Number of rx descriptors the hardware requires for a push. */ 1157284555Sarybchik uint32_t enc_rx_push_align; 1158284555Sarybchik /* 1159284555Sarybchik * Maximum number of bytes into the packet the TCP header can start for 1160284555Sarybchik * the hardware to apply TSO packet edits. 1161284555Sarybchik */ 1162284555Sarybchik uint32_t enc_tx_tso_tcp_header_offset_limit; 1163284555Sarybchik boolean_t enc_fw_assisted_tso_enabled; 1164294381Sarybchik boolean_t enc_fw_assisted_tso_v2_enabled; 1165284555Sarybchik boolean_t enc_hw_tx_insert_vlan_enabled; 1166284555Sarybchik /* Datapath firmware vadapter/vport/vswitch support */ 1167284555Sarybchik boolean_t enc_datapath_cap_evb; 1168293945Sarybchik boolean_t enc_rx_disable_scatter_supported; 1169293953Sarybchik boolean_t enc_allow_set_mac_with_installed_filters; 1170294397Sarybchik boolean_t enc_enhanced_set_mac_supported; 1171284555Sarybchik /* External port identifier */ 1172284555Sarybchik uint8_t enc_external_port; 1173293954Sarybchik uint32_t enc_mcdi_max_payload_length; 1174294391Sarybchik /* VPD may be per-PF or global */ 1175294391Sarybchik boolean_t enc_vpd_is_global; 1176227569Sphilip} efx_nic_cfg_t; 1177227569Sphilip 1178284555Sarybchik#define EFX_PCI_FUNCTION_IS_PF(_encp) ((_encp)->enc_vf == 0xffff) 1179284555Sarybchik#define EFX_PCI_FUNCTION_IS_VF(_encp) ((_encp)->enc_vf != 0xffff) 1180284555Sarybchik 1181284555Sarybchik#define EFX_PCI_FUNCTION(_encp) \ 1182284555Sarybchik (EFX_PCI_FUNCTION_IS_PF(_encp) ? (_encp)->enc_pf : (_encp)->enc_vf) 1183284555Sarybchik 1184284555Sarybchik#define EFX_PCI_VF_PARENT(_encp) ((_encp)->enc_pf) 1185284555Sarybchik 1186227569Sphilipextern const efx_nic_cfg_t * 1187227569Sphilipefx_nic_cfg_get( 1188227569Sphilip __in efx_nic_t *enp); 1189227569Sphilip 1190284555Sarybchik/* Driver resource limits (minimum required/maximum usable). */ 1191284555Sarybchiktypedef struct efx_drv_limits_s 1192284555Sarybchik{ 1193284555Sarybchik uint32_t edl_min_evq_count; 1194284555Sarybchik uint32_t edl_max_evq_count; 1195284555Sarybchik 1196284555Sarybchik uint32_t edl_min_rxq_count; 1197284555Sarybchik uint32_t edl_max_rxq_count; 1198284555Sarybchik 1199284555Sarybchik uint32_t edl_min_txq_count; 1200284555Sarybchik uint32_t edl_max_txq_count; 1201284555Sarybchik 1202284555Sarybchik /* PIO blocks (sub-allocated from piobuf) */ 1203284555Sarybchik uint32_t edl_min_pio_alloc_size; 1204284555Sarybchik uint32_t edl_max_pio_alloc_count; 1205284555Sarybchik} efx_drv_limits_t; 1206284555Sarybchik 1207293927Sarybchikextern __checkReturn efx_rc_t 1208284555Sarybchikefx_nic_set_drv_limits( 1209284555Sarybchik __inout efx_nic_t *enp, 1210284555Sarybchik __in efx_drv_limits_t *edlp); 1211284555Sarybchik 1212284555Sarybchiktypedef enum efx_nic_region_e { 1213284555Sarybchik EFX_REGION_VI, /* Memory BAR UC mapping */ 1214284555Sarybchik EFX_REGION_PIO_WRITE_VI, /* Memory BAR WC mapping */ 1215284555Sarybchik} efx_nic_region_t; 1216284555Sarybchik 1217293927Sarybchikextern __checkReturn efx_rc_t 1218284555Sarybchikefx_nic_get_bar_region( 1219284555Sarybchik __in efx_nic_t *enp, 1220284555Sarybchik __in efx_nic_region_t region, 1221284555Sarybchik __out uint32_t *offsetp, 1222284555Sarybchik __out size_t *sizep); 1223284555Sarybchik 1224293927Sarybchikextern __checkReturn efx_rc_t 1225284555Sarybchikefx_nic_get_vi_pool( 1226284555Sarybchik __in efx_nic_t *enp, 1227284555Sarybchik __out uint32_t *evq_countp, 1228284555Sarybchik __out uint32_t *rxq_countp, 1229284555Sarybchik __out uint32_t *txq_countp); 1230284555Sarybchik 1231284555Sarybchik 1232227569Sphilip#if EFSYS_OPT_VPD 1233227569Sphilip 1234227569Sphiliptypedef enum efx_vpd_tag_e { 1235227569Sphilip EFX_VPD_ID = 0x02, 1236227569Sphilip EFX_VPD_END = 0x0f, 1237227569Sphilip EFX_VPD_RO = 0x10, 1238227569Sphilip EFX_VPD_RW = 0x11, 1239227569Sphilip} efx_vpd_tag_t; 1240227569Sphilip 1241227569Sphiliptypedef uint16_t efx_vpd_keyword_t; 1242227569Sphilip 1243227569Sphiliptypedef struct efx_vpd_value_s { 1244227569Sphilip efx_vpd_tag_t evv_tag; 1245227569Sphilip efx_vpd_keyword_t evv_keyword; 1246227569Sphilip uint8_t evv_length; 1247227569Sphilip uint8_t evv_value[0x100]; 1248227569Sphilip} efx_vpd_value_t; 1249227569Sphilip 1250227569Sphilip 1251227569Sphilip#define EFX_VPD_KEYWORD(x, y) ((x) | ((y) << 8)) 1252227569Sphilip 1253293927Sarybchikextern __checkReturn efx_rc_t 1254227569Sphilipefx_vpd_init( 1255227569Sphilip __in efx_nic_t *enp); 1256227569Sphilip 1257293927Sarybchikextern __checkReturn efx_rc_t 1258227569Sphilipefx_vpd_size( 1259227569Sphilip __in efx_nic_t *enp, 1260227569Sphilip __out size_t *sizep); 1261227569Sphilip 1262293927Sarybchikextern __checkReturn efx_rc_t 1263227569Sphilipefx_vpd_read( 1264227569Sphilip __in efx_nic_t *enp, 1265227569Sphilip __out_bcount(size) caddr_t data, 1266227569Sphilip __in size_t size); 1267227569Sphilip 1268293927Sarybchikextern __checkReturn efx_rc_t 1269227569Sphilipefx_vpd_verify( 1270227569Sphilip __in efx_nic_t *enp, 1271227569Sphilip __in_bcount(size) caddr_t data, 1272227569Sphilip __in size_t size); 1273227569Sphilip 1274293927Sarybchikextern __checkReturn efx_rc_t 1275227569Sphilipefx_vpd_reinit( 1276227569Sphilip __in efx_nic_t *enp, 1277227569Sphilip __in_bcount(size) caddr_t data, 1278227569Sphilip __in size_t size); 1279227569Sphilip 1280293927Sarybchikextern __checkReturn efx_rc_t 1281227569Sphilipefx_vpd_get( 1282227569Sphilip __in efx_nic_t *enp, 1283227569Sphilip __in_bcount(size) caddr_t data, 1284227569Sphilip __in size_t size, 1285227569Sphilip __inout efx_vpd_value_t *evvp); 1286227569Sphilip 1287293927Sarybchikextern __checkReturn efx_rc_t 1288227569Sphilipefx_vpd_set( 1289227569Sphilip __in efx_nic_t *enp, 1290227569Sphilip __inout_bcount(size) caddr_t data, 1291227569Sphilip __in size_t size, 1292227569Sphilip __in efx_vpd_value_t *evvp); 1293227569Sphilip 1294293927Sarybchikextern __checkReturn efx_rc_t 1295227569Sphilipefx_vpd_next( 1296227569Sphilip __in efx_nic_t *enp, 1297227569Sphilip __inout_bcount(size) caddr_t data, 1298227569Sphilip __in size_t size, 1299227569Sphilip __out efx_vpd_value_t *evvp, 1300227569Sphilip __inout unsigned int *contp); 1301227569Sphilip 1302293927Sarybchikextern __checkReturn efx_rc_t 1303227569Sphilipefx_vpd_write( 1304227569Sphilip __in efx_nic_t *enp, 1305227569Sphilip __in_bcount(size) caddr_t data, 1306227569Sphilip __in size_t size); 1307227569Sphilip 1308227569Sphilipextern void 1309227569Sphilipefx_vpd_fini( 1310227569Sphilip __in efx_nic_t *enp); 1311227569Sphilip 1312227569Sphilip#endif /* EFSYS_OPT_VPD */ 1313227569Sphilip 1314227569Sphilip/* NVRAM */ 1315227569Sphilip 1316227569Sphilip#if EFSYS_OPT_NVRAM 1317227569Sphilip 1318227569Sphiliptypedef enum efx_nvram_type_e { 1319227569Sphilip EFX_NVRAM_INVALID = 0, 1320227569Sphilip EFX_NVRAM_BOOTROM, 1321227569Sphilip EFX_NVRAM_BOOTROM_CFG, 1322227569Sphilip EFX_NVRAM_MC_FIRMWARE, 1323227569Sphilip EFX_NVRAM_MC_GOLDEN, 1324227569Sphilip EFX_NVRAM_PHY, 1325227569Sphilip EFX_NVRAM_NULLPHY, 1326280577Sarybchik EFX_NVRAM_FPGA, 1327280577Sarybchik EFX_NVRAM_FCFW, 1328280577Sarybchik EFX_NVRAM_CPLD, 1329280577Sarybchik EFX_NVRAM_FPGA_BACKUP, 1330284555Sarybchik EFX_NVRAM_DYNAMIC_CFG, 1331294385Sarybchik EFX_NVRAM_LICENSE, 1332227569Sphilip EFX_NVRAM_NTYPES, 1333227569Sphilip} efx_nvram_type_t; 1334227569Sphilip 1335293927Sarybchikextern __checkReturn efx_rc_t 1336227569Sphilipefx_nvram_init( 1337227569Sphilip __in efx_nic_t *enp); 1338227569Sphilip 1339227569Sphilip#if EFSYS_OPT_DIAG 1340227569Sphilip 1341293927Sarybchikextern __checkReturn efx_rc_t 1342227569Sphilipefx_nvram_test( 1343227569Sphilip __in efx_nic_t *enp); 1344227569Sphilip 1345227569Sphilip#endif /* EFSYS_OPT_DIAG */ 1346227569Sphilip 1347293927Sarybchikextern __checkReturn efx_rc_t 1348227569Sphilipefx_nvram_size( 1349227569Sphilip __in efx_nic_t *enp, 1350227569Sphilip __in efx_nvram_type_t type, 1351227569Sphilip __out size_t *sizep); 1352227569Sphilip 1353293927Sarybchikextern __checkReturn efx_rc_t 1354227569Sphilipefx_nvram_rw_start( 1355227569Sphilip __in efx_nic_t *enp, 1356227569Sphilip __in efx_nvram_type_t type, 1357227569Sphilip __out_opt size_t *pref_chunkp); 1358227569Sphilip 1359227569Sphilipextern void 1360227569Sphilipefx_nvram_rw_finish( 1361227569Sphilip __in efx_nic_t *enp, 1362227569Sphilip __in efx_nvram_type_t type); 1363227569Sphilip 1364293927Sarybchikextern __checkReturn efx_rc_t 1365227569Sphilipefx_nvram_get_version( 1366227569Sphilip __in efx_nic_t *enp, 1367227569Sphilip __in efx_nvram_type_t type, 1368227569Sphilip __out uint32_t *subtypep, 1369227569Sphilip __out_ecount(4) uint16_t version[4]); 1370227569Sphilip 1371293927Sarybchikextern __checkReturn efx_rc_t 1372227569Sphilipefx_nvram_read_chunk( 1373227569Sphilip __in efx_nic_t *enp, 1374227569Sphilip __in efx_nvram_type_t type, 1375227569Sphilip __in unsigned int offset, 1376227569Sphilip __out_bcount(size) caddr_t data, 1377227569Sphilip __in size_t size); 1378227569Sphilip 1379293927Sarybchikextern __checkReturn efx_rc_t 1380227569Sphilipefx_nvram_set_version( 1381227569Sphilip __in efx_nic_t *enp, 1382227569Sphilip __in efx_nvram_type_t type, 1383284555Sarybchik __in_ecount(4) uint16_t version[4]); 1384227569Sphilip 1385284555Sarybchik/* Validate contents of TLV formatted partition */ 1386293927Sarybchikextern __checkReturn efx_rc_t 1387284555Sarybchikefx_nvram_tlv_validate( 1388284555Sarybchik __in efx_nic_t *enp, 1389284555Sarybchik __in uint32_t partn, 1390284555Sarybchik __in_bcount(partn_size) caddr_t partn_data, 1391284555Sarybchik __in size_t partn_size); 1392284555Sarybchik 1393293927Sarybchikextern __checkReturn efx_rc_t 1394227569Sphilipefx_nvram_erase( 1395227569Sphilip __in efx_nic_t *enp, 1396227569Sphilip __in efx_nvram_type_t type); 1397227569Sphilip 1398293927Sarybchikextern __checkReturn efx_rc_t 1399227569Sphilipefx_nvram_write_chunk( 1400227569Sphilip __in efx_nic_t *enp, 1401227569Sphilip __in efx_nvram_type_t type, 1402227569Sphilip __in unsigned int offset, 1403227569Sphilip __in_bcount(size) caddr_t data, 1404227569Sphilip __in size_t size); 1405227569Sphilip 1406227569Sphilipextern void 1407227569Sphilipefx_nvram_fini( 1408227569Sphilip __in efx_nic_t *enp); 1409227569Sphilip 1410227569Sphilip#endif /* EFSYS_OPT_NVRAM */ 1411227569Sphilip 1412227569Sphilip#if EFSYS_OPT_BOOTCFG 1413227569Sphilip 1414293927Sarybchikextern efx_rc_t 1415227569Sphilipefx_bootcfg_read( 1416227569Sphilip __in efx_nic_t *enp, 1417227569Sphilip __out_bcount(size) caddr_t data, 1418227569Sphilip __in size_t size); 1419227569Sphilip 1420293927Sarybchikextern efx_rc_t 1421227569Sphilipefx_bootcfg_write( 1422227569Sphilip __in efx_nic_t *enp, 1423227569Sphilip __in_bcount(size) caddr_t data, 1424227569Sphilip __in size_t size); 1425227569Sphilip 1426227569Sphilip#endif /* EFSYS_OPT_BOOTCFG */ 1427227569Sphilip 1428227569Sphilip#if EFSYS_OPT_WOL 1429227569Sphilip 1430227569Sphiliptypedef enum efx_wol_type_e { 1431227569Sphilip EFX_WOL_TYPE_INVALID, 1432227569Sphilip EFX_WOL_TYPE_MAGIC, 1433227569Sphilip EFX_WOL_TYPE_BITMAP, 1434227569Sphilip EFX_WOL_TYPE_LINK, 1435227569Sphilip EFX_WOL_NTYPES, 1436227569Sphilip} efx_wol_type_t; 1437227569Sphilip 1438227569Sphiliptypedef enum efx_lightsout_offload_type_e { 1439227569Sphilip EFX_LIGHTSOUT_OFFLOAD_TYPE_INVALID, 1440227569Sphilip EFX_LIGHTSOUT_OFFLOAD_TYPE_ARP, 1441227569Sphilip EFX_LIGHTSOUT_OFFLOAD_TYPE_NS, 1442227569Sphilip} efx_lightsout_offload_type_t; 1443227569Sphilip 1444227569Sphilip#define EFX_WOL_BITMAP_MASK_SIZE (48) 1445227569Sphilip#define EFX_WOL_BITMAP_VALUE_SIZE (128) 1446227569Sphilip 1447227569Sphiliptypedef union efx_wol_param_u { 1448227569Sphilip struct { 1449227569Sphilip uint8_t mac_addr[6]; 1450227569Sphilip } ewp_magic; 1451227569Sphilip struct { 1452227569Sphilip uint8_t mask[EFX_WOL_BITMAP_MASK_SIZE]; /* 1 bit per byte */ 1453227569Sphilip uint8_t value[EFX_WOL_BITMAP_VALUE_SIZE]; /* value to match */ 1454227569Sphilip uint8_t value_len; 1455227569Sphilip } ewp_bitmap; 1456227569Sphilip} efx_wol_param_t; 1457227569Sphilip 1458227569Sphiliptypedef union efx_lightsout_offload_param_u { 1459227569Sphilip struct { 1460227569Sphilip uint8_t mac_addr[6]; 1461227569Sphilip uint32_t ip; 1462227569Sphilip } elop_arp; 1463227569Sphilip struct { 1464227569Sphilip uint8_t mac_addr[6]; 1465227569Sphilip uint32_t solicited_node[4]; 1466227569Sphilip uint32_t ip[4]; 1467227569Sphilip } elop_ns; 1468227569Sphilip} efx_lightsout_offload_param_t; 1469227569Sphilip 1470293927Sarybchikextern __checkReturn efx_rc_t 1471227569Sphilipefx_wol_init( 1472227569Sphilip __in efx_nic_t *enp); 1473227569Sphilip 1474293927Sarybchikextern __checkReturn efx_rc_t 1475227569Sphilipefx_wol_filter_clear( 1476227569Sphilip __in efx_nic_t *enp); 1477227569Sphilip 1478293927Sarybchikextern __checkReturn efx_rc_t 1479227569Sphilipefx_wol_filter_add( 1480227569Sphilip __in efx_nic_t *enp, 1481227569Sphilip __in efx_wol_type_t type, 1482227569Sphilip __in efx_wol_param_t *paramp, 1483227569Sphilip __out uint32_t *filter_idp); 1484227569Sphilip 1485293927Sarybchikextern __checkReturn efx_rc_t 1486227569Sphilipefx_wol_filter_remove( 1487227569Sphilip __in efx_nic_t *enp, 1488227569Sphilip __in uint32_t filter_id); 1489227569Sphilip 1490293927Sarybchikextern __checkReturn efx_rc_t 1491227569Sphilipefx_lightsout_offload_add( 1492227569Sphilip __in efx_nic_t *enp, 1493227569Sphilip __in efx_lightsout_offload_type_t type, 1494227569Sphilip __in efx_lightsout_offload_param_t *paramp, 1495227569Sphilip __out uint32_t *filter_idp); 1496227569Sphilip 1497293927Sarybchikextern __checkReturn efx_rc_t 1498227569Sphilipefx_lightsout_offload_remove( 1499227569Sphilip __in efx_nic_t *enp, 1500227569Sphilip __in efx_lightsout_offload_type_t type, 1501227569Sphilip __in uint32_t filter_id); 1502227569Sphilip 1503227569Sphilipextern void 1504227569Sphilipefx_wol_fini( 1505227569Sphilip __in efx_nic_t *enp); 1506227569Sphilip 1507227569Sphilip#endif /* EFSYS_OPT_WOL */ 1508227569Sphilip 1509227569Sphilip#if EFSYS_OPT_DIAG 1510227569Sphilip 1511227569Sphiliptypedef enum efx_pattern_type_t { 1512227569Sphilip EFX_PATTERN_BYTE_INCREMENT = 0, 1513227569Sphilip EFX_PATTERN_ALL_THE_SAME, 1514227569Sphilip EFX_PATTERN_BIT_ALTERNATE, 1515227569Sphilip EFX_PATTERN_BYTE_ALTERNATE, 1516227569Sphilip EFX_PATTERN_BYTE_CHANGING, 1517227569Sphilip EFX_PATTERN_BIT_SWEEP, 1518227569Sphilip EFX_PATTERN_NTYPES 1519227569Sphilip} efx_pattern_type_t; 1520227569Sphilip 1521227569Sphiliptypedef void 1522227569Sphilip(*efx_sram_pattern_fn_t)( 1523227569Sphilip __in size_t row, 1524227569Sphilip __in boolean_t negate, 1525227569Sphilip __out efx_qword_t *eqp); 1526227569Sphilip 1527293927Sarybchikextern __checkReturn efx_rc_t 1528227569Sphilipefx_sram_test( 1529227569Sphilip __in efx_nic_t *enp, 1530227569Sphilip __in efx_pattern_type_t type); 1531227569Sphilip 1532227569Sphilip#endif /* EFSYS_OPT_DIAG */ 1533227569Sphilip 1534293927Sarybchikextern __checkReturn efx_rc_t 1535227569Sphilipefx_sram_buf_tbl_set( 1536227569Sphilip __in efx_nic_t *enp, 1537227569Sphilip __in uint32_t id, 1538227569Sphilip __in efsys_mem_t *esmp, 1539227569Sphilip __in size_t n); 1540227569Sphilip 1541227569Sphilipextern void 1542227569Sphilipefx_sram_buf_tbl_clear( 1543227569Sphilip __in efx_nic_t *enp, 1544227569Sphilip __in uint32_t id, 1545227569Sphilip __in size_t n); 1546227569Sphilip 1547227569Sphilip#define EFX_BUF_TBL_SIZE 0x20000 1548227569Sphilip 1549227569Sphilip#define EFX_BUF_SIZE 4096 1550227569Sphilip 1551227569Sphilip/* EV */ 1552227569Sphilip 1553227569Sphiliptypedef struct efx_evq_s efx_evq_t; 1554227569Sphilip 1555227569Sphilip#if EFSYS_OPT_QSTATS 1556227569Sphilip 1557284555Sarybchik/* START MKCONFIG GENERATED EfxHeaderEventQueueBlock 6f3843f5fe7cc843 */ 1558227569Sphiliptypedef enum efx_ev_qstat_e { 1559227569Sphilip EV_ALL, 1560227569Sphilip EV_RX, 1561227569Sphilip EV_RX_OK, 1562227569Sphilip EV_RX_FRM_TRUNC, 1563227569Sphilip EV_RX_TOBE_DISC, 1564227569Sphilip EV_RX_PAUSE_FRM_ERR, 1565227569Sphilip EV_RX_BUF_OWNER_ID_ERR, 1566227569Sphilip EV_RX_IPV4_HDR_CHKSUM_ERR, 1567227569Sphilip EV_RX_TCP_UDP_CHKSUM_ERR, 1568227569Sphilip EV_RX_ETH_CRC_ERR, 1569227569Sphilip EV_RX_IP_FRAG_ERR, 1570227569Sphilip EV_RX_MCAST_PKT, 1571227569Sphilip EV_RX_MCAST_HASH_MATCH, 1572227569Sphilip EV_RX_TCP_IPV4, 1573227569Sphilip EV_RX_TCP_IPV6, 1574227569Sphilip EV_RX_UDP_IPV4, 1575227569Sphilip EV_RX_UDP_IPV6, 1576227569Sphilip EV_RX_OTHER_IPV4, 1577227569Sphilip EV_RX_OTHER_IPV6, 1578227569Sphilip EV_RX_NON_IP, 1579284555Sarybchik EV_RX_BATCH, 1580227569Sphilip EV_TX, 1581227569Sphilip EV_TX_WQ_FF_FULL, 1582227569Sphilip EV_TX_PKT_ERR, 1583227569Sphilip EV_TX_PKT_TOO_BIG, 1584227569Sphilip EV_TX_UNEXPECTED, 1585227569Sphilip EV_GLOBAL, 1586227569Sphilip EV_GLOBAL_MNT, 1587227569Sphilip EV_DRIVER, 1588227569Sphilip EV_DRIVER_SRM_UPD_DONE, 1589227569Sphilip EV_DRIVER_TX_DESCQ_FLS_DONE, 1590227569Sphilip EV_DRIVER_RX_DESCQ_FLS_DONE, 1591227569Sphilip EV_DRIVER_RX_DESCQ_FLS_FAILED, 1592227569Sphilip EV_DRIVER_RX_DSC_ERROR, 1593227569Sphilip EV_DRIVER_TX_DSC_ERROR, 1594227569Sphilip EV_DRV_GEN, 1595227569Sphilip EV_MCDI_RESPONSE, 1596227569Sphilip EV_NQSTATS 1597227569Sphilip} efx_ev_qstat_t; 1598227569Sphilip 1599227569Sphilip/* END MKCONFIG GENERATED EfxHeaderEventQueueBlock */ 1600227569Sphilip 1601227569Sphilip#endif /* EFSYS_OPT_QSTATS */ 1602227569Sphilip 1603293927Sarybchikextern __checkReturn efx_rc_t 1604227569Sphilipefx_ev_init( 1605227569Sphilip __in efx_nic_t *enp); 1606227569Sphilip 1607227569Sphilipextern void 1608227569Sphilipefx_ev_fini( 1609227569Sphilip __in efx_nic_t *enp); 1610227569Sphilip 1611227569Sphilip#define EFX_EVQ_MAXNEVS 32768 1612227569Sphilip#define EFX_EVQ_MINNEVS 512 1613227569Sphilip 1614227569Sphilip#define EFX_EVQ_SIZE(_nevs) ((_nevs) * sizeof (efx_qword_t)) 1615227569Sphilip#define EFX_EVQ_NBUFS(_nevs) (EFX_EVQ_SIZE(_nevs) / EFX_BUF_SIZE) 1616227569Sphilip 1617293927Sarybchikextern __checkReturn efx_rc_t 1618227569Sphilipefx_ev_qcreate( 1619227569Sphilip __in efx_nic_t *enp, 1620227569Sphilip __in unsigned int index, 1621227569Sphilip __in efsys_mem_t *esmp, 1622227569Sphilip __in size_t n, 1623227569Sphilip __in uint32_t id, 1624227569Sphilip __deref_out efx_evq_t **eepp); 1625227569Sphilip 1626227569Sphilipextern void 1627227569Sphilipefx_ev_qpost( 1628227569Sphilip __in efx_evq_t *eep, 1629227569Sphilip __in uint16_t data); 1630227569Sphilip 1631227569Sphiliptypedef __checkReturn boolean_t 1632227569Sphilip(*efx_initialized_ev_t)( 1633227569Sphilip __in_opt void *arg); 1634227569Sphilip 1635227569Sphilip#define EFX_PKT_UNICAST 0x0004 1636227569Sphilip#define EFX_PKT_START 0x0008 1637227569Sphilip 1638227569Sphilip#define EFX_PKT_VLAN_TAGGED 0x0010 1639227569Sphilip#define EFX_CKSUM_TCPUDP 0x0020 1640227569Sphilip#define EFX_CKSUM_IPV4 0x0040 1641227569Sphilip#define EFX_PKT_CONT 0x0080 1642227569Sphilip 1643227569Sphilip#define EFX_CHECK_VLAN 0x0100 1644227569Sphilip#define EFX_PKT_TCP 0x0200 1645227569Sphilip#define EFX_PKT_UDP 0x0400 1646227569Sphilip#define EFX_PKT_IPV4 0x0800 1647227569Sphilip 1648227569Sphilip#define EFX_PKT_IPV6 0x1000 1649284555Sarybchik#define EFX_PKT_PREFIX_LEN 0x2000 1650227569Sphilip#define EFX_ADDR_MISMATCH 0x4000 1651227569Sphilip#define EFX_DISCARD 0x8000 1652227569Sphilip 1653227569Sphilip#define EFX_EV_RX_NLABELS 32 1654227569Sphilip#define EFX_EV_TX_NLABELS 32 1655227569Sphilip 1656227569Sphiliptypedef __checkReturn boolean_t 1657227569Sphilip(*efx_rx_ev_t)( 1658227569Sphilip __in_opt void *arg, 1659227569Sphilip __in uint32_t label, 1660227569Sphilip __in uint32_t id, 1661227569Sphilip __in uint32_t size, 1662227569Sphilip __in uint16_t flags); 1663227569Sphilip 1664227569Sphiliptypedef __checkReturn boolean_t 1665227569Sphilip(*efx_tx_ev_t)( 1666227569Sphilip __in_opt void *arg, 1667227569Sphilip __in uint32_t label, 1668227569Sphilip __in uint32_t id); 1669227569Sphilip 1670227569Sphilip#define EFX_EXCEPTION_RX_RECOVERY 0x00000001 1671227569Sphilip#define EFX_EXCEPTION_RX_DSC_ERROR 0x00000002 1672227569Sphilip#define EFX_EXCEPTION_TX_DSC_ERROR 0x00000003 1673227569Sphilip#define EFX_EXCEPTION_UNKNOWN_SENSOREVT 0x00000004 1674227569Sphilip#define EFX_EXCEPTION_FWALERT_SRAM 0x00000005 1675227569Sphilip#define EFX_EXCEPTION_UNKNOWN_FWALERT 0x00000006 1676284555Sarybchik#define EFX_EXCEPTION_RX_ERROR 0x00000007 1677284555Sarybchik#define EFX_EXCEPTION_TX_ERROR 0x00000008 1678284555Sarybchik#define EFX_EXCEPTION_EV_ERROR 0x00000009 1679227569Sphilip 1680227569Sphiliptypedef __checkReturn boolean_t 1681227569Sphilip(*efx_exception_ev_t)( 1682227569Sphilip __in_opt void *arg, 1683227569Sphilip __in uint32_t label, 1684227569Sphilip __in uint32_t data); 1685227569Sphilip 1686227569Sphiliptypedef __checkReturn boolean_t 1687227569Sphilip(*efx_rxq_flush_done_ev_t)( 1688227569Sphilip __in_opt void *arg, 1689265884Sgnn __in uint32_t rxq_index); 1690227569Sphilip 1691227569Sphiliptypedef __checkReturn boolean_t 1692227569Sphilip(*efx_rxq_flush_failed_ev_t)( 1693227569Sphilip __in_opt void *arg, 1694265884Sgnn __in uint32_t rxq_index); 1695227569Sphilip 1696227569Sphiliptypedef __checkReturn boolean_t 1697227569Sphilip(*efx_txq_flush_done_ev_t)( 1698227569Sphilip __in_opt void *arg, 1699265884Sgnn __in uint32_t txq_index); 1700227569Sphilip 1701227569Sphiliptypedef __checkReturn boolean_t 1702227569Sphilip(*efx_software_ev_t)( 1703227569Sphilip __in_opt void *arg, 1704227569Sphilip __in uint16_t magic); 1705227569Sphilip 1706227569Sphiliptypedef __checkReturn boolean_t 1707227569Sphilip(*efx_sram_ev_t)( 1708227569Sphilip __in_opt void *arg, 1709227569Sphilip __in uint32_t code); 1710227569Sphilip 1711227569Sphilip#define EFX_SRAM_CLEAR 0 1712227569Sphilip#define EFX_SRAM_UPDATE 1 1713227569Sphilip#define EFX_SRAM_ILLEGAL_CLEAR 2 1714227569Sphilip 1715227569Sphiliptypedef __checkReturn boolean_t 1716227569Sphilip(*efx_wake_up_ev_t)( 1717227569Sphilip __in_opt void *arg, 1718227569Sphilip __in uint32_t label); 1719227569Sphilip 1720227569Sphiliptypedef __checkReturn boolean_t 1721227569Sphilip(*efx_timer_ev_t)( 1722227569Sphilip __in_opt void *arg, 1723227569Sphilip __in uint32_t label); 1724227569Sphilip 1725227569Sphiliptypedef __checkReturn boolean_t 1726227569Sphilip(*efx_link_change_ev_t)( 1727227569Sphilip __in_opt void *arg, 1728227569Sphilip __in efx_link_mode_t link_mode); 1729227569Sphilip 1730227569Sphilip#if EFSYS_OPT_MON_STATS 1731227569Sphilip 1732227569Sphiliptypedef __checkReturn boolean_t 1733227569Sphilip(*efx_monitor_ev_t)( 1734227569Sphilip __in_opt void *arg, 1735227569Sphilip __in efx_mon_stat_t id, 1736227569Sphilip __in efx_mon_stat_value_t value); 1737227569Sphilip 1738227569Sphilip#endif /* EFSYS_OPT_MON_STATS */ 1739227569Sphilip 1740227569Sphilip#if EFSYS_OPT_MAC_STATS 1741227569Sphilip 1742227569Sphiliptypedef __checkReturn boolean_t 1743227569Sphilip(*efx_mac_stats_ev_t)( 1744227569Sphilip __in_opt void *arg, 1745227569Sphilip __in uint32_t generation 1746227569Sphilip ); 1747227569Sphilip 1748227569Sphilip#endif /* EFSYS_OPT_MAC_STATS */ 1749227569Sphilip 1750227569Sphiliptypedef struct efx_ev_callbacks_s { 1751227569Sphilip efx_initialized_ev_t eec_initialized; 1752227569Sphilip efx_rx_ev_t eec_rx; 1753227569Sphilip efx_tx_ev_t eec_tx; 1754227569Sphilip efx_exception_ev_t eec_exception; 1755227569Sphilip efx_rxq_flush_done_ev_t eec_rxq_flush_done; 1756227569Sphilip efx_rxq_flush_failed_ev_t eec_rxq_flush_failed; 1757227569Sphilip efx_txq_flush_done_ev_t eec_txq_flush_done; 1758227569Sphilip efx_software_ev_t eec_software; 1759227569Sphilip efx_sram_ev_t eec_sram; 1760227569Sphilip efx_wake_up_ev_t eec_wake_up; 1761227569Sphilip efx_timer_ev_t eec_timer; 1762227569Sphilip efx_link_change_ev_t eec_link_change; 1763227569Sphilip#if EFSYS_OPT_MON_STATS 1764227569Sphilip efx_monitor_ev_t eec_monitor; 1765227569Sphilip#endif /* EFSYS_OPT_MON_STATS */ 1766227569Sphilip#if EFSYS_OPT_MAC_STATS 1767227569Sphilip efx_mac_stats_ev_t eec_mac_stats; 1768284555Sarybchik#endif /* EFSYS_OPT_MAC_STATS */ 1769227569Sphilip} efx_ev_callbacks_t; 1770227569Sphilip 1771227569Sphilipextern __checkReturn boolean_t 1772227569Sphilipefx_ev_qpending( 1773227569Sphilip __in efx_evq_t *eep, 1774227569Sphilip __in unsigned int count); 1775227569Sphilip 1776227569Sphilip#if EFSYS_OPT_EV_PREFETCH 1777227569Sphilip 1778227569Sphilipextern void 1779227569Sphilipefx_ev_qprefetch( 1780227569Sphilip __in efx_evq_t *eep, 1781227569Sphilip __in unsigned int count); 1782227569Sphilip 1783227569Sphilip#endif /* EFSYS_OPT_EV_PREFETCH */ 1784227569Sphilip 1785227569Sphilipextern void 1786227569Sphilipefx_ev_qpoll( 1787227569Sphilip __in efx_evq_t *eep, 1788227569Sphilip __inout unsigned int *countp, 1789227569Sphilip __in const efx_ev_callbacks_t *eecp, 1790227569Sphilip __in_opt void *arg); 1791227569Sphilip 1792293927Sarybchikextern __checkReturn efx_rc_t 1793227569Sphilipefx_ev_qmoderate( 1794227569Sphilip __in efx_evq_t *eep, 1795227569Sphilip __in unsigned int us); 1796227569Sphilip 1797293927Sarybchikextern __checkReturn efx_rc_t 1798227569Sphilipefx_ev_qprime( 1799227569Sphilip __in efx_evq_t *eep, 1800227569Sphilip __in unsigned int count); 1801227569Sphilip 1802227569Sphilip#if EFSYS_OPT_QSTATS 1803227569Sphilip 1804227569Sphilip#if EFSYS_OPT_NAMES 1805227569Sphilip 1806284555Sarybchikextern const char * 1807227569Sphilipefx_ev_qstat_name( 1808227569Sphilip __in efx_nic_t *enp, 1809227569Sphilip __in unsigned int id); 1810227569Sphilip 1811227569Sphilip#endif /* EFSYS_OPT_NAMES */ 1812227569Sphilip 1813227569Sphilipextern void 1814227569Sphilipefx_ev_qstats_update( 1815227569Sphilip __in efx_evq_t *eep, 1816227569Sphilip __inout_ecount(EV_NQSTATS) efsys_stat_t *stat); 1817227569Sphilip 1818227569Sphilip#endif /* EFSYS_OPT_QSTATS */ 1819227569Sphilip 1820227569Sphilipextern void 1821227569Sphilipefx_ev_qdestroy( 1822227569Sphilip __in efx_evq_t *eep); 1823227569Sphilip 1824227569Sphilip/* RX */ 1825227569Sphilip 1826293927Sarybchikextern __checkReturn efx_rc_t 1827227569Sphilipefx_rx_init( 1828284555Sarybchik __inout efx_nic_t *enp); 1829227569Sphilip 1830227569Sphilipextern void 1831227569Sphilipefx_rx_fini( 1832227569Sphilip __in efx_nic_t *enp); 1833227569Sphilip 1834227569Sphilip#if EFSYS_OPT_RX_SCATTER 1835293927Sarybchik __checkReturn efx_rc_t 1836227569Sphilipefx_rx_scatter_enable( 1837227569Sphilip __in efx_nic_t *enp, 1838227569Sphilip __in unsigned int buf_size); 1839227569Sphilip#endif /* EFSYS_OPT_RX_SCATTER */ 1840227569Sphilip 1841227569Sphilip#if EFSYS_OPT_RX_SCALE 1842227569Sphilip 1843227569Sphiliptypedef enum efx_rx_hash_alg_e { 1844227569Sphilip EFX_RX_HASHALG_LFSR = 0, 1845227569Sphilip EFX_RX_HASHALG_TOEPLITZ 1846227569Sphilip} efx_rx_hash_alg_t; 1847227569Sphilip 1848227569Sphiliptypedef enum efx_rx_hash_type_e { 1849227569Sphilip EFX_RX_HASH_IPV4 = 0, 1850227569Sphilip EFX_RX_HASH_TCPIPV4, 1851227569Sphilip EFX_RX_HASH_IPV6, 1852227569Sphilip EFX_RX_HASH_TCPIPV6, 1853227569Sphilip} efx_rx_hash_type_t; 1854227569Sphilip 1855284555Sarybchiktypedef enum efx_rx_hash_support_e { 1856284555Sarybchik EFX_RX_HASH_UNAVAILABLE = 0, /* Hardware hash not inserted */ 1857284555Sarybchik EFX_RX_HASH_AVAILABLE /* Insert hash with/without RSS */ 1858284555Sarybchik} efx_rx_hash_support_t; 1859284555Sarybchik 1860227569Sphilip#define EFX_RSS_TBL_SIZE 128 /* Rows in RX indirection table */ 1861227569Sphilip#define EFX_MAXRSS 64 /* RX indirection entry range */ 1862227569Sphilip#define EFX_MAXRSS_LEGACY 16 /* See bug16611 and bug17213 */ 1863227569Sphilip 1864284555Sarybchiktypedef enum efx_rx_scale_support_e { 1865284555Sarybchik EFX_RX_SCALE_UNAVAILABLE = 0, /* Not supported */ 1866284555Sarybchik EFX_RX_SCALE_EXCLUSIVE, /* Writable key/indirection table */ 1867284555Sarybchik EFX_RX_SCALE_SHARED /* Read-only key/indirection table */ 1868284555Sarybchik} efx_rx_scale_support_t; 1869284555Sarybchik 1870293927Sarybchikextern __checkReturn efx_rc_t 1871284555Sarybchikefx_rx_hash_support_get( 1872284555Sarybchik __in efx_nic_t *enp, 1873284555Sarybchik __out efx_rx_hash_support_t *supportp); 1874284555Sarybchik 1875284555Sarybchik 1876293927Sarybchikextern __checkReturn efx_rc_t 1877284555Sarybchikefx_rx_scale_support_get( 1878284555Sarybchik __in efx_nic_t *enp, 1879284555Sarybchik __out efx_rx_scale_support_t *supportp); 1880284555Sarybchik 1881293927Sarybchikextern __checkReturn efx_rc_t 1882227569Sphilipefx_rx_scale_mode_set( 1883227569Sphilip __in efx_nic_t *enp, 1884227569Sphilip __in efx_rx_hash_alg_t alg, 1885227569Sphilip __in efx_rx_hash_type_t type, 1886227569Sphilip __in boolean_t insert); 1887227569Sphilip 1888293927Sarybchikextern __checkReturn efx_rc_t 1889227569Sphilipefx_rx_scale_tbl_set( 1890227569Sphilip __in efx_nic_t *enp, 1891227569Sphilip __in_ecount(n) unsigned int *table, 1892227569Sphilip __in size_t n); 1893227569Sphilip 1894293927Sarybchikextern __checkReturn efx_rc_t 1895284555Sarybchikefx_rx_scale_key_set( 1896227569Sphilip __in efx_nic_t *enp, 1897227569Sphilip __in_ecount(n) uint8_t *key, 1898227569Sphilip __in size_t n); 1899227569Sphilip 1900294008Sarybchikextern __checkReturn uint32_t 1901284555Sarybchikefx_psuedo_hdr_hash_get( 1902227569Sphilip __in efx_nic_t *enp, 1903284555Sarybchik __in efx_rx_hash_alg_t func, 1904284555Sarybchik __in uint8_t *buffer); 1905227569Sphilip 1906284555Sarybchik#endif /* EFSYS_OPT_RX_SCALE */ 1907227569Sphilip 1908293927Sarybchikextern __checkReturn efx_rc_t 1909284555Sarybchikefx_psuedo_hdr_pkt_length_get( 1910284555Sarybchik __in efx_nic_t *enp, 1911284555Sarybchik __in uint8_t *buffer, 1912284555Sarybchik __out uint16_t *pkt_lengthp); 1913227569Sphilip 1914280553Sarybchik#define EFX_RXQ_MAXNDESCS 4096 1915280553Sarybchik#define EFX_RXQ_MINNDESCS 512 1916227569Sphilip 1917280553Sarybchik#define EFX_RXQ_SIZE(_ndescs) ((_ndescs) * sizeof (efx_qword_t)) 1918280553Sarybchik#define EFX_RXQ_NBUFS(_ndescs) (EFX_RXQ_SIZE(_ndescs) / EFX_BUF_SIZE) 1919280553Sarybchik#define EFX_RXQ_LIMIT(_ndescs) ((_ndescs) - 16) 1920280562Sarybchik#define EFX_RXQ_DC_NDESCS(_dcsize) (8 << _dcsize) 1921227569Sphilip 1922227569Sphiliptypedef enum efx_rxq_type_e { 1923227569Sphilip EFX_RXQ_TYPE_DEFAULT, 1924227569Sphilip EFX_RXQ_TYPE_SCATTER, 1925227569Sphilip EFX_RXQ_NTYPES 1926227569Sphilip} efx_rxq_type_t; 1927227569Sphilip 1928293927Sarybchikextern __checkReturn efx_rc_t 1929227569Sphilipefx_rx_qcreate( 1930227569Sphilip __in efx_nic_t *enp, 1931227569Sphilip __in unsigned int index, 1932227569Sphilip __in unsigned int label, 1933227569Sphilip __in efx_rxq_type_t type, 1934227569Sphilip __in efsys_mem_t *esmp, 1935227569Sphilip __in size_t n, 1936227569Sphilip __in uint32_t id, 1937227569Sphilip __in efx_evq_t *eep, 1938227569Sphilip __deref_out efx_rxq_t **erpp); 1939227569Sphilip 1940227569Sphiliptypedef struct efx_buffer_s { 1941227569Sphilip efsys_dma_addr_t eb_addr; 1942227569Sphilip size_t eb_size; 1943227569Sphilip boolean_t eb_eop; 1944227569Sphilip} efx_buffer_t; 1945227569Sphilip 1946284555Sarybchiktypedef struct efx_desc_s { 1947284555Sarybchik efx_qword_t ed_eq; 1948284555Sarybchik} efx_desc_t; 1949284555Sarybchik 1950227569Sphilipextern void 1951227569Sphilipefx_rx_qpost( 1952227569Sphilip __in efx_rxq_t *erp, 1953227569Sphilip __in_ecount(n) efsys_dma_addr_t *addrp, 1954227569Sphilip __in size_t size, 1955227569Sphilip __in unsigned int n, 1956227569Sphilip __in unsigned int completed, 1957227569Sphilip __in unsigned int added); 1958227569Sphilip 1959227569Sphilipextern void 1960227569Sphilipefx_rx_qpush( 1961227569Sphilip __in efx_rxq_t *erp, 1962284555Sarybchik __in unsigned int added, 1963284555Sarybchik __inout unsigned int *pushedp); 1964227569Sphilip 1965293927Sarybchikextern __checkReturn efx_rc_t 1966227569Sphilipefx_rx_qflush( 1967227569Sphilip __in efx_rxq_t *erp); 1968227569Sphilip 1969227569Sphilipextern void 1970227569Sphilipefx_rx_qenable( 1971227569Sphilip __in efx_rxq_t *erp); 1972227569Sphilip 1973227569Sphilipextern void 1974227569Sphilipefx_rx_qdestroy( 1975227569Sphilip __in efx_rxq_t *erp); 1976227569Sphilip 1977227569Sphilip/* TX */ 1978227569Sphilip 1979227569Sphiliptypedef struct efx_txq_s efx_txq_t; 1980227569Sphilip 1981227569Sphilip#if EFSYS_OPT_QSTATS 1982227569Sphilip 1983284555Sarybchik/* START MKCONFIG GENERATED EfxHeaderTransmitQueueBlock 12dff8778598b2db */ 1984227569Sphiliptypedef enum efx_tx_qstat_e { 1985227569Sphilip TX_POST, 1986284555Sarybchik TX_POST_PIO, 1987227569Sphilip TX_NQSTATS 1988227569Sphilip} efx_tx_qstat_t; 1989227569Sphilip 1990227569Sphilip/* END MKCONFIG GENERATED EfxHeaderTransmitQueueBlock */ 1991227569Sphilip 1992227569Sphilip#endif /* EFSYS_OPT_QSTATS */ 1993227569Sphilip 1994293927Sarybchikextern __checkReturn efx_rc_t 1995227569Sphilipefx_tx_init( 1996227569Sphilip __in efx_nic_t *enp); 1997227569Sphilip 1998227569Sphilipextern void 1999227569Sphilipefx_tx_fini( 2000227569Sphilip __in efx_nic_t *enp); 2001227569Sphilip 2002284555Sarybchik#define EFX_BUG35388_WORKAROUND(_encp) \ 2003284555Sarybchik (((_encp) == NULL) ? 1 : ((_encp)->enc_bug35388_workaround != 0)) 2004284555Sarybchik 2005284555Sarybchik#define EFX_TXQ_MAXNDESCS(_encp) \ 2006284555Sarybchik ((EFX_BUG35388_WORKAROUND(_encp)) ? 2048 : 4096) 2007284555Sarybchik 2008280553Sarybchik#define EFX_TXQ_MINNDESCS 512 2009227569Sphilip 2010280553Sarybchik#define EFX_TXQ_SIZE(_ndescs) ((_ndescs) * sizeof (efx_qword_t)) 2011280553Sarybchik#define EFX_TXQ_NBUFS(_ndescs) (EFX_TXQ_SIZE(_ndescs) / EFX_BUF_SIZE) 2012280553Sarybchik#define EFX_TXQ_LIMIT(_ndescs) ((_ndescs) - 16) 2013280562Sarybchik#define EFX_TXQ_DC_NDESCS(_dcsize) (8 << _dcsize) 2014227569Sphilip 2015284555Sarybchik#define EFX_TXQ_MAX_BUFS 8 /* Maximum independent of EFX_BUG35388_WORKAROUND. */ 2016284555Sarybchik 2017293955Sarybchik#define EFX_TXQ_CKSUM_IPV4 0x0001 2018293955Sarybchik#define EFX_TXQ_CKSUM_TCPUDP 0x0002 2019294381Sarybchik#define EFX_TXQ_FATSOV2 0x0004 2020293955Sarybchik 2021293927Sarybchikextern __checkReturn efx_rc_t 2022227569Sphilipefx_tx_qcreate( 2023227569Sphilip __in efx_nic_t *enp, 2024227569Sphilip __in unsigned int index, 2025227569Sphilip __in unsigned int label, 2026227569Sphilip __in efsys_mem_t *esmp, 2027227569Sphilip __in size_t n, 2028227569Sphilip __in uint32_t id, 2029227569Sphilip __in uint16_t flags, 2030227569Sphilip __in efx_evq_t *eep, 2031284555Sarybchik __deref_out efx_txq_t **etpp, 2032284555Sarybchik __out unsigned int *addedp); 2033227569Sphilip 2034293927Sarybchikextern __checkReturn efx_rc_t 2035227569Sphilipefx_tx_qpost( 2036227569Sphilip __in efx_txq_t *etp, 2037227569Sphilip __in_ecount(n) efx_buffer_t *eb, 2038227569Sphilip __in unsigned int n, 2039227569Sphilip __in unsigned int completed, 2040227569Sphilip __inout unsigned int *addedp); 2041227569Sphilip 2042293927Sarybchikextern __checkReturn efx_rc_t 2043280589Sarybchikefx_tx_qpace( 2044280589Sarybchik __in efx_txq_t *etp, 2045280589Sarybchik __in unsigned int ns); 2046280589Sarybchik 2047284555Sarybchikextern void 2048227569Sphilipefx_tx_qpush( 2049284555Sarybchik __in efx_txq_t *etp, 2050284555Sarybchik __in unsigned int added, 2051284555Sarybchik __in unsigned int pushed); 2052227569Sphilip 2053293927Sarybchikextern __checkReturn efx_rc_t 2054227569Sphilipefx_tx_qflush( 2055284555Sarybchik __in efx_txq_t *etp); 2056227569Sphilip 2057284555Sarybchikextern void 2058227569Sphilipefx_tx_qenable( 2059284555Sarybchik __in efx_txq_t *etp); 2060227569Sphilip 2061293927Sarybchikextern __checkReturn efx_rc_t 2062284555Sarybchikefx_tx_qpio_enable( 2063284555Sarybchik __in efx_txq_t *etp); 2064284555Sarybchik 2065284555Sarybchikextern void 2066284555Sarybchikefx_tx_qpio_disable( 2067284555Sarybchik __in efx_txq_t *etp); 2068284555Sarybchik 2069293927Sarybchikextern __checkReturn efx_rc_t 2070284555Sarybchikefx_tx_qpio_write( 2071284555Sarybchik __in efx_txq_t *etp, 2072284555Sarybchik __in_ecount(buf_length) uint8_t *buffer, 2073284555Sarybchik __in size_t buf_length, 2074284555Sarybchik __in size_t pio_buf_offset); 2075284555Sarybchik 2076293927Sarybchikextern __checkReturn efx_rc_t 2077284555Sarybchikefx_tx_qpio_post( 2078284555Sarybchik __in efx_txq_t *etp, 2079284555Sarybchik __in size_t pkt_length, 2080284555Sarybchik __in unsigned int completed, 2081284555Sarybchik __inout unsigned int *addedp); 2082284555Sarybchik 2083293927Sarybchikextern __checkReturn efx_rc_t 2084284555Sarybchikefx_tx_qdesc_post( 2085284555Sarybchik __in efx_txq_t *etp, 2086284555Sarybchik __in_ecount(n) efx_desc_t *ed, 2087284555Sarybchik __in unsigned int n, 2088284555Sarybchik __in unsigned int completed, 2089284555Sarybchik __inout unsigned int *addedp); 2090284555Sarybchik 2091284555Sarybchikextern void 2092284555Sarybchikefx_tx_qdesc_dma_create( 2093284555Sarybchik __in efx_txq_t *etp, 2094284555Sarybchik __in efsys_dma_addr_t addr, 2095284555Sarybchik __in size_t size, 2096284555Sarybchik __in boolean_t eop, 2097284555Sarybchik __out efx_desc_t *edp); 2098284555Sarybchik 2099284555Sarybchikextern void 2100284555Sarybchikefx_tx_qdesc_tso_create( 2101284555Sarybchik __in efx_txq_t *etp, 2102284555Sarybchik __in uint16_t ipv4_id, 2103284555Sarybchik __in uint32_t tcp_seq, 2104284555Sarybchik __in uint8_t tcp_flags, 2105284555Sarybchik __out efx_desc_t *edp); 2106284555Sarybchik 2107294381Sarybchik/* Number of FATSOv2 option descriptors */ 2108294381Sarybchik#define EFX_TX_FATSOV2_OPT_NDESCS 2 2109294381Sarybchik 2110294381Sarybchik/* Maximum number of DMA segments per TSO packet (not superframe) */ 2111294381Sarybchik#define EFX_TX_FATSOV2_DMA_SEGS_PER_PKT_MAX 24 2112294381Sarybchik 2113284555Sarybchikextern void 2114294381Sarybchikefx_tx_qdesc_tso2_create( 2115294381Sarybchik __in efx_txq_t *etp, 2116294381Sarybchik __in uint16_t ipv4_id, 2117294381Sarybchik __in uint32_t tcp_seq, 2118294381Sarybchik __in uint16_t tcp_mss, 2119294381Sarybchik __out_ecount(count) efx_desc_t *edp, 2120294381Sarybchik __in int count); 2121294381Sarybchik 2122294381Sarybchikextern void 2123284555Sarybchikefx_tx_qdesc_vlantci_create( 2124284555Sarybchik __in efx_txq_t *etp, 2125284555Sarybchik __in uint16_t tci, 2126284555Sarybchik __out efx_desc_t *edp); 2127284555Sarybchik 2128227569Sphilip#if EFSYS_OPT_QSTATS 2129227569Sphilip 2130227569Sphilip#if EFSYS_OPT_NAMES 2131227569Sphilip 2132284555Sarybchikextern const char * 2133227569Sphilipefx_tx_qstat_name( 2134227569Sphilip __in efx_nic_t *etp, 2135227569Sphilip __in unsigned int id); 2136227569Sphilip 2137227569Sphilip#endif /* EFSYS_OPT_NAMES */ 2138227569Sphilip 2139227569Sphilipextern void 2140227569Sphilipefx_tx_qstats_update( 2141227569Sphilip __in efx_txq_t *etp, 2142227569Sphilip __inout_ecount(TX_NQSTATS) efsys_stat_t *stat); 2143227569Sphilip 2144227569Sphilip#endif /* EFSYS_OPT_QSTATS */ 2145227569Sphilip 2146227569Sphilipextern void 2147227569Sphilipefx_tx_qdestroy( 2148227569Sphilip __in efx_txq_t *etp); 2149227569Sphilip 2150227569Sphilip 2151227569Sphilip/* FILTER */ 2152227569Sphilip 2153227569Sphilip#if EFSYS_OPT_FILTER 2154227569Sphilip 2155284555Sarybchik#define EFX_ETHER_TYPE_IPV4 0x0800 2156284555Sarybchik#define EFX_ETHER_TYPE_IPV6 0x86DD 2157284555Sarybchik 2158284555Sarybchik#define EFX_IPPROTO_TCP 6 2159284555Sarybchik#define EFX_IPPROTO_UDP 17 2160284555Sarybchik 2161227569Sphiliptypedef enum efx_filter_flag_e { 2162227569Sphilip EFX_FILTER_FLAG_RX_RSS = 0x01, /* use RSS to spread across 2163227569Sphilip * multiple queues */ 2164227569Sphilip EFX_FILTER_FLAG_RX_SCATTER = 0x02, /* enable RX scatter */ 2165284555Sarybchik EFX_FILTER_FLAG_RX_OVER_AUTO = 0x04, /* Override an automatic filter 2166284555Sarybchik * (priority EFX_FILTER_PRI_AUTO). 2167284555Sarybchik * May only be set by the filter 2168284555Sarybchik * implementation for each type. 2169284555Sarybchik * A removal request will 2170284555Sarybchik * restore the automatic filter 2171284555Sarybchik * in its place. */ 2172284555Sarybchik EFX_FILTER_FLAG_RX = 0x08, /* Filter is for RX */ 2173284555Sarybchik EFX_FILTER_FLAG_TX = 0x10, /* Filter is for TX */ 2174227569Sphilip} efx_filter_flag_t; 2175227569Sphilip 2176284555Sarybchiktypedef enum efx_filter_match_flags_e { 2177284555Sarybchik EFX_FILTER_MATCH_REM_HOST = 0x0001, /* Match by remote IP host 2178284555Sarybchik * address */ 2179284555Sarybchik EFX_FILTER_MATCH_LOC_HOST = 0x0002, /* Match by local IP host 2180284555Sarybchik * address */ 2181284555Sarybchik EFX_FILTER_MATCH_REM_MAC = 0x0004, /* Match by remote MAC address */ 2182284555Sarybchik EFX_FILTER_MATCH_REM_PORT = 0x0008, /* Match by remote TCP/UDP port */ 2183284555Sarybchik EFX_FILTER_MATCH_LOC_MAC = 0x0010, /* Match by remote TCP/UDP port */ 2184284555Sarybchik EFX_FILTER_MATCH_LOC_PORT = 0x0020, /* Match by local TCP/UDP port */ 2185284555Sarybchik EFX_FILTER_MATCH_ETHER_TYPE = 0x0040, /* Match by Ether-type */ 2186284555Sarybchik EFX_FILTER_MATCH_INNER_VID = 0x0080, /* Match by inner VLAN ID */ 2187284555Sarybchik EFX_FILTER_MATCH_OUTER_VID = 0x0100, /* Match by outer VLAN ID */ 2188284555Sarybchik EFX_FILTER_MATCH_IP_PROTO = 0x0200, /* Match by IP transport 2189284555Sarybchik * protocol */ 2190284555Sarybchik EFX_FILTER_MATCH_LOC_MAC_IG = 0x0400, /* Match by local MAC address 2191284555Sarybchik * I/G bit. Used for RX default 2192284555Sarybchik * unicast and multicast/ 2193284555Sarybchik * broadcast filters. */ 2194284555Sarybchik} efx_filter_match_flags_t; 2195284555Sarybchik 2196284555Sarybchiktypedef enum efx_filter_priority_s { 2197284555Sarybchik EFX_FILTER_PRI_HINT = 0, /* Performance hint */ 2198284555Sarybchik EFX_FILTER_PRI_AUTO, /* Automatic filter based on device 2199284555Sarybchik * address list or hardware 2200284555Sarybchik * requirements. This may only be used 2201284555Sarybchik * by the filter implementation for 2202284555Sarybchik * each NIC type. */ 2203284555Sarybchik EFX_FILTER_PRI_MANUAL, /* Manually configured filter */ 2204284555Sarybchik EFX_FILTER_PRI_REQUIRED, /* Required for correct behaviour of the 2205284555Sarybchik * client (e.g. SR-IOV, HyperV VMQ etc.) 2206284555Sarybchik */ 2207284555Sarybchik} efx_filter_priority_t; 2208284555Sarybchik 2209284555Sarybchik/* 2210284555Sarybchik * FIXME: All these fields are assumed to be in little-endian byte order. 2211284555Sarybchik * It may be better for some to be big-endian. See bug42804. 2212284555Sarybchik */ 2213284555Sarybchik 2214227569Sphiliptypedef struct efx_filter_spec_s { 2215284555Sarybchik uint32_t efs_match_flags:12; 2216284555Sarybchik uint32_t efs_priority:2; 2217284555Sarybchik uint32_t efs_flags:6; 2218284555Sarybchik uint32_t efs_dmaq_id:12; 2219284555Sarybchik uint32_t efs_rss_context; 2220284555Sarybchik uint16_t efs_outer_vid; 2221284555Sarybchik uint16_t efs_inner_vid; 2222284555Sarybchik uint8_t efs_loc_mac[EFX_MAC_ADDR_LEN]; 2223284555Sarybchik uint8_t efs_rem_mac[EFX_MAC_ADDR_LEN]; 2224284555Sarybchik uint16_t efs_ether_type; 2225284555Sarybchik uint8_t efs_ip_proto; 2226284555Sarybchik uint16_t efs_loc_port; 2227284555Sarybchik uint16_t efs_rem_port; 2228284555Sarybchik efx_oword_t efs_rem_host; 2229284555Sarybchik efx_oword_t efs_loc_host; 2230227569Sphilip} efx_filter_spec_t; 2231227569Sphilip 2232284555Sarybchik 2233284555Sarybchik/* Default values for use in filter specifications */ 2234284555Sarybchik#define EFX_FILTER_SPEC_RSS_CONTEXT_DEFAULT 0xffffffff 2235284555Sarybchik#define EFX_FILTER_SPEC_RX_DMAQ_ID_DROP 0xfff 2236284555Sarybchik#define EFX_FILTER_SPEC_VID_UNSPEC 0xffff 2237284555Sarybchik 2238293927Sarybchikextern __checkReturn efx_rc_t 2239227569Sphilipefx_filter_init( 2240227569Sphilip __in efx_nic_t *enp); 2241227569Sphilip 2242227569Sphilipextern void 2243227569Sphilipefx_filter_fini( 2244227569Sphilip __in efx_nic_t *enp); 2245227569Sphilip 2246293927Sarybchikextern __checkReturn efx_rc_t 2247284555Sarybchikefx_filter_insert( 2248284555Sarybchik __in efx_nic_t *enp, 2249227569Sphilip __inout efx_filter_spec_t *spec); 2250227569Sphilip 2251293927Sarybchikextern __checkReturn efx_rc_t 2252284555Sarybchikefx_filter_remove( 2253284555Sarybchik __in efx_nic_t *enp, 2254227569Sphilip __inout efx_filter_spec_t *spec); 2255227569Sphilip 2256293927Sarybchikextern __checkReturn efx_rc_t 2257227569Sphilipefx_filter_restore( 2258227569Sphilip __in efx_nic_t *enp); 2259227569Sphilip 2260293927Sarybchikextern __checkReturn efx_rc_t 2261284555Sarybchikefx_filter_supported_filters( 2262284555Sarybchik __in efx_nic_t *enp, 2263284555Sarybchik __out uint32_t *list, 2264284555Sarybchik __out size_t *length); 2265227569Sphilip 2266227569Sphilipextern void 2267284555Sarybchikefx_filter_spec_init_rx( 2268294017Sarybchik __out efx_filter_spec_t *spec, 2269284555Sarybchik __in efx_filter_priority_t priority, 2270284555Sarybchik __in efx_filter_flag_t flags, 2271284555Sarybchik __in efx_rxq_t *erp); 2272227569Sphilip 2273227569Sphilipextern void 2274284555Sarybchikefx_filter_spec_init_tx( 2275294017Sarybchik __out efx_filter_spec_t *spec, 2276284555Sarybchik __in efx_txq_t *etp); 2277227569Sphilip 2278293927Sarybchikextern __checkReturn efx_rc_t 2279284555Sarybchikefx_filter_spec_set_ipv4_local( 2280227569Sphilip __inout efx_filter_spec_t *spec, 2281284555Sarybchik __in uint8_t proto, 2282284555Sarybchik __in uint32_t host, 2283284555Sarybchik __in uint16_t port); 2284227569Sphilip 2285293927Sarybchikextern __checkReturn efx_rc_t 2286284555Sarybchikefx_filter_spec_set_ipv4_full( 2287227569Sphilip __inout efx_filter_spec_t *spec, 2288284555Sarybchik __in uint8_t proto, 2289284555Sarybchik __in uint32_t lhost, 2290284555Sarybchik __in uint16_t lport, 2291284555Sarybchik __in uint32_t rhost, 2292284555Sarybchik __in uint16_t rport); 2293227569Sphilip 2294293927Sarybchikextern __checkReturn efx_rc_t 2295284555Sarybchikefx_filter_spec_set_eth_local( 2296227569Sphilip __inout efx_filter_spec_t *spec, 2297284555Sarybchik __in uint16_t vid, 2298284555Sarybchik __in const uint8_t *addr); 2299227569Sphilip 2300293927Sarybchikextern __checkReturn efx_rc_t 2301284555Sarybchikefx_filter_spec_set_uc_def( 2302227569Sphilip __inout efx_filter_spec_t *spec); 2303227569Sphilip 2304293927Sarybchikextern __checkReturn efx_rc_t 2305284555Sarybchikefx_filter_spec_set_mc_def( 2306227569Sphilip __inout efx_filter_spec_t *spec); 2307227569Sphilip 2308284555Sarybchik#endif /* EFSYS_OPT_FILTER */ 2309227569Sphilip 2310284555Sarybchik/* HASH */ 2311227569Sphilip 2312284555Sarybchikextern __checkReturn uint32_t 2313284555Sarybchikefx_hash_dwords( 2314284555Sarybchik __in_ecount(count) uint32_t const *input, 2315284555Sarybchik __in size_t count, 2316284555Sarybchik __in uint32_t init); 2317227569Sphilip 2318284555Sarybchikextern __checkReturn uint32_t 2319284555Sarybchikefx_hash_bytes( 2320284555Sarybchik __in_ecount(length) uint8_t const *input, 2321284555Sarybchik __in size_t length, 2322284555Sarybchik __in uint32_t init); 2323227569Sphilip 2324294386Sarybchik#if EFSYS_OPT_LICENSING 2325227569Sphilip 2326294386Sarybchik/* LICENSING */ 2327294386Sarybchik 2328294386Sarybchiktypedef struct efx_key_stats_s { 2329294386Sarybchik uint32_t eks_valid; 2330294386Sarybchik uint32_t eks_invalid; 2331294386Sarybchik uint32_t eks_blacklisted; 2332294386Sarybchik uint32_t eks_unverifiable; 2333294386Sarybchik uint32_t eks_wrong_node; 2334294386Sarybchik uint32_t eks_licensed_apps_lo; 2335294386Sarybchik uint32_t eks_licensed_apps_hi; 2336294386Sarybchik uint32_t eks_licensed_features_lo; 2337294386Sarybchik uint32_t eks_licensed_features_hi; 2338294386Sarybchik} efx_key_stats_t; 2339294386Sarybchik 2340294386Sarybchikextern __checkReturn efx_rc_t 2341294386Sarybchikefx_lic_init( 2342294386Sarybchik __in efx_nic_t *enp); 2343294386Sarybchik 2344294386Sarybchikextern void 2345294386Sarybchikefx_lic_fini( 2346294386Sarybchik __in efx_nic_t *enp); 2347294386Sarybchik 2348294386Sarybchikextern __checkReturn efx_rc_t 2349294386Sarybchikefx_lic_update_licenses( 2350294386Sarybchik __in efx_nic_t *enp); 2351294386Sarybchik 2352294386Sarybchikextern __checkReturn efx_rc_t 2353294386Sarybchikefx_lic_get_key_stats( 2354294386Sarybchik __in efx_nic_t *enp, 2355294386Sarybchik __out efx_key_stats_t *ksp); 2356294386Sarybchik 2357294386Sarybchikextern __checkReturn efx_rc_t 2358294386Sarybchikefx_lic_app_state( 2359294386Sarybchik __in efx_nic_t *enp, 2360294386Sarybchik __in uint64_t app_id, 2361294386Sarybchik __out boolean_t *licensedp); 2362294386Sarybchik 2363294386Sarybchikextern __checkReturn efx_rc_t 2364294386Sarybchikefx_lic_get_id( 2365294386Sarybchik __in efx_nic_t *enp, 2366294386Sarybchik __in size_t buffer_size, 2367294386Sarybchik __out uint32_t *typep, 2368294386Sarybchik __out size_t *lengthp, 2369294386Sarybchik __out_opt uint8_t *bufferp); 2370294386Sarybchik 2371294386Sarybchik 2372294386Sarybchik#endif /* EFSYS_OPT_LICENSING */ 2373294386Sarybchik 2374294386Sarybchik 2375294386Sarybchik 2376227569Sphilip#ifdef __cplusplus 2377227569Sphilip} 2378227569Sphilip#endif 2379227569Sphilip 2380227569Sphilip#endif /* _SYS_EFX_H */ 2381