diff options
author | Eric Joyner <erj@FreeBSD.org> | 2018-06-18 20:12:54 +0000 |
---|---|---|
committer | Eric Joyner <erj@FreeBSD.org> | 2018-06-18 20:12:54 +0000 |
commit | 1031d839aa127290f6ef6e11d16472bf268616d4 (patch) | |
tree | 58b03910b98dff865ef749a998325fb3020522ad /sys/dev/ixl/ixl.h | |
parent | 52666d36751d3a29959ef36b8d7fa159ee3f5430 (diff) | |
download | src-1031d839aa127290f6ef6e11d16472bf268616d4.tar.gz src-1031d839aa127290f6ef6e11d16472bf268616d4.zip |
ixl(4): Update to use iflib
Update the driver to use iflib in order to bring performance,
maintainability, and (hopefully) stability benefits to the driver.
The driver currently isn't completely ported; features that are missing:
- VF driver (ixlv)
- SR-IOV host support
- RDMA support
The plan is to have these re-added to the driver before the next FreeBSD release.
Reviewed by: gallatin@
Contributions by: gallatin@, mmacy@, krzysztof.galazka@intel.com
Tested by: jeffrey.e.pieper@intel.com
MFC after: 1 month
Sponsored by: Intel Corporation
Differential Revision: https://reviews.freebsd.org/D15577
Notes
Notes:
svn path=/head/; revision=335338
Diffstat (limited to 'sys/dev/ixl/ixl.h')
-rw-r--r-- | sys/dev/ixl/ixl.h | 344 |
1 files changed, 91 insertions, 253 deletions
diff --git a/sys/dev/ixl/ixl.h b/sys/dev/ixl/ixl.h index 286afc7224eb..cf1b4182b619 100644 --- a/sys/dev/ixl/ixl.h +++ b/sys/dev/ixl/ixl.h @@ -61,6 +61,7 @@ #include <net/ethernet.h> #include <net/if_dl.h> #include <net/if_media.h> +#include <net/iflib.h> #include <net/bpf.h> #include <net/if_types.h> @@ -102,80 +103,13 @@ #include <netinet/in_rss.h> #endif +#include "ifdi_if.h" #include "i40e_type.h" #include "i40e_prototype.h" +#include "ixl_debug.h" -#define MAC_FORMAT "%02x:%02x:%02x:%02x:%02x:%02x" -#define MAC_FORMAT_ARGS(mac_addr) \ - (mac_addr)[0], (mac_addr)[1], (mac_addr)[2], (mac_addr)[3], \ - (mac_addr)[4], (mac_addr)[5] -#define ON_OFF_STR(is_set) ((is_set) ? "On" : "Off") - -#ifdef IXL_DEBUG - -#define _DBG_PRINTF(S, ...) printf("%s: " S "\n", __func__, ##__VA_ARGS__) -#define _DEV_DBG_PRINTF(dev, S, ...) device_printf(dev, "%s: " S "\n", __func__, ##__VA_ARGS__) -#define _IF_DBG_PRINTF(ifp, S, ...) if_printf(ifp, "%s: " S "\n", __func__, ##__VA_ARGS__) - -/* Defines for printing generic debug information */ -#define DPRINTF(...) _DBG_PRINTF(__VA_ARGS__) -#define DDPRINTF(...) _DEV_DBG_PRINTF(__VA_ARGS__) -#define IDPRINTF(...) _IF_DBG_PRINTF(__VA_ARGS__) - -/* Defines for printing specific debug information */ -#define DEBUG_INIT 1 -#define DEBUG_IOCTL 1 -#define DEBUG_HW 1 - -#define INIT_DEBUGOUT(...) if (DEBUG_INIT) _DBG_PRINTF(__VA_ARGS__) -#define INIT_DBG_DEV(...) if (DEBUG_INIT) _DEV_DBG_PRINTF(__VA_ARGS__) -#define INIT_DBG_IF(...) if (DEBUG_INIT) _IF_DBG_PRINTF(__VA_ARGS__) - -#define IOCTL_DEBUGOUT(...) if (DEBUG_IOCTL) _DBG_PRINTF(__VA_ARGS__) -#define IOCTL_DBG_IF2(ifp, S, ...) if (DEBUG_IOCTL) \ - if_printf(ifp, S "\n", ##__VA_ARGS__) -#define IOCTL_DBG_IF(...) if (DEBUG_IOCTL) _IF_DBG_PRINTF(__VA_ARGS__) - -#define HW_DEBUGOUT(...) if (DEBUG_HW) _DBG_PRINTF(__VA_ARGS__) - -#else /* no IXL_DEBUG */ -#define DEBUG_INIT 0 -#define DEBUG_IOCTL 0 -#define DEBUG_HW 0 - -#define DPRINTF(...) -#define DDPRINTF(...) -#define IDPRINTF(...) - -#define INIT_DEBUGOUT(...) -#define INIT_DBG_DEV(...) -#define INIT_DBG_IF(...) -#define IOCTL_DEBUGOUT(...) -#define IOCTL_DBG_IF2(...) -#define IOCTL_DBG_IF(...) -#define HW_DEBUGOUT(...) -#endif /* IXL_DEBUG */ - -enum ixl_dbg_mask { - IXL_DBG_INFO = 0x00000001, - IXL_DBG_EN_DIS = 0x00000002, - IXL_DBG_AQ = 0x00000004, - IXL_DBG_NVMUPD = 0x00000008, - - IXL_DBG_IOCTL_KNOWN = 0x00000010, - IXL_DBG_IOCTL_UNKNOWN = 0x00000020, - IXL_DBG_IOCTL_ALL = 0x00000030, - - I40E_DEBUG_RSS = 0x00000100, - - IXL_DBG_IOV = 0x00001000, - IXL_DBG_IOV_VC = 0x00002000, - - IXL_DBG_SWITCH_INFO = 0x00010000, - IXL_DBG_I2C = 0x00020000, - - IXL_DBG_ALL = 0xFFFFFFFF -}; +#define PVIDV(vendor, devid, name) \ + PVID(vendor, devid, name " - " IXL_DRIVER_VERSION_STRING) /* Tunables */ @@ -195,48 +129,27 @@ enum ixl_dbg_mask { #define IXL_AQ_LEN 256 #define IXL_AQ_LEN_MAX 1024 -/* -** Default number of entries in Tx queue buf_ring. -*/ -#define DEFAULT_TXBRSZ 4096 - /* Alignment for rings */ #define DBA_ALIGN 128 -/* - * This is the max watchdog interval, ie. the time that can - * pass between any two TX clean operations, such only happening - * when the TX hardware is functioning. - * - * XXX: Watchdog currently counts down in units of (hz) - * Set this to just (hz) if you want queues to hang under a little bit of stress - */ -#define IXL_WATCHDOG (10 * hz) - -/* - * This parameters control when the driver calls the routine to reclaim - * transmit descriptors. - */ -#define IXL_TX_CLEANUP_THRESHOLD (que->num_tx_desc / 8) -#define IXL_TX_OP_THRESHOLD (que->num_tx_desc / 32) - #define MAX_MULTICAST_ADDR 128 #define IXL_MSIX_BAR 3 #define IXL_ADM_LIMIT 2 -#define IXL_TSO_SIZE 65535 +// TODO: Find out which TSO_SIZE to use +//#define IXL_TSO_SIZE 65535 +#define IXL_TSO_SIZE ((255*1024)-1) +#define IXL_TX_BUF_SZ ((u32) 1514) #define IXL_AQ_BUF_SZ ((u32) 4096) -#define IXL_RX_HDR 128 -#define IXL_RX_LIMIT 512 #define IXL_RX_ITR 0 #define IXL_TX_ITR 1 #define IXL_ITR_NONE 3 #define IXL_QUEUE_EOL 0x7FF #define IXL_MAX_FRAME 9728 #define IXL_MAX_TX_SEGS 8 +#define IXL_MAX_RX_SEGS 5 #define IXL_MAX_TSO_SEGS 128 #define IXL_SPARSE_CHAIN 7 -#define IXL_QUEUE_HUNG 0x80000000 #define IXL_MIN_TSO_MSS 64 #define IXL_MAX_DMA_SEG_SIZE ((16 * 1024) - 1) @@ -252,7 +165,6 @@ enum ixl_dbg_mask { /* ERJ: hardware can support ~2k (SW5+) filters between all functions */ #define IXL_MAX_FILTERS 256 -#define IXL_MAX_TX_BUSY 10 #define IXL_NVM_VERSION_LO_SHIFT 0 #define IXL_NVM_VERSION_LO_MASK (0xff << IXL_NVM_VERSION_LO_SHIFT) @@ -288,12 +200,6 @@ enum ixl_dbg_mask { #define CSUM_OFFLOAD_IPV6 (CSUM_TCP_IPV6|CSUM_UDP_IPV6|CSUM_SCTP_IPV6) #define CSUM_OFFLOAD (CSUM_OFFLOAD_IPV4|CSUM_OFFLOAD_IPV6|CSUM_TSO) -/* Misc flags for ixl_vsi.flags */ -#define IXL_FLAGS_KEEP_TSO4 (1 << 0) -#define IXL_FLAGS_KEEP_TSO6 (1 << 1) -#define IXL_FLAGS_USES_MSIX (1 << 2) -#define IXL_FLAGS_IS_VF (1 << 3) - #define IXL_VF_RESET_TIMEOUT 100 #define IXL_VSI_DATA_PORT 0x01 @@ -304,6 +210,7 @@ enum ixl_dbg_mask { #define IXL_RX_CTX_BASE_UNITS 128 #define IXL_TX_CTX_BASE_UNITS 128 +#if 0 #define IXL_VPINT_LNKLSTN_REG(hw, vector, vf_num) \ I40E_VPINT_LNKLSTN(((vector) - 1) + \ (((hw)->func_caps.num_msix_vectors_vf - 1) * (vf_num))) @@ -311,6 +218,7 @@ enum ixl_dbg_mask { #define IXL_VFINT_DYN_CTLN_REG(hw, vector, vf_num) \ I40E_VFINT_DYN_CTLN(((vector) - 1) + \ (((hw)->func_caps.num_msix_vectors_vf - 1) * (vf_num))) +#endif #define IXL_PF_PCI_CIAA_VF_DEVICE_STATUS 0xAA @@ -347,15 +255,20 @@ enum ixl_dbg_mask { BIT_ULL(I40E_FILTER_PCTYPE_NONF_IPV4_TCP_SYN_NO_ACK) | \ BIT_ULL(I40E_FILTER_PCTYPE_NONF_IPV6_TCP_SYN_NO_ACK)) -#define IXL_TX_LOCK(_sc) mtx_lock(&(_sc)->mtx) -#define IXL_TX_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx) -#define IXL_TX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->mtx) -#define IXL_TX_TRYLOCK(_sc) mtx_trylock(&(_sc)->mtx) -#define IXL_TX_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->mtx, MA_OWNED) - -#define IXL_RX_LOCK(_sc) mtx_lock(&(_sc)->mtx) -#define IXL_RX_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx) -#define IXL_RX_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->mtx) +#define IXL_CAPS \ + (IFCAP_TSO4 | IFCAP_TSO6 | \ + IFCAP_TXCSUM | IFCAP_TXCSUM_IPV6 | \ + IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6 | \ + IFCAP_VLAN_HWFILTER | IFCAP_VLAN_HWTSO | \ + IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO | \ + IFCAP_VLAN_MTU | IFCAP_JUMBO_MTU | IFCAP_LRO) + +#define IXL_CSUM_TCP \ + (CSUM_IP_TCP|CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP6_TCP) +#define IXL_CSUM_UDP \ + (CSUM_IP_UDP|CSUM_IP6_UDP) +#define IXL_CSUM_SCTP \ + (CSUM_IP_SCTP|CSUM_IP6_SCTP) /* Pre-11 counter(9) compatibility */ #if __FreeBSD_version >= 1100036 @@ -386,6 +299,9 @@ enum ixl_dbg_mask { #define IXL_SET_NOPROTO(vsi, count) (vsi)->noproto = (count) #endif +#define IXL_DEV_ERR(_dev, _format, ...) \ + device_printf(_dev, "%s: " _format " (%s:%d)\n", __func__, ##__VA_ARGS__, __FILE__, __LINE__) + /* ***************************************************************************** * vendor_info_array @@ -403,22 +319,6 @@ typedef struct _ixl_vendor_info_t { unsigned int index; } ixl_vendor_info_t; - -struct ixl_tx_buf { - u32 eop_index; - struct mbuf *m_head; - bus_dmamap_t map; - bus_dma_tag_t tag; -}; - -struct ixl_rx_buf { - struct mbuf *m_head; - struct mbuf *m_pack; - struct mbuf *fmp; - bus_dmamap_t hmap; - bus_dmamap_t pmap; -}; - /* ** This struct has multiple uses, multicast ** addresses, vlans, and mac filters all use it. @@ -434,34 +334,30 @@ struct ixl_mac_filter { * The Transmit ring control struct */ struct tx_ring { - struct ixl_queue *que; - struct mtx mtx; + struct ixl_tx_queue *que; u32 tail; - struct i40e_tx_desc *base; - struct i40e_dma_mem dma; - u16 next_avail; - u16 next_to_clean; - u16 atr_rate; - u16 atr_count; - u32 itr; + struct i40e_tx_desc *tx_base; + u64 tx_paddr; u32 latency; - struct ixl_tx_buf *buffers; - volatile u16 avail; - u32 cmd; - bus_dma_tag_t tx_tag; - bus_dma_tag_t tso_tag; - char mtx_name[16]; - struct buf_ring *br; - s32 watchdog_timer; + u32 packets; + u32 me; + /* + * For reporting completed packet status + * in descriptor writeback mode + */ + qidx_t *tx_rsq; + qidx_t tx_rs_cidx; + qidx_t tx_rs_pidx; + qidx_t tx_cidx_processed; /* Used for Dynamic ITR calculation */ - u32 packets; + u32 itr; u32 bytes; /* Soft Stats */ u64 tx_bytes; - u64 no_desc; - u64 total_packets; + u64 tx_packets; + u64 mss_too_small; }; @@ -469,68 +365,46 @@ struct tx_ring { * The Receive ring control struct */ struct rx_ring { - struct ixl_queue *que; - struct mtx mtx; - union i40e_rx_desc *base; - struct i40e_dma_mem dma; - struct lro_ctrl lro; - bool lro_enabled; - bool hdr_split; + struct ixl_rx_queue *que; + union i40e_rx_desc *rx_base; + uint64_t rx_paddr; bool discard; - u32 next_refresh; - u32 next_check; u32 itr; u32 latency; - char mtx_name[16]; - struct ixl_rx_buf *buffers; u32 mbuf_sz; u32 tail; - bus_dma_tag_t htag; - bus_dma_tag_t ptag; + u32 me; /* Used for Dynamic ITR calculation */ u32 packets; u32 bytes; /* Soft stats */ - u64 split; u64 rx_packets; u64 rx_bytes; u64 desc_errs; - u64 not_done; }; /* -** Driver queue struct: this is the interrupt container -** for the associated tx and rx ring pair. +** Driver queue structs */ -struct ixl_queue { +struct ixl_tx_queue { struct ixl_vsi *vsi; - u32 me; - u32 msix; /* This queue's MSIX vector */ - u32 eims; /* This queue's EIMS bit */ - struct resource *res; - void *tag; - int num_tx_desc; /* both tx and rx */ - int num_rx_desc; /* both tx and rx */ -#ifdef DEV_NETMAP - int num_desc; /* for compatibility with current netmap code in kernel */ -#endif struct tx_ring txr; - struct rx_ring rxr; - struct task task; - struct task tx_task; - struct taskqueue *tq; - - /* Queue stats */ + struct if_irq que_irq; + u32 msix; + /* Stats */ u64 irqs; u64 tso; - u64 mbuf_defrag_failed; - u64 mbuf_hdr_failed; - u64 mbuf_pkt_failed; - u64 tx_dmamap_failed; - u64 dropped_pkts; - u64 mss_too_small; +}; + +struct ixl_rx_queue { + struct ixl_vsi *vsi; + struct rx_ring rxr; + struct if_irq que_irq; + u32 msix; /* This queue's MSIX vector */ + /* Stats */ + u64 irqs; }; /* @@ -538,29 +412,35 @@ struct ixl_queue { */ SLIST_HEAD(ixl_ftl_head, ixl_mac_filter); struct ixl_vsi { - void *back; + if_ctx_t ctx; + if_softc_ctx_t shared; struct ifnet *ifp; - device_t dev; + //device_t dev; struct i40e_hw *hw; - struct ifmedia media; + struct ifmedia *media; +#define num_rx_queues shared->isc_nrxqsets +#define num_tx_queues shared->isc_ntxqsets + + void *back; enum i40e_vsi_type type; + // TODO: Remove? + u64 que_mask; int id; - u16 num_queues; - int num_tx_desc; - int num_rx_desc; u32 rx_itr_setting; u32 tx_itr_setting; - u16 max_frame_size; bool enable_head_writeback; - struct ixl_queue *queues; /* head of queues */ - u16 vsi_num; bool link_active; u16 seid; u16 uplink_seid; u16 downlink_seid; + struct ixl_tx_queue *tx_queues; /* TX queue array */ + struct ixl_rx_queue *rx_queues; /* RX queue array */ + struct if_irq irq; + u32 link_speed; + /* MAC/VLAN Filter list */ struct ixl_ftl_head ftl; u16 num_macs; @@ -568,8 +448,6 @@ struct ixl_vsi { /* Contains readylist & stat counter id */ struct i40e_aqc_vsi_properties_data info; - eventhandler_tag vlan_attach; - eventhandler_tag vlan_detach; u16 num_vlans; /* Per-VSI stats from hardware */ @@ -595,37 +473,27 @@ struct ixl_vsi { /* Misc. */ u64 flags; + /* Stats sysctls for this VSI */ struct sysctl_oid *vsi_node; }; /* -** Find the number of unrefreshed RX descriptors -*/ -static inline u16 -ixl_rx_unrefreshed(struct ixl_queue *que) -{ - struct rx_ring *rxr = &que->rxr; - - if (rxr->next_check > rxr->next_refresh) - return (rxr->next_check - rxr->next_refresh - 1); - else - return ((que->num_rx_desc + rxr->next_check) - - rxr->next_refresh - 1); -} - -/* -** Find the next available unused filter +** Creates new filter with given MAC address and VLAN ID */ static inline struct ixl_mac_filter * -ixl_get_filter(struct ixl_vsi *vsi) +ixl_new_filter(struct ixl_vsi *vsi, const u8 *macaddr, s16 vlan) { struct ixl_mac_filter *f; /* create a new empty filter */ f = malloc(sizeof(struct ixl_mac_filter), M_DEVBUF, M_NOWAIT | M_ZERO); - if (f) + if (f) { SLIST_INSERT_HEAD(&vsi->ftl, f, next); + bcopy(macaddr, f->macaddr, ETHER_ADDR_LEN); + f->vlan = vlan; + f->flags |= (IXL_FILTER_ADD | IXL_FILTER_USED); + } return (f); } @@ -636,14 +504,7 @@ ixl_get_filter(struct ixl_vsi *vsi) 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); + return (bcmp(ea1, ea2, 6) == 0); } /* @@ -679,34 +540,11 @@ struct ixl_sysctl_info { extern const uint8_t ixl_bcast_addr[ETHER_ADDR_LEN]; -/********************************************************************* - * TXRX Function prototypes - *********************************************************************/ -int ixl_allocate_tx_data(struct ixl_queue *); -int ixl_allocate_rx_data(struct ixl_queue *); -void ixl_init_tx_ring(struct ixl_queue *); -int ixl_init_rx_ring(struct ixl_queue *); -bool ixl_rxeof(struct ixl_queue *, int); -bool ixl_txeof(struct ixl_queue *); -void ixl_free_que_tx(struct ixl_queue *); -void ixl_free_que_rx(struct ixl_queue *); - -int ixl_mq_start(struct ifnet *, struct mbuf *); -int ixl_mq_start_locked(struct ifnet *, struct tx_ring *); -void ixl_deferred_mq_start(void *, int); - -void ixl_vsi_setup_rings_size(struct ixl_vsi *, int, int); -int ixl_queue_hang_check(struct ixl_vsi *); -void ixl_free_vsi(struct ixl_vsi *); -void ixl_qflush(struct ifnet *); - /* Common function prototypes between PF/VF driver */ -#if __FreeBSD_version >= 1100000 -uint64_t ixl_get_counter(if_t ifp, ift_counter cnt); -#endif -void ixl_get_default_rss_key(u32 *); +void ixl_init_tx_ring(struct ixl_vsi *vsi, struct ixl_tx_queue *que); +void ixl_set_queue_rx_itr(struct ixl_rx_queue *que); +void ixl_get_default_rss_key(u32 *); const char * i40e_vc_stat_str(struct i40e_hw *hw, enum virtchnl_status_code stat_err); -void ixl_set_busmaster(device_t); -void ixl_set_msix_enable(device_t); +u64 ixl_max_aq_speed_to_value(u8); #endif /* _IXL_H_ */ |