49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Copyright (c) 2008-2016 Solarflare Communications Inc.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * All rights reserved.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Redistribution and use in source and binary forms, with or without
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * modification, are permitted provided that the following conditions are met:
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 1. Redistributions of source code must retain the above copyright notice,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * this list of conditions and the following disclaimer.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 2. Redistributions in binary form must reproduce the above copyright notice,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * this list of conditions and the following disclaimer in the documentation
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * and/or other materials provided with the distribution.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * The views and conclusions contained in the software and documentation are
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * those of the authors and should not be interpreted as representing official
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * policies, either expressed or implied, of the FreeBSD Project.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#ifndef _SYS_SFXGE_H
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define _SYS_SFXGE_H
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#ifdef __cplusplus
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern "C" {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/types.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/ddi.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/sunddi.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/stream.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/ethernet.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/cpuvar.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/mac.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/mac_ether.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include <sys/mac_provider.h>
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include "sfxge_ioc.h"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include "sfxge_debug.h"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include "efx.h"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#include "efx_regs.h"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#ifdef _KERNEL
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_DRIVER_NAME "sfxge"
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_CPU_CACHE_SIZE 64
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_s sfxge_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_intr_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_INTR_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_INTR_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_INTR_TESTING,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_INTR_STARTED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_intr_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_intr_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_intr_handle_t *si_table;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int si_table_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int si_nalloc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int si_type;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int si_cap;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t si_mem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint64_t si_mask;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_intr_state_t si_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t si_zero_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int si_intr_pri;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_intr_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_promisc_type_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PROMISC_OFF = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PROMISC_ALL_MULTI,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PROMISC_ALL_PHYS
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_promisc_type_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_link_duplex_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_LINK_DUPLEX_UNKNOWN = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_LINK_DUPLEX_HALF,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_LINK_DUPLEX_FULL
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_link_duplex_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_unicst_type_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_UNICST_BIA = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_UNICST_LAA,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_UNICST_NTYPES
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_unicst_type_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_phy_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *sp_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_named_t *sp_stat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t *sp_statbuf;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t sp_mem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_phy_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_mac_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MAC_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MAC_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MAC_STARTED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_mac_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_mac_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_t *sm_sp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t sm_mem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *sm_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_named_t *sm_stat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t sm_bia[ETHERADDRL];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t sm_laa[ETHERADDRL];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t sm_laa_valid;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int sm_fcntl;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_promisc_type_t sm_promisc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t sm_mcast_addr[EFX_MAC_MULTICAST_LIST_MAX *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ETHERADDRL]; /* List of multicast addresses to filter on */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int sm_mcast_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore clock_t sm_lbolt;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t sm_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_link_mode_t sm_link_mode;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int sm_link_speed;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_link_duplex_t sm_link_duplex;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t sm_link_up;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t sm_link_poll_reqd;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kcondvar_t sm_link_poll_kv;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t sm_mac_stats_timer_reqd;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t sm_mac_stats_pend;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_taskq_t *sm_tqp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mac_state_t sm_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_phy_t sm_phy;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t sm_phy_cap_to_set;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t sm_phy_cap_to_unset;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_mac_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_mon_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MON_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MON_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MON_STARTED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_mon_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_mon_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_t *sm_sp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_mon_type_t sm_type;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int sm_devid;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *sm_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_named_t *sm_stat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_mon_stat_value_t *sm_statbuf;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t sm_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mon_state_t sm_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t sm_mem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int sm_polling;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_mon_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_sram_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_SRAM_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_SRAM_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_SRAM_STARTED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_sram_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_sram_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_t *ss_sp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t ss_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct map *ss_buf_tbl_map;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int ss_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_sram_state_t ss_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_sram_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_mcdi_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MCDI_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MCDI_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MCDI_BUSY,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_MCDI_COMPLETED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_mcdi_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_mcdi_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_t *sm_sp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t sm_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mcdi_state_t sm_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_mcdi_transport_t sm_emt;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t sm_mem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kcondvar_t sm_kv; /* MCDI poll complete */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_mcdi_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_NEVS 4096
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_RX_NDESCS 1024
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_NDESCS 1024
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_NLABELS EFX_EV_TX_NLABELS
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_DEFAULT_RXQ_SIZE 1024
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_DEFAULT_MODERATION 30
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_evq_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_EVQ_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_EVQ_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_EVQ_STARTING,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_EVQ_STARTED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_evq_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_EV_BATCH (SFXGE_NEVS / 4)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_txq_s sfxge_txq_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_evq_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_t *__se_sp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __se_index;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t __se_mem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __se_id;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *__se_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_named_t *__se_stat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_ev_callbacks_t __se_eec;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_evq_state_t __se_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t __se_exception;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __se_s1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __se_pad[SFXGE_CPU_CACHE_SIZE * 4];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __se_u1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t __se_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kcondvar_t __se_init_kv;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_evq_t *__se_eep;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __se_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __se_rx;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __se_tx;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_txq_t *__se_stp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_txq_t **__se_stpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore processorid_t __se_cpu_id;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t __se_ev_batch;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __se_s2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __se_pad[SFXGE_CPU_CACHE_SIZE];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __se_u2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_txq_t *__se_label_stp[SFXGE_TX_NLABELS];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __se_s3;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __se_pad[SFXGE_CPU_CACHE_SIZE * 4];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __se_u3;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_evq_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_sp __se_u1.__se_s1.__se_sp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_index __se_u1.__se_s1.__se_index
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_mem __se_u1.__se_s1.__se_mem
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_id __se_u1.__se_s1.__se_id
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_ksp __se_u1.__se_s1.__se_ksp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_stat __se_u1.__se_s1.__se_stat
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_eec __se_u1.__se_s1.__se_eec
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_state __se_u1.__se_s1.__se_state
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_exception __se_u1.__se_s1.__se_exception
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_lock __se_u2.__se_s2.__se_lock
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_init_kv __se_u2.__se_s2.__se_init_kv
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_eep __se_u2.__se_s2.__se_eep
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_count __se_u2.__se_s2.__se_count
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_rx __se_u2.__se_s2.__se_rx
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_tx __se_u2.__se_s2.__se_tx
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_stp __se_u2.__se_s2.__se_stp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_stpp __se_u2.__se_s2.__se_stpp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_cpu_id __se_u2.__se_s2.__se_cpu_id
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_ev_batch __se_u2.__se_s2.__se_ev_batch
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_label_stp __se_u3.__se_s3.__se_label_stp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAGIC_RESERVED 0x8000
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAGIC_DMAQ_LABEL_WIDTH 5
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAGIC_DMAQ_LABEL_MASK ((1 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH) - 1)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAGIC_RX_QFLUSH_DONE \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (SFXGE_MAGIC_RESERVED | (1 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAGIC_RX_QFLUSH_FAILED \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (SFXGE_MAGIC_RESERVED | (2 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAGIC_RX_QFPP_TRIM \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (SFXGE_MAGIC_RESERVED | (3 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAGIC_TX_QFLUSH_DONE \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (SFXGE_MAGIC_RESERVED | (4 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_rxq_s sfxge_rxq_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_ETHERTYPE_LOOPBACK 0x9000 /* Xerox loopback */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_rx_packet_s sfxge_rx_packet_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestruct sfxge_rx_packet_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore frtn_t __srp_free;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t __srp_flags;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t __srp_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t *__srp_mp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ether_header *__srp_etherhp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ip *__srp_iphp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct tcphdr *__srp_thp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t __srp_off;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __srp_s1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __srp_pad[SFXGE_CPU_CACHE_SIZE];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __srp_u1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rxq_t *__srp_srp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_dma_handle_t __srp_dma_handle;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_acc_handle_t __srp_acc_handle;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned char *__srp_base;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t __srp_mblksize;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint64_t __srp_addr;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t __srp_recycle;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore caddr_t __srp_putp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __srp_s2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __srp_pad[SFXGE_CPU_CACHE_SIZE * 2];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __srp_u2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_free __srp_u1.__srp_s1.__srp_free
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_flags __srp_u1.__srp_s1.__srp_flags
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_size __srp_u1.__srp_s1.__srp_size
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_mp __srp_u1.__srp_s1.__srp_mp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_etherhp __srp_u1.__srp_s1.__srp_etherhp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_iphp __srp_u1.__srp_s1.__srp_iphp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_thp __srp_u1.__srp_s1.__srp_thp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_off __srp_u1.__srp_s1.__srp_off
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_srp __srp_u2.__srp_s2.__srp_srp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_dma_handle __srp_u2.__srp_s2.__srp_dma_handle
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_acc_handle __srp_u2.__srp_s2.__srp_acc_handle
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_base __srp_u2.__srp_s2.__srp_base
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_mblksize __srp_u2.__srp_s2.__srp_mblksize
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_addr __srp_u2.__srp_s2.__srp_addr
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_recycle __srp_u2.__srp_s2.__srp_recycle
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_putp __srp_u2.__srp_s2.__srp_putp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_RX_FPP_NSLOTS 8
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_RX_FPP_MASK (SFXGE_RX_FPP_NSLOTS - 1)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* Free packet pool putlist (dynamically allocated) */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_rx_fpp_putlist_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t srfpl_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int srfpl_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t *srfpl_putp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t **srfpl_putpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_rx_fpp_putlist_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* Free packet pool */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_rx_fpp_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore caddr_t srfpp_putp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int srfpp_loaned;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t *srfpp_get;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int srfpp_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int srfpp_min;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Low water mark: Don't trim to below this */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int srfpp_lowat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_rx_fpp_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_rx_flow_s sfxge_rx_flow_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestruct sfxge_rx_flow_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srf_tag;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* in-order segment count */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int srf_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t srf_tci;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srf_saddr;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srf_daddr;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t srf_sport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t srf_dport;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* sequence number */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srf_seq;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore clock_t srf_lbolt;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t *srf_mp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t **srf_mpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ether_header *srf_etherhp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ip *srf_iphp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct tcphdr *srf_first_thp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct tcphdr *srf_last_thp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t srf_len;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_flow_t *srf_next;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAX_FLOW 1024
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_SLOW_START 20
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_flush_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_FLUSH_INACTIVE = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_FLUSH_DONE,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_FLUSH_PENDING,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_FLUSH_FAILED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_flush_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_rxq_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RXQ_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RXQ_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RXQ_STARTED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_rxq_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_RX_BATCH 128
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_RX_NSTATS 8 /* note that *esballoc share one kstat */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestruct sfxge_rxq_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_t *__sr_sp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_index;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t __sr_mem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_id;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_lowat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_hiwat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore volatile timeout_id_t __sr_tid;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rxq_state_t __sr_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __sr_s1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __sr_pad[SFXGE_CPU_CACHE_SIZE * 2];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __sr_u1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_packet_t **__sr_srpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_added;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_pushed;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_pending;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_completed;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __sr_loopback;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t *__sr_mp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t **__sr_mpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_flow_t *__sr_flow;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_flow_t *__sr_srfp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_flow_t **__sr_srfpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore clock_t __sr_rto;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __sr_s2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __sr_pad[SFXGE_CPU_CACHE_SIZE * 2];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __sr_u2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_fpp_t __sr_fpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_rxq_t *__sr_erp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore volatile sfxge_flush_state_t __sr_flush;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kcondvar_t __sr_flush_kv;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *__sr_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __sr_s3;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __sr_pad[SFXGE_CPU_CACHE_SIZE];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __sr_u3;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* NB must match SFXGE_RX_NSTATS */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srk_rx_pkt_mem_limit;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srk_kcache_alloc_nomem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srk_dma_alloc_nomem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srk_dma_alloc_fail;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srk_dma_bind_nomem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srk_dma_bind_fail;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srk_desballoc_fail;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t srk_rxq_empty_discard;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } sr_kstat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_sp __sr_u1.__sr_s1.__sr_sp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_index __sr_u1.__sr_s1.__sr_index
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_mem __sr_u1.__sr_s1.__sr_mem
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_id __sr_u1.__sr_s1.__sr_id
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_mrh __sr_u1.__sr_s1.__sr_mrh
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_lowat __sr_u1.__sr_s1.__sr_lowat
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_hiwat __sr_u1.__sr_s1.__sr_hiwat
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_tid __sr_u1.__sr_s1.__sr_tid
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_state __sr_u1.__sr_s1.__sr_state
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_srpp __sr_u2.__sr_s2.__sr_srpp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_added __sr_u2.__sr_s2.__sr_added
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_pushed __sr_u2.__sr_s2.__sr_pushed
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_pending __sr_u2.__sr_s2.__sr_pending
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_completed __sr_u2.__sr_s2.__sr_completed
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_loopback __sr_u2.__sr_s2.__sr_loopback
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_mp __sr_u2.__sr_s2.__sr_mp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_mpp __sr_u2.__sr_s2.__sr_mpp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_flow __sr_u2.__sr_s2.__sr_flow
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_srfp __sr_u2.__sr_s2.__sr_srfp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_srfpp __sr_u2.__sr_s2.__sr_srfpp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_rto __sr_u2.__sr_s2.__sr_rto
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_fpp __sr_u3.__sr_s3.__sr_fpp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_erp __sr_u3.__sr_s3.__sr_erp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_flush __sr_u3.__sr_s3.__sr_flush
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_flush_kv __sr_u3.__sr_s3.__sr_flush_kv
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define sr_ksp __sr_u3.__sr_s3.__sr_ksp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_packet_s sfxge_tx_packet_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* Packet type from parsing transmit packet */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_packet_type_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PACKET_TYPE_UNKNOWN = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PACKET_TYPE_IPV4_TCP,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PACKET_TYPE_IPV4_UDP,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PACKET_TYPE_IPV4_SCTP,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PACKET_TYPE_IPV4_OTHER,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_PACKET_NTYPES
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_packet_type_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestruct sfxge_tx_packet_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_packet_t *stp_next;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t *stp_mp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ether_header *stp_etherhp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ip *stp_iphp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct tcphdr *stp_thp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t stp_off;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t stp_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t stp_mss;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t stp_dpl_put_len;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_FPP_MAX 64
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_fpp_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_packet_t *stf_stpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int stf_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_tx_fpp_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_mapping_s sfxge_tx_mapping_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_MAPPING_NADDR (((1 << 16) >> 12) + 2)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestruct sfxge_tx_mapping_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_mapping_t *stm_next;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_t *stm_sp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t *stm_mp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_dma_handle_t stm_dma_handle;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore caddr_t stm_base;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t stm_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t stm_off;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint64_t stm_addr[SFXGE_TX_MAPPING_NADDR];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_fmp_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_mapping_t *stf_stmp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int stf_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_tx_fmp_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_buffer_s sfxge_tx_buffer_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestruct sfxge_tx_buffer_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_buffer_t *stb_next;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t stb_off;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t stb_esm;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_BUFFER_SIZE 0x400
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_HEADER_SIZE 0x100
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_COPY_THRESHOLD 0x200
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_fbp_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_buffer_t *stf_stbp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int stf_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_tx_fbp_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_dpl_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uintptr_t std_put;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_packet_t *std_get;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_packet_t **std_getp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int std_count; /* only get list count */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int get_pkt_limit;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int put_pkt_limit;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int get_full_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int put_full_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_tx_dpl_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_txq_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_STARTED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_FLUSH_PENDING,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_FLUSH_DONE,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_FLUSH_FAILED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_txq_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_txq_type_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_NON_CKSUM = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_IP_CKSUM,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_IP_TCP_UDP_CKSUM,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_NTYPES
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_txq_type_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TXQ_UNBLOCK_LEVEL1 (EFX_TXQ_LIMIT(SFXGE_TX_NDESCS) / 4)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TXQ_UNBLOCK_LEVEL2 0
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TXQ_NOT_BLOCKED -1
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_BATCH 64
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestruct sfxge_txq_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_t *__st_sp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_index;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_label;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_txq_type_t __st_type;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_evq;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t __st_mem;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_id;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *__st_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_named_t *__st_stat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_txq_state_t __st_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __st_s1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __st_pad[SFXGE_CPU_CACHE_SIZE * 2];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __st_u1;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_dpl_t __st_dpl;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __st_s2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __st_pad[SFXGE_CPU_CACHE_SIZE];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __st_u2;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t __st_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* mapping pool - sfxge_tx_mapping_t */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_fmp_t __st_fmp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* buffer pool - sfxge_tx_buffer_t */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_fbp_t __st_fbp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* packet pool - sfxge_tx_packet_t */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_fpp_t __st_fpp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_buffer_t *__st_eb;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_n;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_txq_t *__st_etp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_mapping_t **__st_stmp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_tx_buffer_t **__st_stbp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t **__st_mp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_added;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_reaped;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int __st_unblock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __st_s3;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __st_pad[SFXGE_CPU_CACHE_SIZE * 3];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __st_u3;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore union {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_txq_t *__st_next;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_pending;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int __st_completed;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __st_s4;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __st_pad[SFXGE_CPU_CACHE_SIZE];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } __st_u4;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_sp __st_u1.__st_s1.__st_sp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_index __st_u1.__st_s1.__st_index
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_label __st_u1.__st_s1.__st_label
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_type __st_u1.__st_s1.__st_type
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_evq __st_u1.__st_s1.__st_evq
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_mem __st_u1.__st_s1.__st_mem
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_id __st_u1.__st_s1.__st_id
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_ksp __st_u1.__st_s1.__st_ksp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_stat __st_u1.__st_s1.__st_stat
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_state __st_u1.__st_s1.__st_state
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_dpl __st_u2.__st_s2.__st_dpl
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_lock __st_u3.__st_s3.__st_lock
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_fmp __st_u3.__st_s3.__st_fmp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_fbp __st_u3.__st_s3.__st_fbp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_fpp __st_u3.__st_s3.__st_fpp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_eb __st_u3.__st_s3.__st_eb
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_n __st_u3.__st_s3.__st_n
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_etp __st_u3.__st_s3.__st_etp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_stmp __st_u3.__st_s3.__st_stmp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_stbp __st_u3.__st_s3.__st_stbp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_mp __st_u3.__st_s3.__st_mp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_added __st_u3.__st_s3.__st_added
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_reaped __st_u3.__st_s3.__st_reaped
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_unblock __st_u3.__st_s3.__st_unblock
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_next __st_u4.__st_s4.__st_next
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_pending __st_u4.__st_s4.__st_pending
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_completed __st_u4.__st_s4.__st_completed
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_rx_scale_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RX_SCALE_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RX_SCALE_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RX_SCALE_STARTED
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_rx_scale_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_RX_SCALE_MAX EFX_RSS_TBL_SIZE
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_rx_scale_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t srs_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int *srs_cpu;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int srs_tbl[SFXGE_RX_SCALE_MAX];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int srs_count;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *srs_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_scale_state_t srs_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_rx_scale_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_rx_coalesce_mode_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RX_COALESCE_OFF = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RX_COALESCE_DISALLOW_PUSH = 1,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RX_COALESCE_ALLOW_PUSH = 2
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_rx_coalesce_mode_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_vpd_type_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_VPD_ID = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_VPD_PN = 1,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_VPD_SN = 2,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_VPD_EC = 3,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_VPD_MN = 4,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_VPD_VD = 5,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_VPD_VE = 6,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_VPD_MAX = 7,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_vpd_type_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_vpd_kstat_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *svk_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_named_t svk_stat[SFXGE_VPD_MAX];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_vpd_value_t *svk_vv;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_vpd_kstat_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_cfg_kstat_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_named_t sck_mac;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_named_t sck_version;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } kstat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore char sck_mac[64 + 1];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } buf;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_cfg_kstat_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_state_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_UNINITIALIZED = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_INITIALIZED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_REGISTERED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_STARTING,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_STARTED,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_STOPPING
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_state_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_hw_err_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_HW_OK = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_HW_ERR,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_hw_err_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef enum sfxge_action_on_hw_err_e {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_RECOVER = 0,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_INVISIBLE = 1,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_LEAVE_DEAD = 2,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_action_on_hw_err_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef char *sfxge_mac_priv_prop_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TOEPLITZ_KEY_LEN 40
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amorestruct sfxge_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t s_state_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_state_t s_state;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore dev_info_t *s_dip;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_taskq_t *s_tqp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_acc_handle_t s_pci_handle;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t s_pci_venid;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t s_pci_devid;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_MCDI_LOGGING
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int s_bus_addr;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_family_t s_family;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int s_pcie_nlanes;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int s_pcie_linkspeed;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t s_nic_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_bar_t s_bar;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_intr_t s_intr;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mac_t s_mac;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mon_t s_mon;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_sram_t s_sram;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mcdi_t s_mcdi;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_eq0c; /* eventQ 0 */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_eqXc; /* all other eventQs */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_evq_t *s_sep[SFXGE_RX_SCALE_MAX];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int s_ev_moderation;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_rqc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rxq_t *s_srp[SFXGE_RX_SCALE_MAX];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_scale_t s_rx_scale;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t s_rx_prefix_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t s_rx_buffer_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t s_rx_buffer_align;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_coalesce_mode_t s_rx_coalesce_mode;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int64_t s_rx_pkt_mem_max;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore volatile uint64_t s_rx_pkt_mem_alloc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_rpc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_tqc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int s_tx_scale_base[SFXGE_TXQ_NTYPES];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int s_tx_scale_max[SFXGE_TXQ_NTYPES];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int s_tx_qcount;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_txq_t *s_stp[SFXGE_RX_SCALE_MAX *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TXQ_NTYPES]; /* Sparse array */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_tpc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int s_tx_flush_pending;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmutex_t s_tx_flush_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kcondvar_t s_tx_flush_kv;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_tbc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_tmc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_nic_t *s_enp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_vpd_kstat_t s_vpd_kstat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_cfg_kstat_t s_cfg_kstat;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kstat_t *s_cfg_ksp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t s_mtu;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int s_rxq_poll_usec;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mac_callbacks_t s_mc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mac_handle_t s_mh;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mac_priv_prop_t *s_mac_priv_props;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int s_mac_priv_props_alloc;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore volatile uint32_t s_nested_restarts;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t s_num_restarts;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t s_num_restarts_hw_err;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_hw_err_t s_hw_err;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_action_on_hw_err_t s_action_on_hw_err;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t s_rxq_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t s_evq0_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t s_evqX_size;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#if EFSYS_OPT_MCDI_LOGGING
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int s_mcdi_logging;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const uint32_t *s_toeplitz_cache;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore};
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_dma_buffer_attr_s {
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore dev_info_t *sdba_dip;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_dma_attr_t *sdba_dattrp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int (*sdba_callback) (caddr_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t sdba_length;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint_t sdba_memflags;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ddi_device_acc_attr_t *sdba_devaccp;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint_t sdba_bindflags;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int sdba_maxcookies;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t sdba_zeroinit;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore} sfxge_dma_buffer_attr_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern const char sfxge_ident[];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern uint8_t sfxge_brdcst[];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern kmutex_t sfxge_global_lock;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern unsigned int *sfxge_cpu;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_start(sfxge_t *, boolean_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_stop(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_ioctl(sfxge_t *, queue_t *, mblk_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_restart_dispatch(sfxge_t *, uint_t,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_hw_err_t, const char *, uint32_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_gld_link_update(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_gld_mtu_update(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_gld_rx_post(sfxge_t *, unsigned int,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore mblk_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_gld_rx_push(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_gld_register(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_gld_unregister(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_dma_buffer_create(efsys_mem_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore const sfxge_dma_buffer_attr_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_dma_buffer_destroy(efsys_mem_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_intr_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_intr_start(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_intr_stop(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_intr_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_intr_fatal(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_ev_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_ev_start(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_ev_moderation_get(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_ev_moderation_set(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_ev_qmoderate(sfxge_t *, unsigned int,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_ev_qpoll(sfxge_t *, unsigned int);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_ev_qprime(sfxge_t *, unsigned int);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_ev_stop(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_ev_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_ev_txlabel_alloc(sfxge_t *sp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int evq, sfxge_txq_t *stp, unsigned int *labelp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_ev_txlabel_free(sfxge_t *sp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int evq, sfxge_txq_t *stp, unsigned int label);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mon_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mon_start(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mon_stop(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mon_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mac_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mac_start(sfxge_t *, boolean_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_stat_get(sfxge_t *, unsigned int,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint64_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_link_check(sfxge_t *, boolean_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_link_speed_get(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_link_duplex_get(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_link_duplex_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_fcntl_get(sfxge_t *, unsigned int *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mac_fcntl_set(sfxge_t *, unsigned int);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mac_unicst_get(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_unicst_type_t, uint8_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mac_unicst_set(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mac_promisc_set(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_promisc_type_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mac_multicst_add(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t const *addr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mac_multicst_remove(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t const *addr);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_stop(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_link_update(sfxge_t *sp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_link_mode_t mode);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mcdi_init(sfxge_t *sp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mcdi_fini(sfxge_t *sp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mcdi_ioctl(sfxge_t *sp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mcdi_ioc_t *smip);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_mcdi2_ioctl(sfxge_t *sp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_mcdi2_ioc_t *smip);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_phy_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_phy_link_mode_get(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efx_link_mode_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_phy_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_phy_kstat_init(sfxge_t *sp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_phy_kstat_fini(sfxge_t *sp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern uint8_t sfxge_phy_lp_cap_test(sfxge_t *sp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t field);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_phy_cap_apply(sfxge_t *sp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore boolean_t use_default);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern uint8_t sfxge_phy_cap_test(sfxge_t *sp, uint32_t flags,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t field, boolean_t *mutablep);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_phy_cap_set(sfxge_t *sp, uint32_t field,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore int set);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_rx_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_rx_start(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_coalesce_mode_get(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_coalesce_mode_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_rx_coalesce_mode_set(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_coalesce_mode_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern unsigned int sfxge_rx_scale_prop_get(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_scale_update(void *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_rx_scale_count_get(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_rx_scale_count_set(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_qcomplete(sfxge_rxq_t *, boolean_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_qflush_done(sfxge_rxq_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_qflush_failed(sfxge_rxq_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_qfpp_trim(sfxge_rxq_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_stop(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern unsigned int sfxge_rx_loaned(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_tx_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_tx_start(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_tx_packet_add(sfxge_t *, mblk_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_tx_qcomplete(sfxge_txq_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_tx_qflush_done(sfxge_txq_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_tx_stop(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_tx_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_tx_qdpl_flush(sfxge_txq_t *stp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_sram_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_sram_buf_tbl_alloc(sfxge_t *, size_t,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint32_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_sram_start(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_sram_buf_tbl_set(sfxge_t *, uint32_t,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore efsys_mem_t *, size_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_sram_buf_tbl_clear(sfxge_t *, uint32_t,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_sram_stop(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_sram_buf_tbl_free(sfxge_t *, uint32_t,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore size_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_sram_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern sfxge_packet_type_t sfxge_pkthdr_parse(mblk_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore struct ether_header **, struct ip **, struct tcphdr **, size_t *, size_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint16_t *, uint16_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_toeplitz_hash_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_toeplitz_hash_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern uint32_t sfxge_toeplitz_hash(sfxge_t *, unsigned int,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t *, uint16_t, uint8_t *, uint16_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 4-tuple hash for TCP/IPv4 used for LRO, TSO and TX queue selection.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * To compute the same hash value as Siena/Huntington hardware, the inputs
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * must be in big endian (network) byte order.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TCP_HASH(_sp, _raddr, _rport, _laddr, _lport, _hash) \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore do { \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (_hash) = sfxge_toeplitz_hash(_sp, \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sizeof (struct in_addr), \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (uint8_t *)(_raddr), \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (_rport), \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (uint8_t *)(_laddr), \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (_lport)); \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore _NOTE(CONSTANTCONDITION) \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore } while (B_FALSE)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/*
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * 4-tuple hash for non-TCP IPv4 packets, used for TX queue selection.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * For UDP or SCTP packets, calculate a 4-tuple hash using port numbers.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * For other IPv4 non-TCP packets, use zero for the port numbers.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_IP_HASH(_sp, _raddr, _rport, _laddr, _lport, _hash) \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TCP_HASH((_sp), (_raddr), (_rport), (_laddr), (_lport), (_hash))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_nvram_ioctl(sfxge_t *, sfxge_nvram_ioc_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_pci_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_pcie_check_link(sfxge_t *, unsigned int,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_pci_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_bar_init(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_bar_fini(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_vpd_ioctl(sfxge_t *, sfxge_vpd_ioc_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* _KERNEL */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#ifdef __cplusplus
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore}
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* _SYS_SFXGE_H */