#ifndef _IAVF_LIB_H_
#define _IAVF_LIB_H_
#include <sys/malloc.h>
#include <sys/stdarg.h>
#include <sys/sysctl.h>
#include <net/rss_config.h>
#include "iavf_debug.h"
#include "iavf_osdep.h"
#include "iavf_type.h"
#include "iavf_prototype.h"
MALLOC_DECLARE(M_IAVF);
#define IAVF_DEFAULT_RING 1024
#define IAVF_MAX_RING 4096
#define IAVF_MIN_RING 64
#define IAVF_RING_INCREMENT 32
#define IAVF_AQ_LEN 256
#define IAVF_AQ_LEN_MAX 1024
#define DEFAULT_TXBRSZ 4096
#define DBA_ALIGN 128
#define MAX_MULTICAST_ADDR 128
#define DBA_ALIGN 128
#define IAVF_MSIX_BAR 3
#define IAVF_ADM_LIMIT 2
#define IAVF_TSO_SIZE ((255*1024)-1)
#define IAVF_AQ_BUF_SZ ((u32) 4096)
#define IAVF_RX_HDR 128
#define IAVF_RX_LIMIT 512
#define IAVF_RX_ITR 0
#define IAVF_TX_ITR 1
#define IAVF_MAX_FRAME 9728
#define IAVF_MIN_FRAME 17
#define IAVF_MAX_TX_SEGS 8
#define IAVF_MAX_RX_SEGS 5
#define IAVF_MAX_TSO_SEGS 128
#define IAVF_SPARSE_CHAIN 7
#define IAVF_MIN_TSO_MSS 64
#define IAVF_MAX_TSO_MSS 9668
#define IAVF_MAX_DMA_SEG_SIZE ((16 * 1024) - 1)
#define IAVF_AQ_MAX_ERR 30
#define IAVF_MAX_INIT_WAIT 120
#define IAVF_AQ_TIMEOUT (1 * hz)
#define IAVF_ADV_LINK_SPEED_SCALE ((u64)1000000)
#define IAVF_MAX_DIS_Q_RETRY 10
#define IAVF_RSS_KEY_SIZE_REG 13
#define IAVF_RSS_KEY_SIZE (IAVF_RSS_KEY_SIZE_REG * 4)
#define IAVF_RSS_VSI_LUT_SIZE 64
#define IAVF_RSS_VSI_LUT_ENTRY_MASK 0x3F
#define IAVF_RSS_VF_LUT_ENTRY_MASK 0xF
#define IAVF_MAX_MTU (IAVF_MAX_FRAME - \
ETHER_HDR_LEN - ETHER_CRC_LEN - ETHER_VLAN_ENCAP_LEN)
#define IAVF_MIN_MTU 112
#define IAVF_MAX_ITR 0x0FF0
#define IAVF_ITR_100K 0x0005
#define IAVF_ITR_20K 0x0019
#define IAVF_ITR_8K 0x003E
#define IAVF_ITR_4K 0x007A
#define IAVF_ITR_1K 0x01F4
#define IAVF_ITR_DYNAMIC 0x8000
#define IAVF_LOW_LATENCY 0
#define IAVF_AVE_LATENCY 1
#define IAVF_BULK_LATENCY 2
#define IAVF_FILTER_USED (u16)(1 << 0)
#define IAVF_FILTER_VLAN (u16)(1 << 1)
#define IAVF_FILTER_ADD (u16)(1 << 2)
#define IAVF_FILTER_DEL (u16)(1 << 3)
#define IAVF_FILTER_MC (u16)(1 << 4)
#define IAVF_VLAN_ANY -1
#define CSUM_OFFLOAD_IPV4 (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
#define CSUM_OFFLOAD_IPV6 (CSUM_TCP_IPV6|CSUM_UDP_IPV6|CSUM_SCTP_IPV6)
#define CSUM_OFFLOAD (CSUM_OFFLOAD_IPV4|CSUM_OFFLOAD_IPV6|CSUM_TSO)
#define IAVF_FLAGS_KEEP_TSO4 (1 << 0)
#define IAVF_FLAGS_KEEP_TSO6 (1 << 1)
#define IAVF_DEFAULT_RSS_HENA_BASE (\
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV4_UDP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV4_TCP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV4_SCTP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV4_OTHER) | \
BIT_ULL(IAVF_FILTER_PCTYPE_FRAG_IPV4) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV6_UDP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV6_TCP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV6_SCTP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV6_OTHER) | \
BIT_ULL(IAVF_FILTER_PCTYPE_FRAG_IPV6))
#define IAVF_DEFAULT_ADV_RSS_HENA (\
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_UNICAST_IPV4_UDP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_MULTICAST_IPV4_UDP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_UNICAST_IPV6_UDP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_MULTICAST_IPV6_UDP) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK) | \
BIT_ULL(IAVF_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK))
#define IAVF_DEFAULT_RSS_HENA_XL710 (\
IAVF_DEFAULT_RSS_HENA_BASE | \
BIT_ULL(IAVF_FILTER_PCTYPE_L2_PAYLOAD))
#define IAVF_DEFAULT_RSS_HENA_X722 (\
IAVF_DEFAULT_RSS_HENA_XL710 | \
IAVF_DEFAULT_ADV_RSS_HENA)
#define IAVF_DEFAULT_RSS_HENA_AVF (\
IAVF_DEFAULT_RSS_HENA_BASE | \
IAVF_DEFAULT_ADV_RSS_HENA)
#define IAVF_QUEUE_NAME_LEN 32
#define IAVF_FLAG_AQ_ENABLE_QUEUES (u32)(1 << 0)
#define IAVF_FLAG_AQ_DISABLE_QUEUES (u32)(1 << 1)
#define IAVF_FLAG_AQ_ADD_MAC_FILTER (u32)(1 << 2)
#define IAVF_FLAG_AQ_ADD_VLAN_FILTER (u32)(1 << 3)
#define IAVF_FLAG_AQ_DEL_MAC_FILTER (u32)(1 << 4)
#define IAVF_FLAG_AQ_DEL_VLAN_FILTER (u32)(1 << 5)
#define IAVF_FLAG_AQ_CONFIGURE_QUEUES (u32)(1 << 6)
#define IAVF_FLAG_AQ_MAP_VECTORS (u32)(1 << 7)
#define IAVF_FLAG_AQ_HANDLE_RESET (u32)(1 << 8)
#define IAVF_FLAG_AQ_CONFIGURE_PROMISC (u32)(1 << 9)
#define IAVF_FLAG_AQ_GET_STATS (u32)(1 << 10)
#define IAVF_FLAG_AQ_CONFIG_RSS_KEY (u32)(1 << 11)
#define IAVF_FLAG_AQ_SET_RSS_HENA (u32)(1 << 12)
#define IAVF_FLAG_AQ_GET_RSS_HENA_CAPS (u32)(1 << 13)
#define IAVF_FLAG_AQ_CONFIG_RSS_LUT (u32)(1 << 14)
#define IAVF_CAP_ADV_LINK_SPEED(_sc) \
((_sc)->vf_res->vf_cap_flags & VIRTCHNL_VF_CAP_ADV_LINK_SPEED)
#define IAVF_NRXQS(_vsi) ((_vsi)->num_rx_queues)
#define IAVF_NTXQS(_vsi) ((_vsi)->num_tx_queues)
#define IAVF_FLAGS \
"\20\1ENABLE_QUEUES\2DISABLE_QUEUES\3ADD_MAC_FILTER" \
"\4ADD_VLAN_FILTER\5DEL_MAC_FILTER\6DEL_VLAN_FILTER" \
"\7CONFIGURE_QUEUES\10MAP_VECTORS\11HANDLE_RESET" \
"\12CONFIGURE_PROMISC\13GET_STATS\14CONFIG_RSS_KEY" \
"\15SET_RSS_HENA\16GET_RSS_HENA_CAPS\17CONFIG_RSS_LUT"
#define IAVF_PRINTF_VF_OFFLOAD_FLAGS \
"\20\1L2" \
"\2IWARP" \
"\3FCOE" \
"\4RSS_AQ" \
"\5RSS_REG" \
"\6WB_ON_ITR" \
"\7REQ_QUEUES" \
"\10ADV_LINK_SPEED" \
"\21VLAN" \
"\22RX_POLLING" \
"\23RSS_PCTYPE_V2" \
"\24RSS_PF" \
"\25ENCAP" \
"\26ENCAP_CSUM" \
"\27RX_ENCAP_CSUM" \
"\30ADQ"
enum iavf_ext_link_speed {
IAVF_EXT_LINK_SPEED_UNKNOWN,
IAVF_EXT_LINK_SPEED_10MB,
IAVF_EXT_LINK_SPEED_100MB,
IAVF_EXT_LINK_SPEED_1000MB,
IAVF_EXT_LINK_SPEED_2500MB,
IAVF_EXT_LINK_SPEED_5GB,
IAVF_EXT_LINK_SPEED_10GB,
IAVF_EXT_LINK_SPEED_20GB,
IAVF_EXT_LINK_SPEED_25GB,
IAVF_EXT_LINK_SPEED_40GB,
IAVF_EXT_LINK_SPEED_50GB,
IAVF_EXT_LINK_SPEED_100GB,
};
struct iavf_sysctl_info {
u64 *stat;
char *name;
char *description;
};
struct iavf_sc;
struct iavf_vsi;
enum iavf_state {
IAVF_STATE_INITIALIZED,
IAVF_STATE_RESET_REQUIRED,
IAVF_STATE_RESET_PENDING,
IAVF_STATE_RUNNING,
IAVF_STATE_LAST,
};
static inline void
iavf_set_state(volatile u32 *s, enum iavf_state bit)
{
atomic_set_32(s, BIT(bit));
}
static inline void
iavf_clear_state(volatile u32 *s, enum iavf_state bit)
{
atomic_clear_32(s, BIT(bit));
}
static inline u32
iavf_testandset_state(volatile u32 *s, enum iavf_state bit)
{
return atomic_testandset_32(s, bit);
}
static inline u32
iavf_testandclear_state(volatile u32 *s, enum iavf_state bit)
{
return atomic_testandclear_32(s, bit);
}
static inline u32
iavf_test_state(volatile u32 *s, enum iavf_state bit)
{
return (*s & BIT(bit)) ? true : false;
}
static inline bool
cmp_etheraddr(const u8 *ea1, const u8 *ea2)
{
bool cmp = FALSE;
if ((ea1[0] == ea2[0]) && (ea1[1] == ea2[1]) &&
(ea1[2] == ea2[2]) && (ea1[3] == ea2[3]) &&
(ea1[4] == ea2[4]) && (ea1[5] == ea2[5]))
cmp = TRUE;
return (cmp);
}
int iavf_send_vc_msg(struct iavf_sc *sc, u32 op);
int iavf_send_vc_msg_sleep(struct iavf_sc *sc, u32 op);
void iavf_update_link_status(struct iavf_sc *);
bool iavf_driver_is_detaching(struct iavf_sc *sc);
void iavf_msec_pause(int msecs);
void iavf_get_default_rss_key(u32 *key);
int iavf_allocate_pci_resources_common(struct iavf_sc *sc);
int iavf_reset_complete(struct iavf_hw *hw);
int iavf_setup_vc(struct iavf_sc *sc);
int iavf_reset(struct iavf_sc *sc);
void iavf_enable_adminq_irq(struct iavf_hw *hw);
void iavf_disable_adminq_irq(struct iavf_hw *hw);
int iavf_vf_config(struct iavf_sc *sc);
void iavf_print_device_info(struct iavf_sc *sc);
int iavf_get_vsi_res_from_vf_res(struct iavf_sc *sc);
void iavf_set_mac_addresses(struct iavf_sc *sc);
void iavf_init_filters(struct iavf_sc *sc);
void iavf_free_filters(struct iavf_sc *sc);
void iavf_add_device_sysctls_common(struct iavf_sc *sc);
void iavf_configure_tx_itr(struct iavf_sc *sc);
void iavf_configure_rx_itr(struct iavf_sc *sc);
struct sysctl_oid_list *
iavf_create_debug_sysctl_tree(struct iavf_sc *sc);
void iavf_add_debug_sysctls_common(struct iavf_sc *sc,
struct sysctl_oid_list *debug_list);
void iavf_add_vsi_sysctls(device_t dev, struct iavf_vsi *vsi,
struct sysctl_ctx_list *ctx, const char *sysctl_name);
void iavf_add_sysctls_eth_stats(struct sysctl_ctx_list *ctx,
struct sysctl_oid_list *child, struct iavf_eth_stats *eth_stats);
void iavf_media_status_common(struct iavf_sc *sc,
struct ifmediareq *ifmr);
int iavf_media_change_common(if_t ifp);
void iavf_set_initial_baudrate(if_t ifp);
u64 iavf_max_vc_speed_to_value(u8 link_speeds);
void iavf_config_rss_reg(struct iavf_sc *sc);
void iavf_config_rss_pf(struct iavf_sc *sc);
void iavf_config_rss(struct iavf_sc *sc);
int iavf_config_promisc(struct iavf_sc *sc, int flags);
void iavf_init_multi(struct iavf_sc *sc);
void iavf_multi_set(struct iavf_sc *sc);
int iavf_add_mac_filter(struct iavf_sc *sc, u8 *macaddr, u16 flags);
struct iavf_mac_filter *
iavf_find_mac_filter(struct iavf_sc *sc, u8 *macaddr);
struct iavf_mac_filter *
iavf_get_mac_filter(struct iavf_sc *sc);
u64 iavf_baudrate_from_link_speed(struct iavf_sc *sc);
void iavf_add_vlan_filter(struct iavf_sc *sc, u16 vtag);
int iavf_mark_del_vlan_filter(struct iavf_sc *sc, u16 vtag);
void iavf_disable_queues_with_retries(struct iavf_sc *);
int iavf_sysctl_current_speed(SYSCTL_HANDLER_ARGS);
int iavf_sysctl_tx_itr(SYSCTL_HANDLER_ARGS);
int iavf_sysctl_rx_itr(SYSCTL_HANDLER_ARGS);
int iavf_sysctl_sw_filter_list(SYSCTL_HANDLER_ARGS);
#endif