49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * Copyright (c) 2008-2016 Solarflare Communications Inc.
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore * All rights reserved.
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 * 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 * 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 * 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 uint8_t sm_mcast_addr[EFX_MAC_MULTICAST_LIST_MAX *
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore ETHERADDRL]; /* List of multicast addresses to filter on */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_txq_t *__se_label_stp[SFXGE_TX_NLABELS];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_exception __se_u1.__se_s1.__se_exception
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define se_init_kv __se_u2.__se_s2.__se_init_kv
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#define se_label_stp __se_u3.__se_s3.__se_label_stp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_MAGIC_DMAQ_LABEL_MASK ((1 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH) - 1)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (SFXGE_MAGIC_RESERVED | (1 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (SFXGE_MAGIC_RESERVED | (2 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (SFXGE_MAGIC_RESERVED | (3 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore (SFXGE_MAGIC_RESERVED | (4 << SFXGE_MAGIC_DMAQ_LABEL_WIDTH))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_ETHERTYPE_LOOPBACK 0x9000 /* Xerox loopback */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_rx_packet_s sfxge_rx_packet_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore uint8_t __srp_pad[SFXGE_CPU_CACHE_SIZE * 2];
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_etherhp __srp_u1.__srp_s1.__srp_etherhp
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define srp_iphp __srp_u1.__srp_s1.__srp_iphp
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#define SFXGE_RX_FPP_MASK (SFXGE_RX_FPP_NSLOTS - 1)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* Free packet pool putlist (dynamically allocated) */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* Free packet pool */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* Low water mark: Don't trim to below this */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_rx_flow_s sfxge_rx_flow_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* in-order segment count */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* sequence number */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_RX_NSTATS 8 /* note that *esballoc share one kstat */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* NB must match SFXGE_RX_NSTATS */
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_flush_kv __sr_u3.__sr_s3.__sr_flush_kv
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_packet_s sfxge_tx_packet_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore/* Packet type from parsing transmit packet */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_mapping_s sfxge_tx_mapping_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TX_MAPPING_NADDR (((1 << 16) >> 12) + 2)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoretypedef struct sfxge_tx_buffer_s sfxge_tx_buffer_t;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int std_count; /* only get list count */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define SFXGE_TXQ_UNBLOCK_LEVEL1 (EFX_TXQ_LIMIT(SFXGE_TX_NDESCS) / 4)
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* mapping pool - sfxge_tx_mapping_t */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* buffer pool - sfxge_tx_buffer_t */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore /* packet pool - sfxge_tx_packet_t */
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#define st_pending __st_u4.__st_s4.__st_pending
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#define st_completed __st_u4.__st_s4.__st_completed
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore kmem_cache_t *s_eqXc; /* all other eventQs */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sfxge_rx_coalesce_mode_t s_rx_coalesce_mode;
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 sfxge_action_on_hw_err_t s_action_on_hw_err;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern const char sfxge_ident[];
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern unsigned int *sfxge_cpu;
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_start(sfxge_t *, boolean_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'Amoreextern void sfxge_gld_link_update(sfxge_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_gld_rx_post(sfxge_t *, unsigned int,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_dma_buffer_create(efsys_mem_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_dma_buffer_destroy(efsys_mem_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 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'Amoreextern int sfxge_mac_start(sfxge_t *, boolean_t);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_stat_get(sfxge_t *, unsigned int,
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'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_multicst_remove(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_mac_link_update(sfxge_t *sp,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_phy_link_mode_get(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'Amoreextern uint8_t sfxge_phy_cap_test(sfxge_t *sp, uint32_t flags,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_phy_cap_set(sfxge_t *sp, uint32_t field,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_rx_coalesce_mode_get(sfxge_t *,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_rx_coalesce_mode_set(sfxge_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 unsigned int sfxge_rx_loaned(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_qdpl_flush(sfxge_txq_t *stp);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_sram_buf_tbl_alloc(sfxge_t *, size_t,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_sram_buf_tbl_set(sfxge_t *, uint32_t,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_sram_buf_tbl_clear(sfxge_t *, uint32_t,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_sram_buf_tbl_free(sfxge_t *, uint32_t,
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'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 * 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#define SFXGE_TCP_HASH(_sp, _raddr, _rport, _laddr, _lport, _hash) \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore sizeof (struct in_addr), \
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#define SFXGE_IP_HASH(_sp, _raddr, _rport, _laddr, _lport, _hash) \
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore SFXGE_TCP_HASH((_sp), (_raddr), (_rport), (_laddr), (_lport), (_hash))
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_nvram_ioctl(sfxge_t *, sfxge_nvram_ioc_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern void sfxge_pcie_check_link(sfxge_t *, unsigned int,
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore unsigned int);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amoreextern int sfxge_vpd_ioctl(sfxge_t *, sfxge_vpd_ioc_t *);
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* _KERNEL */
49ef7e0638c8b771d8a136eae78b1c0f99acc8e0Garrett D'Amore#endif /* _SYS_SFXGE_H */